一、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。
但它的可移植性会降低、性能降低,而且不是所有的数据都需要转义,还需要反转义回来,所以一般不开启
所以为了实现不同版本的兼容性,
需要在代码上加上处理代码
/**
* 清除魔术引用效果
*/
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
[ '"]