浅谈xss——跨站脚本攻击(四)

文章目录[隐藏]

前文:

讲了这么多攻击方式,这次讲一讲防范方法

反射型xss漏洞防范

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
A.PHP直接输出html的,可以采用以下的方法进行过滤:

1.htmlspecialchars函数
2.htmlentities函数
3.HTMLPurifier.auto.php插件
4.RemoveXss函数

B.PHP输出到JS代码中,或者开发Json API的,则需要前端在JS中进行过滤:

1.尽量使用innerText(IE)和textContent(Firefox),也就是jQuery的text()来输出文本内容
2.必须要用innerHTML等等函数,则需要做类似php的htmlspecialchars的过滤

C.其它的通用的补充性防御手段

1.在输出html时,加上Content Security Policy的Http Header
(作用:可以防止页面被XSS攻击时,嵌入第三方的脚本文件等)
(缺陷:IE或低版本的浏览器可能不支持)
2.在设置Cookie时,加上HttpOnly参数
(作用:可以防止页面被XSS攻击时,Cookie信息被盗取,可兼容至IE6)
(缺陷:网站本身的JS代码也无法操作Cookie,而且作用有限,只能保证Cookie的安全)
3.在开发API时,检验请求的Referer参数
(作用:可以在一定程度上防止CSRF攻击)
(缺陷:IE或低版本的浏览器中,Referer参数可以被伪造)

这里我们选用htmlentities()函数进行测试:

htmlentities() 函数把字符转换为 HTML 实体。

新建Xss_htmlentities.php文件,插入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>XSS</title>
</head>
<body>
<form action="" method="get">
<input type="text" name="input">    
<input type="submit">
</form>
<br>
<?php
$XssReflex = $_GET['input'];
echo 'output:<br>'.htmlentities($XssReflex);#仅在这里对变量 $XssReflex 做了处理.
?>
</body>
</html>

打开页面,输入

1
<script>alert('xss')</script>

浅谈xss——跨站脚本攻击(四)

可以看到页面并没有弹窗。

查看网页html代码,可以看到htmlentities()函数对用户输入的<>做了转义处理,恶意代码当然也就没法执行了。

存储型xss漏洞防范

存储型XSS对用户的输入进行过滤的方式和反射型XSS相同,这里我们使用htmlspecialchars()函数进行演示:

1
2
3
4
htmlentities() :把预定义的字符 "&lt;" (小于)和 "&gt;" (大于)转换为 HTML 实体
htmlspecialcharshtmlentities的区别:
htmlspecialchars 只转义 &amp;" 、' 、&lt; 、&gt; 这几个html代码,
而 htmlentities 却会转化所有的html代码,连同里面的它无法识别的中文字符也会转化。

新建Xss_htmlspecialchars.php文件,并插入以下代码

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
31
32
33
34
35
36
37
<span style="font-size:18px;"><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>  
<html>  
<head>  
<title>XssStorage</title>  
</head>  
<body>  
<h2>Message Board<h2>  
<br>
<form action="Xss_htmlspecialchars.php" method="post">  
Message:<textarea id='Mid' name="desc"></textarea>  
<br>  
<br>  
Subuser:<input type="text" name="user"/><br>
<br>
<input type="submit" value="submit" onclick='loction="XssStorage.php"'/>  
</form>  
<?php  
if(isset($_POST['user'])&&isset($_POST['desc'])){  
$log=fopen("sqlStorage.txt","a");  
fwrite($log,htmlspecialchars($_POST['user'])."\r\n"); # 在此对用户输入数据$_POST['user']进行过滤
fwrite($log,htmlspecialchars($_POST['desc'])."\r\n"); # 在此对用户输入数据$_POST['desc']进行过滤
fclose($log);  
}  
   
if(file_exists("sqlStorage.txt"))  
{  
$read= fopen("sqlStorage.txt",'r');  
while(!feof($read))  
{  
echo fgets($read)."</br>";  
}  
fclose($read);  
}  
?>  
</body>  
</html>
</span>

打开页面,在Message中输入

1
<script>alert('xss')</script>

浅谈xss——跨站脚本攻击(四)

可以看到页面并没有弹窗。查看网页html代码,可以看到htmlspecialchars()函数对用户输入的<>做了转义处理。


行云博客 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我([email protected])联系处理。敬请谅解!

喜欢 (2)
[行云博客]
浅谈xss——跨站脚本攻击(四)
分享 (0)