QQ登录 账号密码登陆 官网首页
首页 > B2B2C商城 > 开发手册 > 基础教程 > 正文

防止sql注入补丁

本补丁 由 QQ 木偶人  提供

首先在  wwwApplicationCommonCommonfunction.php 文件添加一个方法 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/**
 * 转换SQL关键字
 *
 * @param unknown_type $string
 * @return unknown
 */
function strip_sql($string) {
    $pattern_arr array(
            "/union/i",
            "/select/i",
            "/update/i",
            "/delete/i",
            "/outfile/i",
            "/or/i",
            "/char/i",
            "/concat/i",
            "/truncate/i",
            "/drop/i",            
            "/insert/i"
            "/revoke/i"
            "/grant/i",      
            "/replace/i"
            "/alert/i"
            "/rename/i",            
            "/master/i",
            "/declare/i",
            "/source/i",
            "/load/i",
            "/call/i"
            "/exec/i",         
            "/delimiter/i",            
          
    );
    $replace_arr array(
            union,
            select,
            update,
            delete,
            outfile,
            or,
            char,
            concat,
            truncate,
            drop,            
            insert,
            revoke,
            grant,
            replace,
            alert,
            rename,
            master,
            declare,
            source,
            load,
            call,                     
            exec,         
            delimiter,
                               
    );
 
    return is_array($string) ? array_map(strip_sql$string) : preg_replace($pattern_arr$replace_arr$string);
}


其次需要替换一个方法 在文件 wwwApplicationCommonCommonfunction.php 找到方法 getIP()

1
2
3
4
5
6
7
8
9
10
11
 // 定义一个函数getIP() 客户端IP,
function getIP(){            
    if (getenv("HTTP_CLIENT_IP"))
         $ip getenv("HTTP_CLIENT_IP");
    else if(getenv("HTTP_X_FORWARDED_FOR"))
            $ip getenv("HTTP_X_FORWARDED_FOR");
    else if(getenv("REMOTE_ADDR"))
         $ip getenv("REMOTE_ADDR");
    else $ip "Unknow";
    return htmlspecialchars($ip);
}

将以上方法替换为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 // 定义一个函数getIP() 客户端IP,
function getIP(){            
    if (getenv("HTTP_CLIENT_IP"))
         $ip getenv("HTTP_CLIENT_IP");
    else if(getenv("HTTP_X_FORWARDED_FOR"))
            $ip getenv("HTTP_X_FORWARDED_FOR");
    else if(getenv("REMOTE_ADDR"))
         $ip getenv("REMOTE_ADDR");
    else $ip "Unknow";
     
    if(preg_match(/^((?:(?:25[0-5]|2[0-4]d|((1d{2})|([1-9]?d))).){3}(?:25[0-5]|2[0-4]d|((1d{2})|([1 -9]?d))))$/$ip))          
        return $ip;
    else
        return ;
}



方法添加完之后, 在 wwwApplicationCommonConfconfig.php 文件末尾 添加一行配置


1
2
    DEFAULT_FILTER        => strip_sql,htmlspecialchars,   // 系统默认的变量过滤机制
);


然后修改一下一个php文件 目录在 wwwThinkPHPLibraryThinkDbDriver.class.php 代码 103 行 加上一行代码


1
// 复制这行加到相应位置
1
$this->options[PDO::ATTR_EMULATE_PREPARES]  =   false;

 

修改完成后记得 清除一下缓存 


旧的版本 按照上述方法加上,   在新的发布版本里面 自带已经加上.