php防注入和XSS过滤参考代码

php防注入和XSS过滤参考代码

对网站发动XSS攻击的方式有很多种,仅仅使用php的一些内置过滤函数是对付不了的,即使你将filter_var,mysql_real_escape_string,htmlentities,htmlspecialchars,strip_tags这些函数都使用上了也不一定能保证绝对的安全。

那么如何预防 XSS 注入?主要还是需要在用户数据过滤方面得考虑周全,在这里不完全总结下几个 Tips

  1. 假定所有的用户输入数据都是"邪恶"的

  2. 弱类型的脚本语言必须保证类型和期望的一致

  3. 考虑周全的正则表达式

  4. strip_tags、htmlspecialchars 这类函数很好用

  5. 外部的 Javascript 不一定就是可靠的

  6. 引号过滤必须要重点注意

  7. 除去不必要的 HTML 注释

  8. Exploer 求你放过我吧......

方法一,利用php htmlentities函数

例子

php防止XSS跨站脚本攻击的方法:是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数 。

在使用htmlspecialchars()函数的时候注意第二个参数, 直接用htmlspecialchars($string) 的话,第二个参数默认是ENT_COMPAT,函数默认只是转化双引号("), 不对单引号(')做转义.

所以,htmlspecialchars函数更多的时候要加上第二个参数, 应该这样用: htmlspecialchars(string,ENTQUOTES).当然,如果需要不转化如何的引号,用htmlspecialchars(string,ENTQUOTES).当然,如果需要不转化如何的引号,用htmlspecialchars(string,ENT_NOQUOTES).

另外, 尽量少用htmlentities, 在全部英文的时候htmlentities和htmlspecialchars没有区别,都可以达到目的.但是,中文情况下, htmlentities却会转化所有的html代码,连同里面的它无法识别的中文字符也给转化了。

htmlentities和htmlspecialchars这两个函数对 '之类的字符串支持不好,都不能转化, 所以用htmlentities和htmlspecialchars转化的字符串只能防止XSS攻击,不能防止SQL注入攻击.

所有有打印的语句如echo,print等 在打印前都要使用htmlentities() 进行过滤,这样可以防止Xss,注意中文要写出htmlentities($name,ENT_NOQUOTES,GB2312) 。

方法二,什么也不多说我们给一个函数

例子

php 复制代码
functionxss_clean($data){
  
//Fix &entity\n;
  
$data=str_replace(array('&','<','>'),array('&','<','>'),$data);
  
$data=preg_replace('/(&#*\w+)[\x00-\x20]+;/u','$1;',$data);
  
$data=preg_replace('/(&#x*[0-9A-F]+);*/iu','$1;',$data);
  
$data=html_entity_decode($data,ENT_COMPAT,'UTF-8');
  
//Remove any attribute starting with "on" or xmlns
  
$data=preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu','$1>',$data);
  
//Remove javascript: and vbscript: protocols
  
$data=preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu','$1=$2nojavascript...',$data);
  
$data=preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu','$1=$2novbscript...',$data);
  
$data=preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u','$1=$2nomozbinding...',$data);
  
//Only works in IE:
  
$data=preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i','$1>',$data);
  
$data=preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i','$1>',$data);
  
$data=preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu','$1>',$data);
  
//Remove namespaced elements (we do not need them)
  
$data=preg_replace('#]*+>#i','',$data);
  
do{//Remove really unwanted tags
  
$old_data=$data;
  
$data=preg_replace('#]*+>#i','',$data);
  
}while($old_data!==$data);
  
//we are done...
  
return$data;
  
}
方法三:
 
//php防注入和XSS攻击通用过滤.
 
$_GET&&
  
SafeFilter($_GET);
  
$_POST&&
  
SafeFilter($_POST);
  
$_COOKIE&&
  
SafeFilter($_COOKIE);
  
functionSafeFilter
  
(&$arr)
  
{
  
$ra=Array('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/','/script/','/javascript/','/vbscript/','/expression/','/applet/','/meta/','/xml/','/blink/','/link/','/style/','/embed/','/object/','/frame/','/layer/','/title/','/bgsound/','/base/','/onload/','/onunload/','/onchange/','/onsubmit/','/onreset/','/onselect/','/onblur/','/onfocus/','/onabort/','/onkeydown/','/onkeypress/','/onkeyup/','/onclick/','/ondblclick/','/onmousedown/','/onmousemove/','/onmouseout/','/onmouseover/','/onmouseup/','/onunload/');
  
if(is_array($arr))
  
{
  
foreach($arras$key=>$value)
  
{
  
if(!is_array($value))
  
{
  
if(!get_magic_quotes_gpc())//不对magic_quotes_gpc转义过的字符使用addslashes(),避免双重转义。
  
{
  
$value=addslashes($value);//给单引号(')、双引号(")、反斜线(\)与
  
NUL(NULL 字符)加上反斜线转义
  
}
  
$value=preg_replace($ra,'',$value);//删除非打印字符,粗暴式过滤xss可疑字符串$arr[$key]
  
= htmlentities(strip_tags($value));//去除
  
HTML 和 PHP 标记并转换为 HTML 实体
  
}
  
else
  
{
  
SafeFilter($arr[$key]);
  
}
  
}
  
}
  
}
  
?>

1.1 什么是XSS攻击

XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制------例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的"缓冲区溢出攻击",而JavaScript是新型的"ShellCode"。

数据来源:2007 OWASP Top 10的MITRE数据

注:OWASP是世界上最知名的Web安全与数据库安全研究组织

在2007年OWASP所统计的所有安全威胁中,跨站脚本攻击占到了22%,高居所有Web威胁之首。

XSS攻击的危害包括

1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号

2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力

3、盗窃企业重要的具有商业价值的资料

4、非法转账

5、强制发送电子邮件

6、网站挂马

7、控制受害者机器向其它网站发起攻击

1.2 XSS漏洞的分类

XSS漏洞按照攻击利用手法的不同,有以下三种类型:

类型A,本地利用漏洞,这种漏洞存在于页面中客户端脚本自身。其攻击过程如下所示:

Alice给Bob发送一个恶意构造了Web的URL。

Bob点击并查看了这个URL。

恶意页面中的JavaScript打开一个具有漏洞的HTML页面并将其安装在Bob电脑上。

具有漏洞的HTML页面包含了在Bob电脑本地域执行的JavaScript。

Alice的恶意脚本可以在Bob的电脑上执行Bob所持有的权限下的命令。

类型B,反射式漏洞,这种漏洞和类型A有些类似,不同的是Web客户端使用Server端脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能够注入到动态页面中。其攻击过程如下:

Alice经常浏览某个网站,此网站为Bob所拥有。Bob的站点运行Alice使用用户名/密码进行登录,并存储敏感信息(比如银行帐户信息)。

Charly发现Bob的站点包含反射性的XSS漏洞。

Charly编写一个利用漏洞的URL,并将其冒充为来自Bob的邮件发送给Alice。

Alice在登录到Bob的站点后,浏览Charly提供的URL。

嵌入到URL中的恶意脚本在Alice的浏览器中执行,就像它直接来自Bob的服务器一样。此脚本盗窃敏感信息(授权、信用卡、帐号信息等)然后在Alice完全不知情的情况下将这些信息发送到Charly的Web站点。

类型C,存储式漏洞,该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,骇客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。其攻击过程如下:

Bob拥有一个Web站点,该站点允许用户发布信息/浏览已发布的信息。

Charly注意到Bob的站点具有类型C的XSS漏洞。

Charly发布一个热点信息,吸引其它用户纷纷阅读。

Bob或者是任何的其他人如Alice浏览该信息,其会话cookies或者其它信息将被Charly盗走。

类型A直接威胁用户个体,而类型B和类型C所威胁的对象都是企业级Web应用。

传统防御技术

2.1.1基于特征的防御

XSS漏洞和著名的SQL注入漏洞一样,都是利用了Web页面的编写不完善,所以每一个漏洞所利用和针对的弱点都不尽相同。这就给XSS漏洞防御带来了困难:不可能以单一特征来概括所有XSS攻击。

相关推荐
workflower12 小时前
单元测试-例子
java·开发语言·算法·django·个人开发·结对编程
YuanlongWang13 小时前
C# 基础——装箱和拆箱
java·开发语言·c#
b78gb13 小时前
电商秒杀系统设计 Java+MySQL实现高并发库存管理与订单处理
java·开发语言·mysql
LXS_35714 小时前
Day 05 C++ 入门 之 指针
开发语言·c++·笔记·学习方法·改行学it
etsuyou16 小时前
js前端this指向规则
开发语言·前端·javascript
从零开始的ops生活16 小时前
【Day 80】Linux-NAS 和 SAN 存储
linux·运维·php
shizhenshide16 小时前
为什么有时候 reCAPTCHA 通过率偏低,常见原因有哪些
开发语言·php·验证码·captcha·recaptcha·ezcaptcha
mit6.82416 小时前
[Agent可视化] 配置系统 | 实现AI模型切换 | 热重载机制 | fsnotify库(go)
开发语言·人工智能·golang
友友马16 小时前
『 QT 』QT控件属性全解析 (一)
开发语言·前端·qt
小白学大数据17 小时前
实战:Python爬虫如何模拟登录与维持会话状态
开发语言·爬虫·python