php 转义、防转义_addslashes,htmlspecialchars,htmlentities转换或者转义php特殊字符防止xss攻击以及sql注入等等

4 篇文章 0 订阅

一、转义或者转换的目的

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值