最新消息: 新版网站上线了!!!

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

一、转义或者转换的目的

    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()

http://www.3qphp.com/php/phpjch/4.html

三、实例

        场景说明:比如想在留言板贴出一段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.jpg

(图1)


 1. 在表单中提交html代码留言如图2-1

8.jpg

(图2-1)

图2-2为输出结果

3.png

(图2-2)

2. 在表单中提交一段js代码如图3-1

4.png

(图3-1)


结果如图3-2出现弹窗,而不是我想要的js代码,这是ie内核的浏览器下,非ie的像谷歌,火狐没有出现此弹窗但是也没有输出那段js代码到页面

5.png

(图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代码,而不是输出一个表单

6.png

(图4-1)


同样提交上面的javascript代码结果如下图5-1输出的js代码,而不是变成弹窗

7.png

(图5-1)

四、开源系统中的应用

1. phpcms中使用代码

/**
 * 返回经addslashes处理过的字符串或数组
 * @param $string 需要处理的字符串或数组
 * @return mixed
 */
function new_addslashes</a>($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</a>($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 htmlentities</</a>a>($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(
        "'<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 $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;
}

转载请注明:谷谷点程序 » addslashes,htmlspecialchars,htmlentities转换或者转义php特殊字符防止xss攻击以及sql注入