一、什么是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传入参数去控制触发的。
- \\XSS反射演示
- <form action="" method="get">
- <input type="text" name="xss"/>
- <input type="submit" value="test"/>
- </form>
- <?php
- $xss = @$_GET['xss'];
- if($xss!==null){
- echo $xss;
- }
在这段代码里面:当xss 的input框不为空的时候,将输出input里面的值;假如里面输入的为:<script>alert('JS被执行')</script>,时,浏览器会将执行这段js代码,弹出弹框,提示“JS被执行”;要是用调试器查看元素,会发现这段代码被执行写入到了浏览器中,可以自己执行查看结果
反射型 XSS 的数据流向是:浏览器 -> 后端 -> 浏览器
- \\存储XSS演示
- <form action="" method="post">
- <input type="text" name="xss"/>
- <input type="submit" value="test"/>
- </form>
- <?php
- $xss=@$_POST['xss'];
- mysql_connect("localhost","root","123");
- mysql_select_db("xss");
- if($xss!==null){
- $sql="insert into temp(id,payload) values('1','$xss')";
- $result=mysql_query($sql);
- echo $result;
- }
用户输入的内容还是没有过滤,但是不直接显示在页面中,而是插入到了数据库。所以当查询数据显示的时候这段JS代码就会被执行
存储行 XSS 的数据流向是:浏览器 -> 后端 -> 数据库 -> 后端 -> 浏览器。
- <?php
- error_reporting(0); //禁用错误报告
- $name = $_GET["name"];
- ?>
- <input id="text" type="text" value="<?php echo $name;?>" />
- <div id="print"></div>
- <script type="text/javascript">
- var text = document.getElementById("text");
- var print = document.getElementById("print");
- print.innerHTML = text.value; // 获取 text的值,并且输出在print内。这里是导致xss的主要原因。
- </script>
DOM-XSS数据流向:URL->浏览器
四、避免
过滤用户输入的 检查用户输入的内容中是否有非法内容。如<>(尖括号)、”(引号)、 ‘(单引号)、%(百分比符号)、;(分号)、()(括号)、&(& 符号)、+(加号)等。、严格控制输出
以利用下面这些函数对出现xss漏洞的参数进行过滤
1、htmlspecialchars() 函数,用于转义处理在页面上显示的文本。
2、htmlentities() 函数,用于转义处理在页面上显示的文本。
3、strip_tags() 函数,过滤掉输入、输出里面的恶意标签。
4、header() 函数,使用header("Content-type:application/json"); 用于控制 json 数据的头部,不用于浏览。
5、urlencode() 函数,用于输出处理字符型参数带入页面链接中。
6、intval() 函数用于处理数值型参数输出页面中。
五、上文总结
数据与代码要严格分离,每次的数据一定要过滤,保证安全