本文实例分析了CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患。分享给大家供大家参考,具体如下:
php CI框架中URL特殊字符有很多是不支持的,导致像c ,括号这些常用的分类,字符都无法正常显示很头痛,而在配置里增加单引号’ 反斜杠 这种特殊字符又很容易给sql注入
在默认的config配置基础上加上: =()特殊字符
代码语言:javascript复制#$config['permitted_uri_chars'] = 'a-z 0-9~%.:_-';
$config['permitted_uri_chars'] ='a-z 0-9~%.:_- =()';
在CI框架中,尽量使用AR类进行数据库查询是比较靠谱的,因为在底层会帮助使用者进行一次有效的转义,但也仅仅是转义而已。
过滤的方法是escape_str()
:
function escape_str($str, $like = FALSE)
{
var_dump($str);
echo "n" ;
if (is_array($str))
{
foreach ($str as $key = $val)
{
$str[$key] = escape_str($val, $like);
}
return $str;
}
if (function_exists('mysql_real_escape_string'))
{
$str = addslashes($str);
}
elseif (function_exists('mysql_escape_string'))
{
$str = mysql_escape_string($str);
}
else
{
$str = addslashes($str);
}
// escape LIKE condition wildcards
if ($like === TRUE)
{
$str = str_replace(array('%', '_'), array('%', '_'), $str);
}
return $str;
}
该方法仅仅是调用了一些转义函数,并对like参数进行过滤。
如果查询的变量没有被单引号包裹,那么就无法进行保护
ci 框架默认的过滤函数是escape :
代码语言:javascript复制xx". $this- db- escape ( $xxx )."xx
由于数组的$key
过滤不严直接带入SQL查询的漏洞屡见不鲜:
$arr = array(
'name'= "2' and 1=2",
"hello'"= "2");
);
输出结果:
Array( [name] = 2’ and 1=2 [hello’ union select ] = 2 )
如果真实sql语句传入上面两个参数合并起来就可以查询出所有信息了,属于sql注入了
希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。