草庐IT

php - 如何在不需要身份验证时从 URL 检索尝试的 $_SERVER ['REMOTE_USER' ]

coder 2023-12-30 原文

通常,当一个可公开访问的目录需要基本的 HTTP 身份验证时,$_SERVER['HTTP_AUTHORIZATION'] 和/或 $_SERVER['REMOTE_USER'] 的值(或 $_SERVER['PHP_AUTH_USER'] 等)将在向服务器提供有效的用户名/密码组合后设置并可供 PHP 访问。

例如,如果 http://www.example.com/members 需要基本身份验证,并且用户使用凭据 myusernamemypassword 成功进行了身份验证 通过在浏览器中手动输入 http://myusername:mypassword@www.example.com/members$_SERVER['HTTP_AUTHORIZATION'] 的值会是这样的:

Basic bXl1c2VybmFtZTpteXBhc3N3b3Jk

... $_SERVER['REMOTE_USER'] 的值将简单地为:

myusername

但是,如果在同一目录中不需要身份验证,但仍然使用其中的用户名/密码访问 URL,则用户名/密码的值似乎没有在任何地方设置(运行 PHP 5.3.10作为 Apache/2.2.22 上的 CGI/FastCGI)。

在 PHP 中(和/或 .htaccess,如果需要),当不需要身份验证时,有没有办法检索用户名的值(和/或密码)是由访问者手动将其添加到 URL 中提供的?

最佳答案

TLDR;据我所知,信息从未发送到服务器,所以我声称这是不可能的。

如果您设置了 http 身份验证的工作方式是服务器发送用户/密码请求(如果尚未设置),然后浏览器将该信息以编码形式添加到 Authorization header 中,并且将其与请求一起发送到服务器。

如 RFC 2617 中所述,描述了基本和摘要身份验证机制 对于基本身份验证,服务器发送 HTTP 401 Not Authorized 状态和 WWW-Authenticate header 字段来请求此信息. ( RFC 2617, Access Authentication Framework )

通过测试可以看出,如果从未在服务器上配置要求的身份验证,服务器将不会从浏览器请求身份验证信息,浏览器也不会将用户/密码信息添加到请求中。 RFC 不强制浏览器(用户代理)不传递该信息,而是说

A user agent that wishes to authenticate itself with an origin server--usually, but not necessarily, after receiving a 401 (Unauthorized)--MAY do so by including an Authorization header field with the request.

实际上,如果您查看发送的 header ,您会发现如果服务器请求此信息,它会使用 RFC 指定的 Authorization header 以编码形式发送。但是,如果您没有使用任何身份验证,您发送的请求似乎不包含任何形式的信息。我自己已经用 IE、Firefox 和 Chrome 浏览器证实了这一点。


如果您想自己测试您的设置,可以使用 netcat 来完成,例如:

首先,在您的服务器上运行 netcat:

nc -l 8888

然后从您的浏览器发出请求到http://testvalue:testvalue@yourdomain:8888/

因此,从 netcat 输出中观察到发送到服务器的所有信息,如下所示:

GET / HTTP/1.1
Host: yourdomain:8888
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

任何地方都没有关于用户或密码的信息。我声称除非服务器请求它,否则它不会在那里。

关于php - 如何在不需要身份验证时从 URL 检索尝试的 $_SERVER ['REMOTE_USER' ],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31737248/

有关php - 如何在不需要身份验证时从 URL 检索尝试的 $_SERVER ['REMOTE_USER' ]的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  3. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  4. ruby - 在 Ruby 中实现 `call_user_func_array` - 2

    我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  7. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  8. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  9. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  10. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

随机推荐