xss漏洞修复
从上面XSS实例以及之前文章的介绍我们知道XSS漏洞的起因就是没有对用户提交的数据进行严格的过滤处理。因此在思考解决XSS漏洞的时候,我们应该重点把握如何才能更好的将用户提交的数据进行安全过滤。
2|0 html实体
什么是html实体?
在html中有些字符,像(<)这类的,对HTML(标准通用标记语言下的一个应用)来说是有特殊意义的,所以这些字符是不允许在文本中使用的。要在HTML中显示(<)这个字符,我们就必须使用实体字符。
html实体的存在是导致XSS漏洞的主要原因之一。
因此我们需要将这些实体全部转换为相应的实体编号。
显示结果 | 描述 | 实体名称 |
空格 | | |
< | 小于号 | < |
> | 大于号 | > |
& | 和号 | & |
" | 引号 | " |
' | 撇号 | ' (IE不支持) |
3|0 HTML Encode
用户将数据提交上来的时候进行HTML编码,将相应的符号转换为实体名称再进行下一步的处理。
在PHP中已经存在这样子功能的函数,即是htmlentities($str)函数。
与之相反的就是html_entity_decode($str)函数,它将实体名称转换为相应的符号。
4|0 修复漏洞方针
【不相应用户提交的数据,过滤过滤过滤!】
1、将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到 cookie了.
2、表单数据规定值的类型,例如:年龄应为只能为int、name只能为字母数字组合。。。。
4、对数据进行Html Encode 处理
5、过滤或移除特殊的Html标签, 例如: <script>, <iframe> , < for <, > for >, " for
6、过滤JavaScript 事件的标签。例如 "οnclick=", "onfocus" 等等。
【特别注意:】
在有些应用中是允许html标签出现的,甚至是javascript代码出现。因此我们在过滤数据的时候需要仔细分析哪些数据是有特殊要求(例如输出需要html代码、javascript代码拼接、或者此表单直接允许使用等等),然后区别处理!
5|0 PHP中的相应函数
【详细看PHP手册】
这里可能不全,想了解更多的看手册
strip_tags($str, [允许标签]) | 从字符串中去除 HTML 和 PHP 标记 |
htmlentities($str) | 转义html实体 |
html_entity_decode($str) | 反转义html实体 |
addcslashes($str, ‘字符’) | 给某些字符加上反斜杠 |
stripcslashes($str) | 去掉反斜杠 |
addslashes ($str ) | 单引号、双引号、反斜线与 NULL加反斜杠 |
stripslashes($str) | 去掉反斜杠 |
htmlspecialchars() | 特殊字符转换为HTML实体 |
htmlspecialchars_decode() | 将特殊的 HTML 实体转换回普通字符 |
6|0 数据过滤类
<?php
class XSS
{
/**
* @desc 过滤数据
*
* @param $data string|array 输入数据
* @param $low bool 是否采用更为严格的过滤
*
* @return 返回过滤的数据
*/
public function clean_xss($data, $low = False)
{
#字符串过滤
if (! is_array ( $data ))
{
$data = trim ( $data ); #字符两边的处理
$data = strip_tags ( $data ); #从字符串中去除 HTML 和 PHP 标记
$data = htmlspecialchars ( $data ); #特殊字符转换为HTML实体
if ($low)
{
return $data;
}
#匹配换空格
$data = str_replace ( array ('"', "\\", "'", "/", "..", "../", "./", "//" ), '', $data );
$no = '/%0[0-8bcef]/';
$data = preg_replace ( $no, '', $data );
$no = '/%1[0-9a-f]/';
$data = preg_replace ( $no, '', $data );
$no = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S';
$data = preg_replace ( $no, '', $data );
return $data;
}
#数组过滤
$arr=array();
foreach ($data as $k => $v)
{
$temp=$this->clean_xss($v);
$arr[$k]=$temp;
}
return $arr;
}
}
#测试测试
session_start();
$_SESSION['xss']='xssss';
$xss=new XSS();
#测试字符串
$str = "<script>alert(document.cookie)</script>";
echo $str;
$str2=$xss->clean_xss($str);
echo $str2;
echo "<hr/>";
#测试数组
$arr=array("<script>alert(document.cookie)</script>","<script>alert(document.cookie)</script>","<script>alert(document.cookie)</script>");
echo "<pre>";
print_r($arr);
echo "</pre>";
$arr2=$xss->clean_xss($arr);
echo "<pre>";
print_r($arr2);
echo "</pre>";die;
?>
原文地址:https://blog.csdn.net/2401_88220102/article/details/144404582
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!