花江边社区—论坛's Archiver

猥琐男 发表于 2009-9-18 16:57

一个关于discuz源代码的问题

函数如下:
function daddslashes($string, $force = 0)
{
if(!$GLOBALS['magic_quotes_gpc'] || $force)
{
   if(is_array($string))
   {
    foreach($string as $key => $val)
    {
     $string[$key] = daddslashes($val, $force);
    }
   }
   else
   {
    $string = addslashes($string);
   }
}
return $string;
}
请高人指点 这个函数是如何实现对数据的转译工作的
是用PHP自带的magic_quotes_gpc函数吗
源文件中根本没有正则表达式之类的实现转译功能的语句

atux 发表于 2009-9-18 19:43

刚刚查DZ源文件,这个函数应该是在include/global.func.php里的吧
现在的源文件里好像比你帖出来的多了第二行代码[code]function daddslashes($string, $force = 0) {
        !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
        if(!MAGIC_QUOTES_GPC || $force) {
                if(is_array($string)) {
                        foreach($string as $key => $val) {
                                $string[$key] = daddslashes($val, $force);
                        }
                } else {
                        $string = addslashes($string);
                }
        }
        return $string;
}[/code]

这个函数是防SQL注入的
其中PHP自带函数get_magic_quotes_gpc(void)的功能是获取PHP环境配置的变量magic_quotes_gpc
PHP环境配置的变量magic_quotes_gpc有on和off两种状态,返回0表示off,1表示on; 在php.ini文件里可以看到(如果你电脑上配置有PHP环境的话可以打开php.ini看看)

当 magic_quotes_gpc=on时,所有的 ' (单引号), " (双引号), \ (反斜线) 和空字符(NULL)会自动转为含有反斜线的溢出字符。
而magic_quotes_gpc=off时则不作上述处理,此时就有可能会导致SQL注入问题,所以off状态时字符串要经addslashes()函数处理
addslashes ( string str )函数也是PHP自带的,其作用是返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线,这些字符包括单引号(')、双引号(")、反斜线(\)与 NULL(NULL 字符)。

上面的daddslashes($string, $force = 0)函数是自定义的,而$string = addslashes($string);则是使用了PHP自带的string addslashes ( string str )函数。

小结:
为了防SQL注入
当magic_quotes_gpc=off时字符串要经addslashes()函数处理
当magic_quotes_gpc=on时字符串会默认将敏感字符(单引、双引等)加把斜线处理(此时不可再多加addslashes()函数)。

猥琐男 发表于 2009-9-18 21:56

Huajb65.cn
果然是实力派
佩服
我就知道你会来回答我的问题
下次我就直接点名叫你回答了哈

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.