SQL注入防御之二——注入关键词过滤(PHP)
SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
概述
欢迎来到本人的SQL注入防御系列的第二篇文章,上一篇文章我们讲到了伪静态的技术来防止SQL注入,但是正如我们总结的,不能完全依赖于伪静态就能达到防止SQL注入的目的,因为伪静态,主要是为了隐藏传递的参数名,伪静态只是一种URL重写的手段,既然能接受参数输入,所以并不能完全防止注入。相信来到这里,聪明的你一定有下面的疑问,那么有没有一种方法来阻止接受参数的输入呢?只要阻止恶意SQL语句的输入不就达到防止SQL注入的目的吗?没错,这一篇文章正是介绍如何通过过滤关键的SQL语句的关键词来达到阻止SQL注入的目的。
准备
既然要实现黑名单策略,我们第一步当然先来分析一下到底过滤哪些关键词。SQL语句对于数据库的操作离不开“增删改查”和“文件处理”,那么它们分别有哪些关键词呢?
- 基本关键词: and、or、order
- 增的关键词: insert、into
- 删的关键词: delete
- 改的关键词: replace、update
- 查的关键词: union、select、
- 文件处理的关键词: load_file、outfile
好了,关键词都列出来了,是否就可以直接到下一步呢?不不不,这还不算严谨,仔细想想查字段的时候一般SQL语句除了关键词还有什么呢?没错,符号我们也要把它们都过滤掉。而其实PHP本身在配置文件当中有一个设置项magic_quotes_gpc是关于过滤符号的,单引号、双引号、反斜杠 和空字符都会被转义。 不magic_quotes_gpc在PHP5.3就已经被废弃,从PHP5.4开始就已经被移除了,如果使用PHP最新版本可以不用担心这个问题。
分析
主要代码:
/**
* 过滤sql与php文件操作的关键字
* @param string $string
* @return string
*/
private function filter_keyword( $string ) {
$keyword = "select|insert|update|delete|"|/*|*|../|./|union|and|union|order|or|into|load_file|outfile";
$arr = explode( "|", $keyword );
$result = str_ireplace( $arr, "", $string );
return $result;
}
/**
* 检查输入的数字是否合法,合法返回对应id,否则返回false
* @param integer $id
* @return mixed
*/
protected function check_id( $id ) {
$result = false;
if ( $id !== "" && !is_null( $id ) ) {
$var = $this->filter_keyword( $id ); // 过滤sql与php文件操作的关键字
if ( $var !== "" && !is_null( $var ) && is_numeric( $var ) ) {
$result = intval( $var );
}
}
return $result;
}
/**
* 检查输入的字符是否合法,合法返回对应id,否则返回false
* @param string $string
* @return mixed
*/
protected function check_str( $string ) {
$result = false;
$var = $this->filter_keyword( $string ); // 过滤sql与php文件操作的关键字
if ( !empty( $var ) ) {
if ( !get_magic_quotes_gpc() ) { // 判断magic_quotes_gpc是否为打开
$var = addslashes( $string ); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤
}
//$var = str_replace( "_", "\_", $var ); // 把 "_"过滤掉
$var = str_replace( "%", "\%", $var ); // 把 "%"过滤掉
$var = nl2br( $var ); // 回车转换
$var = htmlspecialchars( $var ); // html标记转换
$result = $var;
}
return $result;
}
总结:
值得注意的是,我们以上的代码只是起到一个抛砖引玉的作用,这只是很基本的过滤关键词方法,正则过滤还能更进一步的优化,因为过滤完整的SQL语句关键词是远远不够的,SQL注入灵活性强,不但能GET注入、POST注入,还能COOKIE中转注入,除此之外,还能利用PHP的注释来打碎关键词重组,如早期绕过强悍的安全狗保护d的绕过策略“S/**/E/**/L/**/E/**/C/**/T”,所以说关键词过滤的正则规则优化空间还很大。还有符号的过滤也不完全依赖magic quotes gpc设置项,因为在GBK的网页语言编码下,利用宽字符的特点也能绕过符号的过滤。
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇: PHP百万级数据导出方案(多csv文件压缩)