一、转义或者转换的目的
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处理过的字符串或数组
* @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
* @return string
*/
function html_in($str) {
$search = array(
"''si", // 去掉 javascript
"']*?>.*?'si" // 去掉iframe
);
$replace = array("", "");
$str = @preg_replace($search, $replace, $str);
$str = htmlspecialchars($str);
if (!get_magic_quotes_gpc()) {
$str = addslashes($str);
}
return $str;
}
/**
* 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 $str;
}
原文链接:https://blog.csdn.net/weixin_29137997/article/details/115103854