PHP默认设置中对gpc(GET,POST,COOKIE)所提交的数据进行特殊字符转义,防止一些意外情况.
即magic_quotes_gpc = 1
这时会在',", \前面加上\ 对其转义,
如i'm a "dog".  提交后变成=> i\'m a \"dog\".上面的代码检测php.ini中magic_quotes_gpc是否为1,如不是,则手动用函数来进行转义。
同时也对上传的文件变量$_HTTP_POST_FILES进行了一些处理。

解决方案 »

  1.   

    第一个fucniton转义处理第二个function对$_files里的文件信息分别分开赋值到上传表单关键字的为首的变量里discuz源码
      

  2.   

    这段代码有一个毛病,不知从何而来?这个函数用于转义传入数据中的特殊符号
    参数$force=1可强制进行转义
    $GLOBALS['magic_quotes_gpc']表示系统的magic_quotes_gpc开关状态,见后续代码。默认是打开的,即由php自动进行转义
    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;
    }
    取得系统的register_globals开关状态
    $register_globals = @ini_get('register_globals');
    取得系统的magic_quotes_gpc开关状态
    $magic_quotes_gpc = @get_magic_quotes_gpc();注意这里!!!
    if(!$magic_quotes_gpc) { //如果magic_quotes_gpc开关关闭
    exit('Please set magic_quotes_gpc = On in your php.ini.');//退出运行,并提示打开magic_quotes_gpc开关。毛病就在这里!既然要打开magic_quotes_gpc开关,那么函数daddslashes的作用有何在呢?空走一趟?
    }注意这里!!!
    有上述,既然magic_quotes_gpc开关必然打开,那么!$magic_quotes_gpc就永远为假,何必还写上呢?
    if(!$register_globals || !$magic_quotes_gpc) {
    以下从http环境数组构造全局变量,以使register_globals开关的设置失效。
    @extract(daddslashes($HTTP_POST_VARS), EXTR_SKIP);
    @extract(daddslashes($HTTP_GET_VARS), EXTR_SKIP);
    if(!$register_globals) {
    foreach($HTTP_POST_FILES as $key => $val) {
    $$key = $val['tmp_name'];
    ${$key.'_name'} = $val['name'];
    ${$key.'_size'} = $val['size'];
    ${$key.'_type'} = $val['type'];
    }
    }
    }
      

  3.   

    服了楼上了。
    是不是任何人的代码你都要测试一遍?
    有这么多精力吗?
    PHP版有这位斑竹真是幸福!!
      

  4.   

    非常感激上面各位的大哥,不过我发现不使用daddslashes函数也可以进行转义,不知道是为什么?下面是两个代码:
    a.php:<form action="b.php" method="post">
    <input type="text" name="abc">
    <input type="submit">
    </form>b.php:<?
    $register_globals = @ini_get('register_globals');
    $magic_quotes_gpc = @get_magic_quotes_gpc();if(!$magic_quotes_gpc) {
    exit('Please set magic_quotes_gpc = On in your php.ini.');
    }if(!$register_globals) {
    @extract($HTTP_POST_VARS, EXTR_SKIP);
    @extract($HTTP_GET_VARS, EXTR_SKIP);
    if(!$register_globals) {
    foreach($HTTP_POST_FILES as $key => $val) {
    $$key = $val['tmp_name'];
    ${$key.'_name'} = $val['name'];
    ${$key.'_size'} = $val['size'];
    ${$key.'_type'} = $val['type'];
    }
    }
    }
    echo $abc;
    ?>输入123' 输出是123\'  不知道在那里进行转义了?
      

  5.   

    原来设置了magic_quotes_gpc=on 就自动转义,谢谢各位啦~~~~~
      

  6.   

    正如xuzuning(唠叨) 所说 我以前看discuz代码的时候也注意过这里加那句根本没什么必要