我正在学习PHPhttp://www.w3schools.com.在部分中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/合唱地址栏中输入localhost/20160108.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
时,我得到:
/20160108.php/">
当我输入localhost/20160108.php/%22%3Escript%3Ealert('hacked')%3C/script%3E
时,我得到:
/20160108.php/">script>警报(‘已锁定’)
PHP_SELF似乎不接受%3C
之后的子字符串(即"<")。
有人能帮我理解并解决这个问题吗?谢谢
当我进入localhost/2016108.php/%22%3E%3Script%3Alert('hacked')%3C/script%3E在Safari/合唱地址栏中,我得到:
/20160108.php/">
当我进入localhost/2016108.php/%22%3Script%3Alert('hacked')%3C/script%3E,I获取:
/20160108.php/">script>alert('hacked')
PHP_SELF似乎不接受%3C之后的子字符串(即。"<")。
PHP_SELF确实接受。请注意您的第二个url
localhost/20160108.php/%22%3Escript%3Ealert('hacked')%3C/script%3E
在%3E(">")
之后没有%3C("<")
我想你期待的是/20160108.php/"><script>alert('hacked')</script>
,所以你可以试试这个url
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中引起警报,但在谷歌chrome中不会。
"page"是用HTML编写的,所以<
的意思是"启动一个标签"。您必须使用实体在HTML中表示具有特殊含义的字符。htmlspecialchars函数应该可以执行您想要的操作:
<?php
echo htmlspecialchars($_SERVER["PHP_SELF"]), "<br>";
?>