文章目录[隐藏]
前文:
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() 函数把字符转换为 HTML 实体。
新建Xss_htmlentities.php文件,插入以下代码:
<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 >
打开页面,输入
<script>alert('xss') </script>
可以看到页面并没有弹窗。
查看网页html代码,可以看到htmlentities()函数对用户输入的<>做了转义处理,恶意代码当然也就没法执行了。
存储型XSS对用户的输入进行过滤的方式和反射型XSS相同,这里我们使用htmlspecialchars()函数进行演示:
htmlentities ( ) :把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体
htmlspecialchars和 htmlentities的区别:
htmlspecialchars 只转义 & ; 、 " 、' 、< 、> 这几个html代码,
而 htmlentities 却会转化所有的html代码,连同里面的它无法识别的中文字符也会转化。
新建Xss_htmlspecialchars.php文件,并插入以下代码
<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中输入
<script>alert('xss') </script>
可以看到页面并没有弹窗。查看网页html代码,可以看到htmlspecialchars()函数对用户输入的<>做了转义处理。
行云博客 - 免责申明 本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我联系处理。敬请谅解!
本文链接:https://www.xy586.top/772.html
转载请注明文章来源:行云博客 » 浅谈xss——跨站脚本攻击(四)