PHP的addslashes函数跟addcslashes函数的区别及详解

一、addslashes是使用反斜杠引用字符串

1.参数只有一个,为要转义的字符串

2.可以被转义的字符为:单引号(')、双引号(")、反斜线(\)与 NUL(null字符)。

3.例子

echo $string = addslashes('aaa"a\dd"aa"'), PHP_EOL;   // 结果为 : aaa\"a\\dd\"aa\"

4.它的反转义函数为:

stripslashes反引用一个引用字符串

echo stripslashes($string), PHP_EOL;            // 还原为 :为 aaa"a\dd"aa"

ps:php在5.3之前是能使用魔术引用的,它是php的安全机制,效果等同于addslashes。

        但它的可移植性会降低、性能降低,而且不是所有的数据都需要转义,还需要反转义回来,所以一般不开启

  • magic_quotes_gpc 影响到 HTTP 请求数据(GET,POST 和 COOKIE)。不能在运行时改变。在 PHP 中默认值为 on 参见 get_magic_quotes_gpc()
  • magic_quotes_runtime 如果打开的话,大部份从外部来源取得数据并返回的函数,包括从数据库和文本文件,所返回的数据都会被反斜线转义。该选项可在运行的时改变,在 PHP 中的默认值为 off 参见 set_magic_quotes_runtime()get_magic_quotes_runtime()
  • magic_quotes_sybase 如果打开的话,将会使用单引号对单引号进行转义而非反斜线。此选项会完全覆盖 magic_quotes_gpc。如果同时打开两个选项的话,单引号将会被转义成 ''。而双引号、反斜线 和 NULL 字符将不会进行转义

所以为了实现不同版本的兼容性,

需要在代码上加上处理代码

/**
 * 清除魔术引用效果
 */
function cleanQuotes() {
    //TODO : 获取代码配置函数,如果配置变量显示需要清除,则往下执行,反之则不执行
    if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
        if (isset($_GET)) $_GET = _stripSlashes($_GET);
        if (isset($_POST)) $_POST = _stripSlashes($_POST);
        if (isset($_REQUEST)) $_REQUEST = _stripSlashes($_REQUEST);
        if (isset($_COOKIE)) $_COOKIE = _stripSlashes($_COOKIE);
    }
    if (function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime()) {
        set_magic_quotes_runtime(false);
    }
//    if (ini_get('magic_quotes_runtime') != 0) {          //和上一个操作等效
//        ini_set('magic_quotes_runtime', 0);
//    }
    if (ini_get('magic_quotes_sybase') != 0) {
        ini_set('magic_quotes_sybase', 0);
    }
}

/**
 * 采用stripslashes反转义特殊字符
 * @param array|string $data 待反转义的数据
 * @return array|string 反转义之后的数据
 */
function _stripSlashes($data) {
    return is_array($data) ? array_map('_stripSlashes', $data) : stripslashes($data);
}
cleanQuotes(); //执行函数

这样所有的魔术引用都会还原。

如果数据在使用数据库之前可以使用addslashes转义字符串,但更建议使用mysql专用函数mysqli_real_escape_string,它跟字符编码挂钩。

二、addcslashes以 C 语言风格使用反斜线转义字符串中的字符

1.参数有两个,第一个参数为要转义的字符串,第二个参数为需要被转义的字符列表

2. 它的反转义函数为:

stripcslashes反引用一个使用 addcslashes() 转义的字符串

3.例子

$str = 'ch[ \'"]';
echo $str, PHP_EOL;
echo $string = addcslashes($str, 'A..z][ \'"'), PHP_EOL;
echo stripcslashes($string), PHP_EOL;

输出

ch[ '"]
\c\h\[\ \'\"\]
ch[ '"]

它可以自己选择要转义的参数,  A..z 代表大小写字母

有一点要注意:如果像制表符,换页符的字母被转义,是反转义不回来的,还会影响其他字母

$str = 'chtr[ \'"]at';
echo $str, PHP_EOL;
echo $string = addcslashes($str, 'A..z][ \'"'), PHP_EOL;
echo stripcslashes($string), PHP_EOL;

结果

chtr[ '"]at
\c\h\t\r\[\ \'\"\]\a\t
[ '"]






你可能感兴趣的:(php)