php转义、防转义_addslashes,htmlspecialchars,htmlent。
。。
⼀、转义或者转换的⽬的
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'];
>
图1是原页⾯效果
a6b08e90913f6990d53276b3a1c5172f.png
(图1)
1. 在表单中提交html代码留⾔如图2-1
7b880d8ef62c55a23d603b380f3cb9b3.png
(图2-1)
图2-2为输出结果
04c8b02b8f2649b19bae6c6755fdb287.png
(图2-2)
2. 在表单中提交⼀段js代码如图3-1
f95c61800eccf2cf3be1bc61e591172d.png
(图3-1)
结果如图3-2出现弹窗,⽽不是我想要的js代码,这是ie内核的浏览器下,⾮ie的像⾕歌,⽕狐没有出现此弹窗但是也没有输出那段js代码到页⾯
f4c56e8d7943c7423865180775659546.png
(图3-2)
可是代码如果进⾏了转义处理就不会像上⾯这样了,添加htmlspecialchars()函数进⾏处理<?php
echo "留⾔板输出的结果是:";
echo htmlspecialchars($_GET['n']);
>
同样提交上⾯的html代码结果如下图4-1输出的html代码,⽽不是输出⼀个表单
21acff3166cac7405f4e0f0743c316a5.png
(图4-1)
同样提交上⾯的javascript代码结果如下图5-1输出的js代码,⽽不是变成弹窗
bafa6da40aa19ca1fe47f6c157589950.png
(图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 $string;
}
/**
* 返回经stripslashes处理过的字符串或数组
html代码转链接
* @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 $string;
}
/**
* 返回经htmlspecialchars处理过的字符串或数组
* @param $obj 需要处理的字符串或数组
* @return mixed
*/
function new_html_special_chars($string) {
$encoding = 'utf-8';
if(strtolower(CHARSET)=='gbk') $encoding = 'ISO-8859-15';
if(!is_array($string)) return htmlspecialchars($string,ENT_QUOTES,$encoding); foreach($string as $key => $val) $string[$key] = new_html_special_chars($val); return $string;
}
function new_html_entity_decode($string) {
$encoding = 'utf-8';
if(strtolower(CHARSET)=='gbk') $encoding = 'ISO-8859-15';
return html_entity_decode($string,ENT_QUOTES,$encoding);
}
function new_htmlentities($string) {
$encoding = 'utf-8';
if(strtolower(CHARSET)=='gbk') $encoding = 'ISO-8859-15';
return htmlentitiesa>($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 $value;
}
else
{
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);
}
}
else
{
$obj = addslashes_deep($obj);
}
return $obj;
}
/**
* 递归⽅式的对变量中的特殊字符去除转义
*
* @access  public
* @param  mix    $value
*
* @return  mix
*/
function stripslashes_deep($value)
{
if (empty($value))
{
return $value;
}
else
{
return is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value); }
}
/**
* html代码输⼊
* @param unknown $str

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。