发新话题
打印

关于magic_quotes魔法字符串

关于magic_quotes魔法字符串

我记得以前的Discuz是需要magic_qutoes_gpc = on和magic_quotes = on的,不知道现在还需要不需要,关于这个设置,我自己有我自己的一些想法。
get_magic_quotes = on的时候,$_GET,$_POST,$_REQUEST还有cookie中的变量会自动进行转义,相当于自动执行addslashes()。这么一来,方便和不方便的问题就一起来了。
好处:
1、$_GET,$_POST,$_REQUEST的变量值可以直接使用,例如,可以很方便生成SQL语句去查询。
2、可以在一定程度上避免利用地址栏的SQL注入
问题:
3、如果数据不是来源于$_GET,$_POST,$_REQUEST,以为有magic_quotes而不加转义,就会出错

我举个例子说一下
1例如,你可以直接用Select * from aaa where name = '$var'的语句使用传递过来的参数,这个很简单,大家都能明白,当name有引号斜杠之类的就不用多出理一次了
2例如,在magic_quotes=off的情况下地址栏输入:
viewthread.php?tid=xxx';inseart into cdb_users ……;
或者xxxx.php?tid=xxx';drop table xxx;
执行到SQL的时候,where tid = '$var'就变成了
where tid = 'xxx' ; inseart into cdb_users …… ;
where tid = 'xxx' ; drop table xxx ;
看,没有这个自动的转义,就被别人乘虚而入了吧,呵呵

[ 本帖最后由 renart 于 2006-7-11 04:26 PM 编辑 ]

TOP

3例如,并不是所有数据都是从$_GET,$_POST,$_REQUEST来的,比方说有个变量,值是i'm renart,如果你认为magic_quotes是1,就不用手动addslashes(),那么sql中直接用这个变量就会出错了:Select * from aaa where name = '$var'成为Select * from aaa where name = 'i'm renart',这就错了吧,呵呵

这个时候大家又会说了,判断一下变量来源不就行了,是啊,是个好办法,不过,现在我们用的一些封装类的,无法判断变量来源,是都加还是都不加?很难办吧,举例说吧,数据库里的值是i'm renart,GET到就是i\'m renart,我们不知道来源啊,只好用一下addslashes(),就成为 i\\\'m renart,写回数据库就成为 i\\'m renart

为了避免双层转义,看php手册里面说要用stripslashes()
不过好像会把\-\,等正则表达式里面的\都给去掉,我遇到过这样的事情,不知道是不是和这个设置直接相关

[ 本帖最后由 renart 于 2006-7-11 04:29 PM 编辑 ]

TOP

刚才整理资料,加上自己碰到的一些问题重新组织了一下,希望对大家有用

另外,发文长度好短,受不了了,哈哈

TOP

DZ的common里面有很好的方法.
复制内容到剪贴板
代码:
$magic_quotes_gpc = get_magic_quotes_gpc();
$register_globals = @ini_get('register_globals');

if(!$register_globals || !$magic_quotes_gpc) {
        @extract(daddslashes($_POST));
        @extract(daddslashes($_GET));
        if(!$magic_quotes_gpc) {
                $_FILES = daddslashes($_FILES);
        }
}


本人乃老师的学生.
大家可以叫我学生.
My name is cnstudent.
I am cnteacher's student.
Winner never cheat.
Cheater never win.
欺骗的人永远不会成功。
成功的人永远不会欺骗。

TOP

知道有这个方法,呵呵,我是整理出来给大家看看,让大家有这个意识,我觉得这个问题可大可小啊,呵呵

TOP

发新话题