PHP-CI入库带%字符的异常?

PHP-CI入库带%字符的异常?

归属感 发布于 2017-06-27 字数 124 浏览 1058 回复 2

用CodeIgniter 想入库一段代码,$str = sprintf("%01y", 2);但是发现入库后,代码变成$str = sprintf("y", 2);这是怎么回事啊?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

甜柠檬 2017-10-15 2 楼

这是因为CI中remove_invisible_characters函数造成的,这个函数在 core/Common.php中,
function remove_invisible_characters($str, $url_encoded = TRUE)
{
$non_displayables = array();

// every control character except newline (dec 10)
// carriage return (dec 13), and horizontal tab (dec 09)

if ($url_encoded)
{
$non_displayables[] = '/%0[0-8bcef]/'; // url encoded 00-08, 11, 12, 14, 15
$non_displayables[] = '/%1[0-9a-f]/'; // url encoded 16-31
}

$non_displayables[] = '/[x00-x08x0Bx0Cx0E-x1Fx7F]+/S'; // 00-08, 11, 12, 14-31, 127

do
{
$str = preg_replace($non_displayables, '', $str, -1, $count);
}
while ($count);

return $str;
}

下面这两行代码会把%0与%1开头的3个字符过滤掉,把着两行代码注释了或者,自己改造一下就没问题了:
if ($url_encoded)
{
$non_displayables[] = '/%0[0-8bcef]/'; // url encoded 00-08, 11, 12, 14, 15
$non_displayables[] = '/%1[0-9a-f]/'; // url encoded 16-31
}

瑾兮 2017-08-17 1 楼

经验证入库没有问题。

原因是 通过 input 类 获取get/post 参数时过滤的掉的,及:

$this -> input -> post('args',true);

重点是 第二个参数,ci 默认是false, 不会过滤脚本以及特殊或者非法字符的。

如果不想过滤的话,接收参数就别指定 $xss_clean 即可

函数定义如下:

function post($index = NULL, $xss_clean = FALSE){...}

在这个方法中调用了 _fetch_from_array(),在这个方法中通过判断传来得$xss_clean的值又调用了 Security 类中的 xss_clean() 方法,在这个方法中又调用了 Common 文件中的remove_invisible_characters() 函数。

重点是:

$non_displayables = array(

'/%0[0-8bcef]/', // url encoded 00-08, 11, 12, 14, 15
'/%1[0-9a-f]/', // url encoded 16-31
'/[x00-x08]/', // 00-08
'/x0b/', '/x0c/', // 11, 12
/[x0e-x1f]/' // 14-31
);

%00 - %1F 对于url参数来说没有任何意义,这些字符也是看不到的,例如:

 %00 null字符
%01 标题开始(start of header)
%02 文本开始(start of text)
%03 文本结尾(end of text)
%04 传输结束(end of transmission

%10 数据通讯换码(data link escape)
%11 设备控制1(device control 1)
%15 否定应答(negative acknowledge)
%16 同步(synchronize)
%1F 单元分隔符(unit separator)

等等。。。