PHP中addslashes及stripslashes的用法
作者:admin 日期:2012-04-07
假设有一首歌曲的名称为King's Highway,在这首歌曲里面单引号(') 是歌名的一部分,是不可缺少的,此时如果想把这首歌曲的信息保存在数据库中,则必须将歌名处理一下,否则会报错的,比如 addslashes($songname),但是当magic_quotes_gpc为on时,php会自动处理,为此,我们可以定义一个函数,来自动处理这些。
GPC(GET、POST、COOKIE)数据的处理原则是,只要是这些数据中可能含有'、"、\,则用下面的 strAddslashes处理一下就行了。
还有一点要注意,就是原始的数据本身就含有\,而这些数据是无用的,使用者录入数据的时候并不知道,此时我们最好在程序中过滤掉这些符号,否则会导致\变成\\,\\ 变成\\\\,数据库中会可能会增加一些冗余的数据,此时可以在用addslashes处理之前先用stripslashes先处理一下,比如将$value = addslashes($value)改为$value = addslashes(stripslashes($value))。
还有些地方可能也要用到stripslashes,比如,用户在表单中输入歌曲名称(比如King's Highway),点击提交以后要在页面上立即显示产品名称,如果php.ini中配置magic_quotes_gpc的值为On,则此时最好要用stripslashes处理一下,否则在页面上将显示King\'s Highway,并不是我们希望看到的结果。
function strAddslashes($value) {
if ($value == '') return false;
if (is_array($value)) {
$value = array_map('strAddslashes', $value);
} else {
if (!get_magic_quotes_gpc()) $value = addslashes($value);
}
return $value;
}
php.ini中magic_quotes_gpc与magic_quotes_runtime的默认配置
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
还有一个magic_quotes_sybase的配置,用于设置转义符号的,在这里顺便提一下。
; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off
一般通常的做法是不管配置magic_quotes_runtime的值是什么,在程序的开头执行一下set_magic_quotes_runtime(false),一般是将这行代码放到公共的包含文件中,有了这个处理以后,显示含有'、"或\的数据时不需要作任何处理,它们均会按原样显示。
我们来做一下测试就大致明白了。
1.从url中传入参数的值
xxx.php?var=ab"cd
$var = $_REQUEST['var'];
magic_quotes_gpc = On
var: ab\"cd
magic_quotes_gpc = Off
var: ab"cd
2.给变量赋固定的值
如果在程序中给变量赋固定的值$var = "ab\"cd",则magic_quotes_runtime为On或Off时输出的值均是一样的。
$var = "ab\"cd";
magic_quotes_runtime = On
var: ab"cd
magic_quotes_runtime = Off
var: ab"cd
3.从文件中读入内容赋给变量
文件char.txt的内容为:ab"cd
$var = file_get_contents('char.txt');
magic_quotes_runtime = On
var: ab\"cd
magic_quotes_runtime = Off
var: ab"cd
4.总结
在PHP中,如果用户输入的内容中含有'、"、\之一,如果你没有正确处理,则非常容易出错,可能有些人遇到过这个问题,看起来简单,但是挺容易出错的,一定要注意细节,细节决定成败,多注意细节不会有坏处。
另外,如果有时间可以多看看康盛创想公司各个产品的代码,他们写的PHP代码考虑得非常细致,也比较简洁。
广告位