Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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
将变量与$#u SERVER[';PHP#u SELF';]进行比较是否安全使用?_Php - Fatal编程技术网

将变量与$#u SERVER[';PHP#u SELF';]进行比较是否安全使用?

将变量与$#u SERVER[';PHP#u SELF';]进行比较是否安全使用?,php,Php,我仍然是PHP的新手,所以如果这个问题看起来很愚蠢,请原谅,但我想知道这是否是安全使用$\u服务器['PHP\u SELF'] 从我读到的关于它有什么问题(容易注射),我想知道比较它是否安全 例如,我希望PHP/CSS样式表根据用户所在的页面而改变,因此在PHP/CSS中,它将有一个if语句检查$\u服务器['PHP\u SELF'],以查看他们访问的页面是否需要不同的样式表 例如: if ($_SERVER['PHP_SELF'] === $thisPage) { } 恶意代码会以这种方式影

我仍然是PHP的新手,所以如果这个问题看起来很愚蠢,请原谅,但我想知道这是否是安全使用
$\u服务器['PHP\u SELF']

从我读到的关于它有什么问题(容易注射),我想知道比较它是否安全

例如,我希望PHP/CSS样式表根据用户所在的页面而改变,因此在PHP/CSS中,它将有一个
if
语句检查
$\u服务器['PHP\u SELF']
,以查看他们访问的页面是否需要不同的样式表

例如:

if ($_SERVER['PHP_SELF'] === $thisPage) { }

恶意代码会以这种方式影响我吗?我可以简单地验证/清理它,然后使用它吗?

更好的代码示例是:

if ($_SERVER['SCRIPT_NAME'] === $thisPage) { }
不过,这取决于$thisPage的内容。如果$thisPage也包含
$\u SERVER['PHP\u SELF']
,则应将其更改为
$\u SERVER['SCRIPT\u NAME']


如果您确实无法使用诸如
\uuu FILE\uuu
$\u SERVER['SCRIPT\u NAME']
之类的替代方案,并确保您了解所涉及的检查,则可以

例如,此URL:
http://example.com/sick.php/mwuahahahaha
给出了:

/sick.php/mwuahahahaha
比较是允许的,对于像CSS这样的非关键的东西

如果不需要获取请求的路径(无URL重写),请使用
$\u SERVER['SCRIPT\u NAME']
。 如果您确实需要
$\u服务器['PHP\u SELF']
(重写的URL),请在输出时转义它们(使用)

变量概述:

  • \uuuu FILE\uuuu
    :包含活动脚本的完整文件系统路径。例如:


    请求test.php会给出如下内容:
    /var/www/file.php
    (而不是
    /var/www/test.php
  • $\u服务器['SCRIPT\u FILENAME']
    :包含请求脚本的文件系统路径,例如
    /var/www/test.php
  • $\u服务器['SCRIPT\u NAME']
    :包含所请求脚本的路径(与文件系统类似,但文档根被剥离),例如
    /test.php
    (即使使用重写的URL)
  • $\u服务器['PHP\u SELF']
    :包含已翻译的路径(
    /
    ->
    /
    已解析),但包含其他路径信息
  • $\u SERVER['REQUEST\u URI']
    :最糟糕的是,它在请求中包含原始字符串,如中所示。
    GET[REQUEST\u URI]HTTP/1.0
    (转义)空字节在这里仍然可见。这只是
    GET
    (或您使用的任何方法)和
    HTTP/1.0
    (或您使用的任何HTTP版本)之间的原始数据
这些变量的比较:

我使用
nc
执行了此测试,但是
telnet
也应该足够了。服务器来自。请求的文件是
test.php
,其中包含:

<?php
$properties = array('SCRIPT_FILENAME', 'SCRIPT_NAME', 'PHP_SELF', 'REQUEST_URI');
printf("% 15s: %s\n", '__FILE__', __FILE__);
foreach($properties as $property){
     printf('% 15s: %s', $property, $_SERVER[$property]."\n");
}
?>
使用
重写规则^page/test test.php

$ nc localhost 80
GET ///somedir/./../page//.////test/somedata%20here?q%00=%25 HTTP/1.0

HTTP/1.1 200 OK
Server: Apache/2.2.14 (Unix)
[stripped]

       __FILE__: /opt/lampp/htdocs/test.php
SCRIPT_FILENAME: /opt/lampp/htdocs/test.php
    SCRIPT_NAME: /test.php
       PHP_SELF: /test.php
    REQUEST_URI: ///somedir/./../page//.////test/somedata%20here?q%00=%25

结论:在大多数情况下使用的最安全变量是
$\u SERVER['SCRIPT\u NAME']
是的,答案简单明了:
如果直接调用您的文件,如
http://www.example.com/news.php
,您的代码没有问题。

没有恶意代码会以这种方式影响您的网站。

+1据我所知,这是误用PHP_SELF的唯一可能的方式。在某些情况下,如果用作表单或其他内容的基本URL,它可能会产生问题,但在类似OP所示的比较中使用是安全的。我相信您弄错了。$\u SERVER['PHP_SELF']始终包含运行脚本的路径。您正在考虑请求URI。我刚刚再次测试了它:
http://localhost/xampp/phpinfo.php/whatDidYouSay?%25
给出:
\u服务器[“PHP\u SELF”]/xampp/phpinfo.php/whatDidYouSay
。请求URI更糟糕:
/xampp/phpinfo.php/whatDidYouSay?%25
。这个“功能”被称为可能是xampp的东西。你可以在这里看到一个活生生的例子:
[php\u SELF]=>/app/webroot/index.php
。你在用重写的URL作弊。
$ nc localhost 80
GET ///somedir/./../page//.////test/somedata%20here?q%00=%25 HTTP/1.0

HTTP/1.1 200 OK
Server: Apache/2.2.14 (Unix)
[stripped]

       __FILE__: /opt/lampp/htdocs/test.php
SCRIPT_FILENAME: /opt/lampp/htdocs/test.php
    SCRIPT_NAME: /test.php
       PHP_SELF: /test.php
    REQUEST_URI: ///somedir/./../page//.////test/somedata%20here?q%00=%25