先转载W3SCHOOL关于这一段的描述
表单的一段HTML代码如下:
<form method = "post" action = "<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
当提交此表单时,通过method="post"发送表单数据。
什么是$_SERVER["PHP_SELF"]变量?
$_SERVER["PHP_SELF"]是一种超全局变量,它返回当前执行脚本的文件名。
因此,$_SERVER["PHP_SELF"]将表单数据发送到页面本身,而不是跳转到另一张页面。这样,用户就能够在表单页面获得错误提示信息。
什么是htmlspecialchars()函数?
htmlspecialchars()函数把特殊字符转换为HTML实体。这意味着<和>之类的HTML字符会被替换为<和>。这样可防止攻击者通过在表单中注入HTML或JavaScript代码(跨站点脚本攻击)对代码进行利用。
关于PHP表单安全性的重要提示
$_SERVER["PHP_SELF"]变量能够被黑客利用!
如果您的页面使用了PHP_SELF,用户能够输入下划线然后执行跨站点脚本(XSS)。
提示:跨站点脚本(Cross-site scripting,XSS)是一种计算机安全漏洞类型,常见于Web应用程序。XSS能够使攻击者向其他用户浏览的网页中输入客户端脚本。
PS:原本缩写应为CSS,与层叠样式表CSS缩写重名后才叫XSS,汗!
再PS:XSS攻击分为两种:非持久型攻击(Non-persistent XSS)和持久型攻击(Persistent XSS),非持久型攻击是一次性的,仅对当次的页面访问产生影响。而持久型攻击会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。
假设我们的一张名为“test_form.php”的页面中有如下表单:
<form method = "post" action = "<?php echo $_SERVER["PHP_SELF"];?>">
现在,如果用户进入的是地址栏中正常的URL:"http://www.example.com/test_form.php",上面的代码会转换为:
<form method = "post" action = "test_form.php"/>
到目前,一切正常。
不过,如果用户在地址栏中键入了如下URL:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
在这种情况下,上面的代码会转换为:
<form method="post" action="test_form.php"/><script>alert('hacked')</script>
这段代码加入了一段脚本和一个提示命令。并且当此页面加载后,就会执行JavaScript代码(用户会看到一个提示框)。这仅仅是一个关于PHP_SELF变量如何被利用的简单无害案例。
您应该意识到<script>标签内能够添加任何JavaScript代码!黑客能够把用户重定向到另一台服务器上的某个文件,该文件中的恶意代码能够更改全局变量或将表单提交到其他地址以保存用户数据,等等。
如何避免$_SERVER["PHP_SELF"]被利用?
通过使用htmlspecialchars()函数能够避免$_SERVER["PHP_SELF"]被利用。
表单代码是这样的:
<form method = "post" action = "<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars()函数把特殊字符转换为HTML实体。现在,如果用户试图利用PHP_SELF变量,会导致如下输出:
<form method = "post" action = "test_form.php/"><script>alert('hacked')</script>">
无法利用,没有危害!
通过PHP验证表单数据
我们要做的第一件事是通过PHP的htmlspecialchars()函数传递所有变量。
在我们使用htmlspecialchars()函数后,如果用户试图在文本字段中提交以下内容:
<script>location.href('http://www.hacked.com')</script>
代码不会执行,因为会被保存为转义代码,就像这样:
<script>location.href('http://www.hacked.com')</script>
现在这条代码显示在页面上或e-mail中是安全的。
在用户提交该表单时,我们还要做两件事:
1.(通过PHP trim()函数)去除用户输入数据中不必要的字符(多余的空格、制表符、换行)
2.(通过PHP stripslashes()函数)删除用户输入数据中的反斜杠(\)
实际编程测试发现浏览器并无反应,后来发现是因为Chrome浏览器会自动拦截简单的XSS脚本,并在console中给出错误提示,在IE8下测试后部分正常,有些似乎也会弹出提醒框提示发现XSS行为,没有做更进一步测试。