PHP中addslashes及stripslashes的用法

假设有一首歌曲的名称为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代码考虑得非常细致,也比较简洁。



上一篇: 纠结的PHP编码规范
下一篇: MySQL中取随机数据的方法
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: php
相关日志:
评论: 0 | 引用: 0 | 查看次数: 1780
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭

 广告位

↑返回顶部↑