我正在从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;”)。
有人能帮助我理解并解决问题吗?感谢。
答案 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中发出警告。