XSS 攻击时怎么绕过 htmlspecialchars绕过 函数

PHP htmlspecialchars_decode() 函数
把预定义的 HTML 实体 "&"(小于)和 "&"(大于)转换为字符:
&?php$str = "This is some &b&bold&/b& text.";echo htmlspecialchars_decode($str);
上面代码的 HTML 输出如下(查看源代码):
&!DOCTYPE html&&html&
This is some &b&bold&/b& text.
上面代码的浏览器输出如下:
This is some bold text.
定义和用法
htmlspecialchars_decode() 函数把一些预定义的 HTML 实体转换为字符。
会被解码的 HTML 实体是:
& 解码成 & (和号)
& 解码成 " (双引号)
' 解码成 ' (单引号)
& 解码成 & (小于)
& 解码成 & (大于)
htmlspecialchars_decode() 函数是
函数的反函数。
htmlspecialchars_decode(string,flags)
必需。规定要解码的字符串。
可选。规定如何处理引号以及使用哪种文档类型。可用的引号类型:
ENT_COMPAT - 默认。仅解码双引号。
ENT_QUOTES - 解码双引号和单引号。
ENT_NOQUOTES - 不解码任何引号。
规定使用的文档类型的附加 flags:
ENT_HTML401 - 默认。作为 HTML 4.01 处理代码。
ENT_HTML5 - 作为 HTML 5 处理代码。
ENT_XML1 - 作为 XML 1 处理代码。
ENT_XHTML - 作为 XHTML 处理代码。
返回已转换的字符串。
PHP 版本:
更新日志:
在 PHP 5.4 中,新增了用于规定使用的文档类型的附加 flags:ENT_HTML401、ENT_HTML5、ENT_XML1 和 ENT_XHTML。
把一些预定义的 HTML 实体转换为字符:
$str = "Jane & 'Tarzan'";
echo htmlspecialchars_decode($str,
ENT_COMPAT); // Will only convert double quotes
echo "&br&";
echo htmlspecialchars_decode($str, ENT_QUOTES);
// Converts double and single quotes
echo "&br&";
echo htmlspecialchars_decode($str, ENT_NOQUOTES);
// Does not convert any quotes
上面代码的 HTML 输出如下(查看源代码):
&!DOCTYPE html&&html&
Jane & 'Tarzan'&br&
Jane & 'Tarzan'&br&
Jane & 'Tarzan'
上面代码的浏览器输出如下:
Jane & 'Tarzan'
Jane & 'Tarzan'
Jane & 'Tarzan'
把预定义 HTML 实体转换为双引号:
$str = 'I love &PHP&.';echo htmlspecialchars_decode($str, ENT_QUOTES);
// Converts double and single quotes
上面代码的 HTML 输出如下(查看源代码):
&!DOCTYPE html&&html&
I love "PHP".
上面代码的浏览器输出如下:
I love "PHP".htmlspecialchars函数并不能百分百的防止XSS攻击
htmlspecialchars()函数只对&、&、&、&、&符号进行转译成html特殊符号
我们可以通过url编码对带有连接的标记进行攻击:
&?php echo htmlspecialchars(&javascript:alert(1)&,ENT_QUOTES); ?&
&?php echo htmlspecialchars(&javascript:location%3D'http%3A%'&,ENT_QUOTES); ?&
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'一、转义或者转换的目的& & 1.&转义或者转换字符串防止sql注入& & 2.&转义或者转换字符防止html非过滤引起页面布局变化& & 3.&转义或者转换可以阻止javascript等脚本的xss攻击,避免出现类似恶意弹窗等等形式二、函数& & 1. addslashes($str);& & & & 此函数转义预定义的字符:单引号(‘),双引号(“),反斜线(\)与NULL(NULL字符)& & & & 转义出现在html中的单引号(‘)和双引号(“),经过测试效果不是很好,转义html中的特字符就使用htmlspecialchar()函数& &2. htmlspecialchars($str);& & & & & 此函数只转换5个字符,和号(&),双引号(“),单引号(‘),小于(&),大于(&),转换为实体形式,输出时浏览器会自动还原的,如果有意识的转换回来使用htmlspecialchars_decode();& &3. htmlentities();& & & & 此函数会把所有html表示都转换为实体形式的,如果把thml实体转换为字符使用html_lentity_decode()三、实例& & & & 场景说明:比如想在留言板贴出一段html代码或者javascript代码让别人指导,如何让留言板里面的内容显示出来的是一段html代码或者javascript代码,而不是被浏览器把这段html代码或者javascript给解析了的效果下面的代码段中没有添加转义的任何措施,看看效果&?php
&&&&echo&&输出的结果是:&;
&&&&echo&$_GET['n'];
&form&method=&get&&action=&&&&textarea&cols=&50&&rows=&5&&name=&n&&&/textarea&&input&type=&submit&&&/form&图1是原页面效果(图1)&1. 在表单中提交html代码留言如图2-1(图2-1)图2-2为输出结果(图2-2)2. 在表单中提交一段js代码如图3-1(图3-1)结果如图3-2出现弹窗,而不是我想要的js代码,这是ie内核的浏览器下,非ie的像谷歌,火狐没有出现此弹窗但是也没有输出那段js代码到页面(图3-2)可是代码如果进行了转义处理就不会像上面这样了,添加htmlspecialchars()函数进行处理&?php
&&&&echo&&留言板输出的结果是:&;
&&&&echo&htmlspecialchars($_GET['n']);
?&&form&method=&get&&action=&&&&textarea&cols=&50&&rows=&5&&name=&n&&&/textarea&&input&type=&submit&&&/form&同样提交上面的html代码结果如下图4-1输出的html代码,而不是输出一个表单(图4-1)同样提交上面的javascript代码结果如下图5-1输出的js代码,而不是变成弹窗(图5-1)四、开源系统中的应用1. phpcms中使用代码/**
&*&返回经addslashes处理过的字符串或数组
&*&@param&$string&需要处理的字符串或数组
&*&@return&mixed
function&new_addslashes($string){
&&&&if(!is_array($string))&return&addslashes($string);
&&&&foreach($string&as&$key&=&&$val)&$string[$key]&=&new_addslashes($val);
&&&&return&$
&*&返回经stripslashes处理过的字符串或数组
&*&@param&$string&需要处理的字符串或数组
&*&@return&mixed
function&new_stripslashes($string)&{
&&&&if(!is_array($string))&return&stripslashes($string);
&&&&foreach($string&as&$key&=&&$val)&$string[$key]&=&new_stripslashes($val);
&&&&return&$
&*&返回经htmlspecialchars处理过的字符串或数组
&*&@param&$obj&需要处理的字符串或数组
&*&@return&mixed
function&new_html_special_chars($string)&{
&&&&$encoding&=&'utf-8';
&&&&if(strtolower(CHARSET)=='gbk')&$encoding&=&'ISO-;;
&&&&if(!is_array($string))&return&htmlspecialchars($string,ENT_QUOTES,$encoding);
&&&&foreach($string&as&$key&=&&$val)&$string[$key]&=&new_html_special_chars($val);
&&&&return&$
function&new_html_entity_decode($string)&{
&&&&$encoding&=&'utf-8';
&&&&if(strtolower(CHARSET)=='gbk')&$encoding&=&'ISO-;;
&&&&return&html_entity_decode($string,ENT_QUOTES,$encoding);
function&new_htmlentities($string)&{
&&&&$encoding&=&'utf-8';
&&&&if(strtolower(CHARSET)=='gbk')&$encoding&=&'ISO-;;
&&&&return&htmlentities($string,ENT_QUOTES,$encoding);
}2. &ecshop中的使用/*&对用户传入的变量进行转义操作。*/
if&(!get_magic_quotes_gpc())
&&&&if&(!empty($_GET))
&&&&&&&&$_GET&&=&addslashes_deep($_GET);
&&&&if&(!empty($_POST))
&&&&&&&&$_POST&=&addslashes_deep($_POST);
&&&&$_COOKIE&&&=&addslashes_deep($_COOKIE);
&&&&$_REQUEST&&=&addslashes_deep($_REQUEST);
&*&递归方式的对变量中的特殊字符进行转义
&*&@access&&public
&*&@param&&&mix&&&&&$value
&*&@return&&mix
function&addslashes_deep($value)
&&&&if&(empty($value))
&&&&&&&&return&$
&&&&&&&&return&is_array($value)&?&array_map('addslashes_deep',&$value)&:&addslashes($value);
&*&将对象成员变量或者数组的特殊字符进行转义
&*&@access&&&public
&*&@param&&&&mix&&&&&&&&$obj&&&&&&对象或者数组
&*&@author&&&Xuan&Yan
&*&@return&&&mix&&&&&&&&&&&&&&&&&&对象或者数组
function&addslashes_deep_obj($obj)
&&&&if&(is_object($obj)&==&true)
&&&&&&&&foreach&($obj&AS&$key&=&&$val)
&&&&&&&&&&&&$obj-&$key&=&addslashes_deep($val);
&&&&&&&&$obj&=&addslashes_deep($obj);
&&&&return&$
&*&递归方式的对变量中的特殊字符去除转义
&*&@access&&public
&*&@param&&&mix&&&&&$value
&*&@return&&mix
function&stripslashes_deep($value)
&&&&if&(empty($value))
&&&&&&&&return&$
&&&&&&&&return&is_array($value)&?&array_map('stripslashes_deep',&$value)&:&stripslashes($value);
&*&html代码输入
&*&@param&unknown&$str
&*&@return&string
function&html_in($str)&{
&&&&$search&=&array(
&&&&&&&&&'&script[^&]*?&.*?&/script&'si&,&//&去掉&javascript
&&&&&&&&&'&iframe[^&]*?&.*?&/iframe&'si&&&//&去掉iframe
&&&&$replace&=&array(&&,&&&);
&&&&$str&=&@preg_replace($search,&$replace,&$str);
&&&&$str&=&htmlspecialchars($str);
&&&&if&(!get_magic_quotes_gpc())&{
&&&&&&&&$str&=&addslashes($str);
&&&&return&$
&*&html代码输出
&*&@param&unknown&$str
&*&@return&string
function&html_out($str)&{
&&&&if&(function_exists('htmlspecialchars_decode'))&{
&&&&&&&&$str&=&htmlspecialchars_decode($str);
&&&&}&else&{
&&&&&&&&$str&=&html_entity_decode($str);
&&&&$str&=&stripslashes($str);
&&&&return&$
转载请注明: &
与本文相关的文章踏入编程圈一年不到,之前写的文章一直放在个人博客上,以后我写的或整理的好的教程一定到园子里分享,只是园子里PHPer好像不怎么活跃,希望同行多多交流。这是我之前整理的一篇PHP漏洞文章!
漏洞无非这么几类,XSS、sql注入、命令执行、上传漏洞、本地包含、远程包含、权限绕过、信息泄露、cookie伪造、CSRF(跨站请求)等。这些漏洞不仅仅是针对PHP语言的,本文只是简单介绍PHP如何有效防止这些漏洞。
1.xss + sql注入()
其中占大头的自然是XSS与SQL注入,对于框架类型或者有公共文件的,建议在公共文件中统一做一次XSS和SQL注入的过滤。,可由如下所示:
$_REQUEST = filter_xss($_REQUEST);
$_GET = filter_xss($_GET);
$_POST = filter_xss($_POST);
$_COOKIE = filter_xss($_COOKIE);
$_POST = filter_sql($_POST);
$_GET = filter_sql($_GET);
$_COOKIE = filter_sql($_COOKIE);
$_REQUEST = filter_sql($_REQUEST);
最简单的filter_xss函数是htmlspecialchars()
最简单的filter_sql函数是mysql_real_escape_string()
当然,谁都知道这种过滤filter_sql()只能过滤字符型和搜索型的注入,对于数字型是没有办法的,但也说明做了这层过滤后,只需在后面注意数字型的SQL语句就可以了,遇到了加intval过滤就可以了,这就变得容易多了。
2. 命令执行
对于命令执行,可以从关键字入手,总共可分为3类
(1) php代码执行 :eval等
(2)shell命令执行:exec、passthru、system、shell_exec等
(3) 文件处理:fwrite、fopen、mkdir等
对于这几类需要注意其参数是否用户可控。
3.上传漏洞
对于上传漏洞,也是重点关注的地方,要仔细分析它的处理流程,针对上传的绕过方式是很多的,最保险的方式:在保存文件是采用文件名随机命名和后缀白名单方式。其次要注意的一点是上传文件的地方可能不止一处,不要有遗漏,可能会碰到这样的情况,突然在某个目录里面包含了一个第三方的编辑器在里面。
文件包含漏洞涉及的函数如include() 、include_once()、require()、require_once()、file_get_contents()等
最常见的还是出在下载文件功能函数,例如download.php?file=../../../etc/passwd 这种类型中。
4. 权限绕过
权限绕过可分为两类吧
(1)后台文件的未授权访问。后台的文件没有包含对session的验证,就容易出现这样的问题
(2)未作用户隔离,例如mail.php?id=23显示了你的信件,那么换个ID, mail.php?id=24就查看到了别人的信件,编写代码是方便,把信件都存在一个数据表里,id统一编号,前端展现时只需按id取出即可,但未作用户隔离,判定归属,容易造成越权访问。
这样的例子是很常见的,给某银行做评估是就经常发现这种漏洞。
5. 信息泄露
信息泄露算是比较低危的漏洞了,比如列目录这种就属于部署问题,而与代码审计无关了,而像暴路径、暴源码这种是需要防止的。曾经遇到这样的代码
&?php if(empty($_GET['a'])) {&} ?&
表面上似乎没问题,可是当请求变为 xx.php?a[]=1时,即参数变为数组的时候,就会发生错误以致路径泄露,而用isset判断则不会,当然一个个防太麻烦,建议在配置文件中关闭错误提示,或者在公共文件中加入如下代码以关闭错误显示功能:
&?php error_reporting(0);?&
之前PHP点点通()就有一篇文章:&,介绍了register_globals 的危害以及魔术引用Magic Quotes使用说明。
注明:本文部分内容摘自PHPCHINA
阅读(...) 评论()当前位置:
时间: 12:36:45
发布:宿迁波仔博客 | 分类:经验心得 | 评论:9 | 浏览:
热门文章排行:
具体是在什么文件进行修改呢?
Post: 11:45:29
Post: 11:44:32
一直以来支持
Post: 14:28:39
Post: 17:06:03
怎么修改啊,一头雾水。
Post: 21:17:18
有时间我想测试一下
Post: 10:09:53
这个方法不错,学习一下
Post: 11:52:59
唉,现在的黑客要在网站上挂东西方法很多,防护措施必须做好才行
Post: 8:14:29
识别,过滤是程序员必备的安全知识
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
【相关文章】 9:36:50 11:15:57 20:12:7 22:6:11 21:57:53 13:42:43 9:45:38 9:18:7 21:32:18 11:34:27
本月最热文章
本年最热文章

我要回帖

更多关于 js htmlspecialchars 的文章

 

随机推荐