防止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; |
修改完成后记得 清除一下缓存
旧的版本 按照上述方法加上, 在新的发布版本里面 自带已经加上.