针对 XSS 漏洞进行保护
XSS 漏洞代表 2007 年所有归档的 Web 站点的大部分漏洞(请参阅参考资料)。当用户能够把 HTML 代码注入到您的 Web 页面中时,就是出现了 XSS 漏洞。HTML 代码可以在脚本标记中携带 JavaScript 代码,因而只要提取页面就允许运行 JavaScript。清单 9 中的表单可以表示论坛、维基、社会网络或任何可以输入文本的其他站点。
清单 9. 输入文本的表单
以下为引用的内容: <html> <head> <title>Your chance to input XSS</title> </head> <body> <form id="myFrom" action="showResults.php" method="post"> <div><textarea name="myText" rows="4" cols="30"></textarea><br /> <input type="submit" value="Delete" name="submit" /></div> </form> </body> </html> |
清单 10 演示了允许 XSS 攻击的表单如何输出结果。
清单 10. showResults.php
以下为引用的内容: <html> <head> <title>Results demonstrating XSS</title> </head> <body> <?php echo("<p>You typed this:</p>"); echo("<p>"); echo($_POST['myText']); echo("</p>"); ?> </body> </html> |
清单 11 提供了一个基本示例,在该示例中将弹出一个新窗口并打开 Google 的主页。如果您的 Web 应用程序不针对 XSS 攻击进行保护,则会造成严重的破坏。例如,某个人可以添加模仿站点样式的链接以达到欺骗(phishing)目的(请参阅参考资料)。
清单 11. 恶意输入文本样例
<script type="text/javascript">myRef = window.open('http://www.google.com','mywin','left=20,top=20,width=500,height=500,toolbar=1,resizable=0');</script>
要防止受到 XSS 攻击,只要变量的值将被打印到输出中,就需要通过htmlentities()函数过滤输入。记住要遵循第一个习惯:在 Web 应用程序的名称、电子邮件地址、电话号码和帐单信息的输入中用白名单中的值验证输入数据。
下面显示了更安全的显示文本输入的页面。
清单 12. 更安全的表单
以下为引用的内容: <html> <head> <title>Results demonstrating XSS</title> </head> <body> <?php echo("<p>You typed this:</p>"); echo("<p>"); echo(htmlentities($_POST['myText'])); echo("</p>"); ?> </body> </html> |