PHP_SELF不接受字符“<”之后的字符串

时间:2016-01-12 04:01:52

标签: php

我正在从http://www.w3schools.com学习PHP。在http://www.w3schools.com/php/php_form_validation.asp部分中,它提到了PHP_SELF的安全风险,并举了一个示例http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

但是,当我在我的测试环境(Mac OS X Yosemite上的XAMPP)中尝试此示例时,我看不到弹出的脚本框。然后,我尝试打印/回显PHP_SELF的内容,看到“<”之后的字符串很奇怪被忽略了。

我的测试脚本如下:

<?php
    echo $_SERVER["PHP_SELF"], "<br>";
?>

当我在Safari / Chorme地址栏中输入localhost/20160108.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E时,我得到:

  

/20160108.php /“&GT;

当我输入localhost/20160108.php/%22%3Escript%3Ealert('hacked')%3C/script%3E时,我得到:

  

/20160108.php /“&GT;脚本&GT;警报( '黑客')

似乎PHP_SELF不接受%3C之后的子字符串(即“&lt;”)。

有人能帮助我理解并解决问题吗?感谢。

2 个答案:

答案 0 :(得分:0)

A&#34; page&#34;是用HTML编写的,因此<表示&#34;启动标记&#34;。您必须使用entities在HTML中表示具有特殊含义的字符。 htmlspecialchars函数应该执行您想要的操作:

<?php
    echo htmlspecialchars($_SERVER["PHP_SELF"]), "<br>";
?>

答案 1 :(得分:0)

  

当我进入   本地主机/ 20160108.php /%22%3E%3Cscript%3Ealert( '黑客')%3C /脚本%3E   在Safari / Chorme地址栏中,我得到:

/20160108.php/">
  

当我进入   localhost / 20160108.php /%22%3Escript%3Ealert('hacked')%3C / script%3E,I   得到:

/20160108.php/">script>alert('hacked')
  

似乎PHP_SELF不接受%3C之后的子字符串(即   “&LT;”。)

PHP_SELF确实接受了它。请注意您的第二个网址

localhost/20160108.php/%22%3Escript%3Ealert('hacked')%3C/script%3E

%3C("<")

之后没有%3E(">")

我觉得你期待/20160108.php/"><script>alert('hacked')</script>,所以你可以试试这个网址

localhost/20160108.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

我做了一个简单的测试,PHP_SELF确实接受了它

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

</form>
<?php 
    echo $_SERVER["PHP_SELF"];
?>
</body>
</html>

使用localhost/20160108.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E浏览文件会在mozilla firefox中引发警报,但不会在Google Chrome中发出警告。