防止sql注入补丁
本补丁 由 QQ 木偶人 提供
首先在 www\Application\Common\Common\function.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( "/\bunion\b/i", "/\bselect\b/i", "/\bupdate\b/i", "/\bdelete\b/i", "/\boutfile\b/i", "/\bor\b/i", "/\bchar\b/i", "/\bconcat\b/i", "/\btruncate\b/i", "/\bdrop\b/i", "/\binsert\b/i", "/\brevoke\b/i", "/\bgrant\b/i", "/\breplace\b/i", "/\balert\b/i", "/\brename\b/i", "/\bmaster\b/i", "/\bdeclare\b/i", "/\bsource\b/i", "/\bload\b/i", "/\bcall\b/i", "/\bexec\b/i", "/\bdelimiter\b/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);} |
其次需要替换一个方法 在文件 www\Application\Common\Common\function.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|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1 -9]?\d))))$/', $ip)) return $ip; else return '';} |
方法添加完之后, 在 www\Application\Common\Conf\config.php 文件末尾 添加一行配置
1 2 | 'DEFAULT_FILTER' => 'strip_sql,htmlspecialchars', // 系统默认的变量过滤机制); |
然后修改一下一个php文件 目录在 www\ThinkPHP\Library\Think\Db\Driver.class.php 代码 103 行 加上一行代码

1 | // 复制这行加到相应位置 |
1 | $this->options[PDO::ATTR_EMULATE_PREPARES] = false; |
修改完成后记得 清除一下缓存
旧的版本 按照上述方法加上, 在新的发布版本里面 自带已经加上.
