首页 > 编程语言 >整理php防注入和XSS攻击通用过滤

整理php防注入和XSS攻击通用过滤

时间:2023-09-20 15:57:34浏览次数:41  
标签:XSS x00 漏洞 过滤 Bob php data x20

对网站发动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,ENT_QUOTES).当然,如果需要不转化如何的引号,用htmlspecialchars($string,ENT_NOQUOTES).

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

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

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

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

例子

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攻击。

标签:XSS,x00,漏洞,过滤,Bob,php,data,x20
From: https://www.cnblogs.com/68xi/p/17717517.html

相关文章

  • thinkphp上传文件失败的一次记录
    问题出现有用户反映上传图片报网络错误,问题转到开发之后怀疑可能是用户上传的图片比较大导致的错误,后面测试发现在上传8m左右大小的图片的时候就会报错,但是报的错误不是代码里面图片大小验证规则的错误,而是异常捕获的错误,让我很纳闷后来决定先让前端在页面提......
  • 布隆过滤器原理及实现
    大家好,我是蓝胖子,我一直相信编程是一门实践性的技术,其中算法也不例外,初学者可能往往对它可望而不可及,觉得很难,学了又忘,忘其实是由于没有真正搞懂算法的应用场景,所以我准备出一个系列,囊括我们在日常开发中常用的算法,并结合实际的应用场景,真正的感受算法的魅力。今天,我们就来学习......
  • 逻辑漏洞挖掘之XSS漏洞原理分析及实战演练
    一、前言2月份的1.2亿条用户地址信息泄露再次给各大公司敲响了警钟,数据安全的重要性愈加凸显,这也更加坚定了我们推行安全测试常态化的决心。随着测试组安全测试常态化的推进,有更多的同事对逻辑漏洞产生了兴趣,本系列文章旨在揭秘逻辑漏洞的范围、原理及预防措施,逐步提升大家的安全......
  • PHP面试题2
    1.$a='b';$b='$a';$c="$b";$d="$$a";$e=$$a;echo$c.PHP_EOL;//$aecho$d.PHP_EOL;//$becho$e.PHP_EOL;//$aif($a==0){echo0;}else{echo1;}//02.浏览器输入url后发生了什么?1.DNS对域名进行解析;2.建立TCP连接(......
  • PHP、NET语言中的Ticks时间DateTime
    PHP语言:【夏令時間的公式】<?php//date_default_timezone_set("Asia/Taipei");//GMT+8date_default_timezone_set('Europe/London');//GMT+0//LondonAsia$s1=637338818029530000;//GMT+8$s2=621355968000000000;//GMT+0$NowTime=($s1-$s2)/100......
  • PHP Apache配置小记
    Apache首先到Apacahe网站上下载Apache,然后打开Apache24文件夹,其中htdocs就是之后的网页文件夹(如果不修改的话),bin就是启动Apache服务器的文件夹,conf是配置文件夹,首先打开conf文件夹内的httpd.conf这是Apache的配置文件,按以下进行配置■到DefineSRVROOT一项,后面内容进行修改,设定A......
  • php 金额大写转换
    在别人的基础上加以更改functionnumberToChinese($num){//判断$num是否存在if(!$num)return'零圆';//保留小数点后两位$num=round($num,2);//将浮点转换为整数$tem_num=$num*100;//判断数字长度$tem_num_len=strlen($tem_num);......
  • PHP实现断点续传大文件
    一、断点续传原理所谓断点续传,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。不使用断点续传get/down.ziphttp/1.1accept:image/gif,image/x-xbitmap,ima......
  • 反序列化之PHP
    PHP反序列化原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导 致代码执行、SQL注入、目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术 方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。 php序列化与反序列化的关键......
  • 基于php+webuploader的大文件分片上传,支持断点续传,带进度条
    基于php+webuploader的大文件分片上传,带进度条,支持断点续传(刷新、关闭页面、重新上传、网络中断等情况)。文件上传前先检测该文件是否已上传,如果已上传提示“文件已存在”,如果未上传则直接上传。视频上传时会根据设定的参数(分片大小、分片数量)进行上传,上传过程中会在目标文件夹......