Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 远程地址是否可能为空?_Php_Networking_Webserver - Fatal编程技术网

Php 远程地址是否可能为空?

Php 远程地址是否可能为空?,php,networking,webserver,Php,Networking,Webserver,据我所知,web服务器(Apache/Nginx)根据请求用户代理的声明位置提供($\u SERVER['REMOTE\u ADDR'])。我知道他们可能在撒谎,但这个值可能是空的吗?网络接口或Web服务器是否会在没有正确格式的IP的情况下接受请求 嗯,它是保留的,但可以写。我见过写得很糟糕的应用程序在超全局上乱涂乱画——脚本会覆盖它吗,例如使用$\u SERVER['REMOTE\u ADDR']='' 除此之外,即使请求被代理,也应该有代理的地址-可能是某种内部重写模块弄乱了它(mod_re

据我所知,web服务器(Apache/Nginx)根据请求用户代理的声明位置提供(
$\u SERVER['REMOTE\u ADDR']
)。我知道他们可能在撒谎,但这个值可能是空的吗?网络接口或Web服务器是否会在没有正确格式的IP的情况下接受请求


嗯,它是保留的,但可以写。我见过写得很糟糕的应用程序在超全局上乱涂乱画——脚本会覆盖它吗,例如使用
$\u SERVER['REMOTE\u ADDR']=''


除此之外,即使请求被代理,也应该有代理的地址-可能是某种内部重写模块弄乱了它(
mod_rewrite
允许内部重定向,不确定它是否会影响这一点)?

理论上是可能的,这取决于http服务器或至少是相应的PHP SAPI

实际上,除了CLI SAPI之外,我从未遇到过这种情况

编辑:对于Apache,这似乎总是设置好的,因为
ap\u add\u common\u vars
总是将它添加到最终由Apache模块PHP SAPI读取的表中(免责声明:我对Apache内部结构的了解非常有限)

如果在CGI环境中使用PHP,RFC 3875中的规范似乎保证了该变量的存在:

4.1.8. REMOTE_ADDR The REMOTE_ADDR variable MUST be set to the network address of the client sending the request to the server. 4.1.8. 远程地址 远程_ADDR变量必须设置为服务器的网络地址 将请求发送到服务器的客户端。
它不应该是空的,并且没有任何东西不能连接到您的web服务。无论连接什么,都必须有一个IP地址来发送和接收数据。IP地址是否可信是另一回事。

是。我目前在Nginx后面的Apache日志中看到“unknown”的值,这些值看起来像是日志中的正常请求/响应序列。我相信这是可能的,因为
mod\u extract\u forwarded
正在修改基于
X-forwarded-For
标题中的数据重置远程地址的请求。因此,原始的
REMOTE\u ADDR
值可能是有效的,但作为通过反向代理和Apache的一部分,
REMOTE\u ADDR
在到达应用程序时似乎无效

如果您已经安装了Perl的
libwww Perl
,您可以像这样测试这种情况(将example.com更改为您自己的域或应用程序):

HEAD-H'X-Forwarded-For:'-sSehttp://www.example.com/
HEAD-H'X-FORWARD-For:HIMOM'-sSehttp://www.example.com/
标题-H'X-For:'-sSehttp://www.example.com/
(您还可以使用任何其他工具,通过自定义请求头手工处理HTTP请求。)


现在,检查访问日志以查看它们记录了哪些值,并检查应用程序以查看它们如何处理错误输入`

你不能谎称你想把数据送回哪里。。。TCP需要知道您的IP才能向您发送数据包,因此,在他们发送HTTP请求之前,TCP连接必须已向IP发送SYN/ACK,以便创建连接……您完全可以谎称希望将数据发送回何处。这就是某些形式的DoS攻击的问题。@Xeoncross:带有源欺骗的DoS攻击不会达到Apache的程度-网络堆栈会在连接处于半开放状态时卡住(因为没有
ACK
,无法可靠地生成
SYN/ACK
)-这甚至是许多DoS欺骗攻击的要点:在某些系统上,半开放连接的表过去很小,一旦填满,他们就不再接受。无论如何,即使您设法用伪造的源地址打开TCP连接,您所看到的都是不同的远程地址,而不是空的。@EJP:No,
REMOTE\u ADDR
(和
REMOTE\u PORT
)是由本地web服务器根据连接套接字的远程地址提供的,它不是来自HTTP头。你可能会想到
$\u服务器['HTTP\u X\u FORWARDED\u']
。我看到
远程地址出现在
“unknown”
。但我从未遇到过这种情况(据我所知),如果可能的话,我想确保我编写的代码能够处理空值。@Xeoncross:我想说这是无效程序状态的某种指示,并暗示可能进一步的状态损坏。不过,在野外不太可能遇到这种情况。这也是我的理论,因为CLI SAPI不是由Web服务器处理的,所以可能没有填充该值。但是,我想确保Apache/Nginx或网络始终为IP传递一个值,或者干脆放弃请求。@Xeon那么这个问题是关于Apache的,而不是关于PHP的,您应该这样标记它。我想无论您使用的是CGI还是apache模块都会有所不同。实际上,我不使用apache,我使用的是Nginx。此外,如问题中所述,如果阻止使用空远程地址调用PHP,我对网络接口、Web服务器或阻止请求的任何其他东西都持开放态度。这很可怕:用用户提供的(
X-FORWARDED-FOR
)替换规范信息(
REMOTE\u-ADDR
)。不过,您的分析听起来是正确的:“unknown”是一个词,nginx可能只是根据它的名称将其从列表中删除。
HEAD -H 'X-Forwarded-For: ' -sSe http://www.example.com/
HEAD -H 'X-Forwarded-For: HIMOM' -sSe http://www.example.com/
HEAD -H 'X-Forwarded-For: <iframe src=http://example.com>' -sSe http://www.example.com/