XSS安全处理
Security.class.php文件
<?php
class Security { public $filename_bad_chars = array(
'../', '<!--', '-->', '<', '>',
"'", '"', '&', '$', '#',
'{', '}', '[', ']', '=',
';', '?', '%20', '%22',
'%3c', // <
'%253c', // <
'%3e', // >
'%0e', // >
'%28', // (
'%29', // )
'%2528', // (
'%26', // &
'%24', // $
'%3f', // ?
'%3b', // ;
'%3d' // =
);
protected $_xss_hash = '';
protected $_never_allowed_str = array(
'document.cookie' => '[removed]',
'document.write' => '[removed]',
'.parentNode' => '[removed]',
'.innerHTML' => '[removed]',
'-moz-binding' => '[removed]',
'<!--' => '<!--',
'-->' => '-->',
'<![CDATA[' => '<![CDATA[',
'<comment>' => '<comment>'
);
protected $_never_allowed_regex = array(
'javascript\s*:',
'(document|(document\.)?window)\.(location|on\w*)',
'expression\s*(\(|&\#40;)', // CSS and IE
'vbscript\s*:', // IE, surprise!
'Redirect\s+302',
"([\"'])?data\s*:[^\\1]*?base64[^\\1]*?,[^\\1]*?\\1?"
); public function gprc_xss(){
if($_POST)$_POST = $this->xss_clean($_POST);
if($_GET)$_GET = $this->xss_clean($_GET);
if($_COOKIE)$_COOKIE = $this->xss_clean($_COOKIE);
if($_REQUEST)$_REQUEST = $this->xss_clean($_REQUEST);
} public function remove_invisible_characters($str, $url_encoded = TRUE){
$non_displayables = array();
if ($url_encoded) {
$non_displayables[] = '/%0[0-8bcef]/'; // url encoded 00-08, 11, 12, 14, 15
$non_displayables[] = '/%1[0-9a-f]/'; // url encoded 16-31
}
$non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127
do {
$str = preg_replace($non_displayables, '', $str, -1, $count);
}
while ($count);
return $str;
} public function xss_clean($str, $is_image = FALSE){
if (is_array($str)){
while (list($key) = each($str)){
$str[$key] = $this->xss_clean($str[$key]);
}
return $str;
}
$str = $this->_validate_entities($this->remove_invisible_characters($str));
$str = rawurldecode($str);
$str = preg_replace_callback("/[a-z]+=([\'\"]).*?\\1/si", array($this, '_convert_attribute'), $str);
$str = preg_replace_callback('/<\w+.*/si', array($this, '_decode_entity'), $str);
$str = $this->remove_invisible_characters($str);
$str = str_replace("\t", ' ', $str);
$converted_string = $str;
$str = $this->_do_never_allowed($str);
if ($is_image === TRUE){
$str = preg_replace('/<\?(php)/i', '<?\\1', $str);
}else {
$str = str_replace(array('<?', '?'.'>'), array('<?', '?>'), $str);
}
$words = array(
'javascript', 'expression', 'vbscript', 'script', 'base64',
'applet', 'alert', 'document', 'write', 'cookie', 'window'
);
foreach ($words as $word){
$word = implode('\s*', str_split($word)).'\s*';
$str = preg_replace_callback('#('.substr($word, 0, -3).')(\W)#is', array($this, '_compact_exploded_words'), $str);
}
do{
$original = $str;
if (preg_match('/<a/i', $str))$str = preg_replace_callback('#<a\s+([^>]*?)(?:>|$)#si', array($this, '_js_link_removal'), $str);
if (preg_match('/<img/i', $str))$str = preg_replace_callback('#<img\s+([^>]*?)(?:\s?/?>|$)#si', array($this, '_js_img_removal'), $str);
if (preg_match('/script|xss/i', $str))$str = preg_replace('#</*(?:script|xss).*?>#si', '[removed]', $str);
}
while ($original !== $str);
unset($original);
$str = $this->_remove_evil_attributes($str, $is_image);
$naughty = 'alert|applet|audio|basefont|base|behavior|bgsound|blink|body|embed|expression|form|frameset|frame|head|html|ilayer|iframe|input|isindex|layer|link|meta|object|plaintext|style|script|textarea|title|video|xml|xss';
$str = preg_replace_callback('#<(/*\s*)('.$naughty.')([^><]*)([><]*)#is', array($this, '_sanitize_naughty_html'), $str);
$str = preg_replace('#(alert|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', '\\1\\2(\\3)', $str);
$str = $this->_do_never_allowed($str);
if ($is_image === TRUE)return ($str === $converted_string);
return $str;
} public function xss_hash(){
if ($this->_xss_hash === '')$this->_xss_hash = md5(uniqid(mt_rand()));
return $this->_xss_hash;
} public function entity_decode($str, $charset = NULL){
if (strpos($str, '&') === FALSE)return $str;
if (empty($charset))$charset = 'utf-8'; do{
$matches = $matches1 = 0;
$str = preg_replace('~(�*[0-9a-f]{2,5});?~iS', '$1;', $str, -1, $matches);
$str = preg_replace('~(&#\d{2,4});?~S', '$1;', $str, -1, $matches1);
$str = html_entity_decode($str, ENT_COMPAT, $charset);
}
while ($matches OR $matches1);
return $str;
} public function sanitize_filename($str, $relative_path = FALSE){
$bad = $this->filename_bad_chars;
if ( ! $relative_path){
$bad[] = './';
$bad[] = '/';
}
$str = $this->remove_invisible_characters($str, FALSE);
do{
$old = $str;
$str = str_replace($bad, '', $str);
}while ($old !== $str);
return stripslashes($str);
} public function strip_image_tags($str){
return preg_replace(array('#<img[\s/]+.*?src\s*=\s*["\'](.+?)["\'].*?\>#', '#<img[\s/]+.*?src\s*=\s*(.+?).*?\>#'), '\\1', $str);
} protected function _compact_exploded_words($matches){
return preg_replace('/\s+/s', '', $matches[1]).$matches[2];
} protected function _remove_evil_attributes($str, $is_image){
$evil_attributes = array('style', 'xmlns', 'formaction');
if ($is_image === TRUE)unset($evil_attributes[array_search('xmlns', $evil_attributes)]); do {
$count = 0;
$attribs = array();
preg_match_all('/('.implode('|', $evil_attributes).')\s*=\s*(\042|\047)([^\\2]*?)(\\2)/is', $str, $matches, PREG_SET_ORDER);
foreach ($matches as $attr){
$attribs[] = preg_quote($attr[0], '/');
}
preg_match_all('/('.implode('|', $evil_attributes).')\s*=\s*([^\s>]*)/is', $str, $matches, PREG_SET_ORDER);
foreach ($matches as $attr){
$attribs[] = preg_quote($attr[0], '/');
}
if (count($attribs) > 0)$str = preg_replace('/(<?)(\/?[^><]+?)([^A-Za-z<>\-])(.*?)('.implode('|', $attribs).')(.*?)([\s><]?)([><]*)/i', '$1$2 $4$6$7$8', $str, -1, $count);
}
while ($count);
return $str;
} protected function _sanitize_naughty_html($matches) {
return '<'.$matches[1].$matches[2].$matches[3].str_replace(array('>', '<'), array('>', '<'), $matches[4]);
} protected function _js_link_removal($match){
return str_replace($match[1],
preg_replace('#href=.*?(?:alert\(|alert&\#40;|javascript:|livescript:|mocha:|charset=|window\.|document\.|\.cookie|<script|<xss|data\s*:)#si',
'', $this->_filter_attributes(str_replace(array('<', '>'), '', $match[1])) ),$match[0]);
} protected function _js_img_removal($match){
return str_replace($match[1],
preg_replace('#src=.*?(?:alert\(|alert&\#40;|javascript:|livescript:|mocha:|charset=|window\.|document\.|\.cookie|<script|<xss|base64\s*,)#si',
'',$this->_filter_attributes(str_replace(array('<', '>'), '', $match[1]))
),
$match[0]);
} protected function _convert_attribute($match){
return str_replace(array('>', '<', '\\'), array('>', '<', '\\\\'), $match[0]);
} protected function _filter_attributes($str){
$out = '';
if (preg_match_all('#\s*[a-z\-]+\s*=\s*(\042|\047)([^\\1]*?)\\1#is', $str, $matches)){
foreach ($matches[0] as $match){
$out .= preg_replace('#/\*.*?\*/#s', '', $match);
}
}
return $out;
} protected function _decode_entity($match){
return $this->entity_decode($match[0], strtoupper('utf-8'));
} protected function _validate_entities($str){
$str = preg_replace('|\&([a-z\_0-9\-]+)\=([a-z\_0-9\-]+)|i', $this->xss_hash().'\\1=\\2', $str);
$str = preg_replace('#(&\#?[0-9a-z]{2,})([\x00-\x20])*;?#i', '\\1;\\2', $str);
$str = preg_replace('#(&\#x?)([0-9A-F]+);?#i', '\\1\\2;', $str);
return str_replace($this->xss_hash(), '&', $str);
} protected function _do_never_allowed($str){
$str = str_replace(array_keys($this->_never_allowed_str), $this->_never_allowed_str, $str);
foreach ($this->_never_allowed_regex as $regex){
$str = preg_replace('#'.$regex.'#is', '[removed]', $str);
}
return $str;
}
/**
* @desc: 暂时不用
* */
public function gprc_sql(){
if(!get_magic_quotes_gpc()) {
if($_POST) $_POST = $this->daddslashes($_POST);
if($_GET) $_GET = $this->daddslashes($_GET);
if($_COOKIE) $_COOKIE = $this->daddslashes($_COOKIE);
if($_REQUEST) $_REQUEST = $this->daddslashes($_REQUEST);
}
} public function daddslashes($string){
if(!is_array($string)) return addslashes($string);
foreach($string as $key => $val) $string[$key] = $this->daddslashes($val);
return $string;
}
}
调用方式:
$SEC = new Security();
$SEC->gprc_xss();
$SEC = NULL;
XSS安全处理的更多相关文章
- 防御XSS攻击-encode用户输入内容的重要性
一.开场先科普下XSS 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶 ...
- XSS
XSS的含义 XSS(Cross Site Scripting)即跨站脚本.跨站的主要内容是在脚本上. 跨站脚本 跨站脚本的跨,体现了浏览器的特性,可以跨域.所以也就给远程代码或者第三方域上的代码提供 ...
- 【XSS】延长 XSS 生命期
XSS 的本质仍是一段脚本.和其他文档元素一样,页面关了一切都销毁.除非能将脚本蔓延到页面以外的地方,那样才能获得更长的生命力. 庆幸的是,从 DOM 诞生的那一天起,就已为我们准备了这个特殊的功能, ...
- 探索ASP.NET MVC5系列之~~~2.视图篇(上)---包含XSS防御和异步分部视图的处理
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
- XSS分析及预防
XSS(Cross Site Scripting),又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行.在WEB前端应用日益发展的今天,XSS漏洞尤其容易被开发人员忽视,最终可能造成对个人信息 ...
- 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范
昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...
- xss和sql注入原理学习
8.4 Web跨站脚本攻击 8.4.1 跨站脚本攻击的原理(1) 跨站脚本在英文中称为Cross-Site Scripting,缩写为CSS.但是,由于层叠样式表 (Cascading Style ...
- XSS 前端防火墙 —— 整装待发
到目前为止,我们把能用前端脚本防御 XSS 的方案都列举了一遍. 尽管看起来似乎很复杂累赘,不过那些是理论探讨而已,在实际中未必要都实现.我们的目标只是为了预警,能发现问题就行,并非要做到滴水不漏的程 ...
- XSS 前端防火墙 —— 天衣无缝的防护
上一篇讲解了钩子程序的攻防实战,并实现了一套对框架页的监控方案,将防护作用到所有子页面. 到目前为止,我们防护的深度已经差不多,但广度还有所欠缺. 例如,我们的属性钩子只考虑了 setAttribut ...
- XSS 前端防火墙 —— 无懈可击的钩子
昨天尝试了一系列的可疑模块拦截试验,尽管最终的方案还存在着一些兼容性问题,但大体思路已经明确了: 静态模块:使用 MutationObserver 扫描. 动态模块:通过 API 钩子来拦截路径属性. ...
随机推荐
- 【收藏】介绍RCU的好文章
RCU原理: RCU(Read-Copy Update),顾名思义就是读-拷贝修改,它是基于其原理命名的.对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个 ...
- thinkphp5在URL地址里隐藏模块名
新的Thinkphp5的路由功能很强大,完全可以自定义以满足自己的要求 ThinkPHP5.0的路由规则如下:http://serverName/index.php/module/controll ...
- Apache+wsgi+flask部署
flask自带的web server是开发用途,并不适用与发布,需要借助专业的web服务器. 配置的坑无数,Apache部署,403禁止,莫名其妙无法访问,500内部错误把我搞得崩溃了. 重点参考: ...
- redis 中 set 和 hset 有什么不同,什么时候使用 hset 什么时候使用set?
转载:https://blog.csdn.net/wab719591157/article/details/73379844 redis 中存数据时,到底什么时候用 hset 相比于 set 存数据 ...
- 从n个数中随机选取m个
咋一看,这是个很简单的问题,但是如果n是个不确定的数呢?比如服务器每天会收到数以亿计的请求,但是目前服务器端不希望保存所有的请求,只想随机保存这些请求中的m个.试设计一种算法,能够使服务器实时保存m个 ...
- webkit webApp 开发技术要点总结[转]
http://www.cnblogs.com/pifoo/archive/2011/05/28/webkit-webapp.html 如果你是一名前端er,又想在移动设备上开发出自己的应用,那怎么实现 ...
- TQ2440触摸屏
s3c2440集成了4线制电阻式的触摸屏接口,触点坐标的检测是通过A/D转换来实现的. s3c2440一共有4种触摸屏接口模式: (1)等待中断模式 设置ADCTSC寄存器为0xD3即可令触摸屏控制器 ...
- LCD显示——点阵字体
Bitmap font 点阵字体是把每一个字符都分成16×16或24×24个点,然后用每个点的虚实来表示字符的轮廓. 点阵字体优点是显示速度快,不像矢量字体需要计算:其最大的缺点是不能放大,一旦放大后 ...
- directive完成UI渲染后执行JS
ui-view有相应的$viewContentLoaded http://blog.csdn.net/xinshangshangxin/article/details/44700813 ng-repe ...
- 开源 JSON 库解析性能对比( Jackson / Json.simple / Gson )
Json 已成为当前服务器与 web 应用之间数据传输的公认标准. 微服务及分布式架构经常会使用 Json 来传输此类文件,因为这已经是 webAPI 的事实标准. 不过正如许多我们习以为常的事情一样 ...