XSS攻击和简单的防御

一、什么是XSS?

百度百科的解释: XSS又叫CSS  (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。

二、分类

反射型:经过后端,不经过数据库
存储型:经过后端,经过数据库
DOM:不经过后端,DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞,dom - xss是通过url传入参数去控制触发的。

三、原理
  1. \\XSS反射演示  
  2. <form action="" method="get">  
  3.     <input type="text" name="xss"/>  
  4.     <input type="submit" value="test"/>  
  5. </form>  
  6. <?php  
  7. $xss = @$_GET['xss'];  
  8. if($xss!==null){  
  9.     echo $xss;  
  10. }

在这段代码里面:当xss 的input框不为空的时候,将输出input里面的值;假如里面输入的为:<script>alert('JS被执行')</script>,时,浏览器会将执行这段js代码,弹出弹框,提示“JS被执行”;要是用调试器查看元素,会发现这段代码被执行写入到了浏览器中,可以自己执行查看结果

反射型 XSS 的数据流向是:浏览器 -> 后端 -> 浏览器



  1. \\存储XSS演示  
  2. <form action="" method="post">  
  3.     <input type="text" name="xss"/>  
  4.     <input type="submit" value="test"/>  
  5. </form>  
  6. <?php  
  7. $xss=@$_POST['xss'];  
  8. mysql_connect("localhost","root","123");  
  9. mysql_select_db("xss");  
  10. if($xss!==null){  
  11.     $sql="insert into temp(id,payload) values('1','$xss')";  
  12.     $result=mysql_query($sql);  
  13.     echo $result;  
  14. }  

用户输入的内容还是没有过滤,但是不直接显示在页面中,而是插入到了数据库。所以当查询数据显示的时候这段JS代码就会被执行

存储行 XSS 的数据流向是:浏览器 -> 后端 -> 数据库 -> 后端 -> 浏览器




[html]  view plain  cop

  1. <?php  
  2. error_reporting(0); //禁用错误报告  
  3. $name = $_GET["name"];  
  4. ?>  
  5. <input id="text" type="text" value="<?php echo $name;?>" />  
  6. <div id="print"></div>  
  7. <script type="text/javascript">  
  8. var text = document.getElementById("text");   
  9. var print = document.getElementById("print");  
  10. print.innerHTML = text.value; // 获取 text的值,并且输出在print内。这里是导致xss的主要原因。  
  11. </script>
或者


DOM-XSS数据流向:URL->浏览器



四、避免


过滤用户输入的 检查用户输入的内容中是否有非法内容。如<>(尖括号)、”(引号)、 ‘(单引号)、%(百分比符号)、;(分号)、()(括号)、&(& 符号)、+(加号)等。、严格控制输出

以利用下面这些函数对出现xss漏洞的参数进行过滤

1、htmlspecialchars() 函数,用于转义处理在页面上显示的文本。

2、htmlentities() 函数,用于转义处理在页面上显示的文本。

3、strip_tags() 函数,过滤掉输入、输出里面的恶意标签。

4、header() 函数,使用header("Content-type:application/json"); 用于控制 json 数据的头部,不用于浏览。

5、urlencode() 函数,用于输出处理字符型参数带入页面链接中。

6、intval() 函数用于处理数值型参数输出页面中。



五、上文总结

数据与代码要严格分离,每次的数据一定要过滤,保证安全

猜你喜欢

转载自blog.csdn.net/snow_love_xia/article/details/79780033