CI(CodeIgniter)的"Disallowed Key Characters."异常处理

今天一朋友使用Chrome浏览网站报出了“"Disallowed Key Characters.”的异常,而且是每个页面都报。而且据朋友说是在Chrome的隐身模式下浏览却是正常的,因此怀疑是cookie的问题,经查怀疑是

key:1354725667|8640980|43660|0|0|0 value:1354725667%7C8640980%7C43660%7C0%7C0%7C0

造成的,因为删除这个cookie后浏览就正常了。起初我还以为是以为是缓存服务器出现了异常呢,但后来才知道是CI本身的问题。

这和 CI 的字符串处理类设计有关,是这样的,通过get、post方法提交的字符串,CI 都交给 libraries/Input.php(CI2.0后的版本在system/core/Input.php) 这个类去处理,那很多人就问了,看url并没有特殊符号,为什么也报这样的错误,因为你忽略了一点,cookie 和 session 传输的字符串,也是由这个类统一处理的,也就是说,get、post、cookie、session 的数据都是由这个类处理的,问题往往也出现在 cookie 和 session 上面,所以网上有很多人提供方法就是,清除一下缓存和 cookie ,确实就没问题了,但是隔一段时间就又有问题了,因为新生成的 cookie 里面含有不被匹配通过的字符串,该怎么解决呢?

解铃还需系铃人,既然问题出现在 Input.php 这个类上面,就修改他就好了,在Input.php中这样的一个函数:

function _clean_input_keys($str)
{
    if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str))
    {
        exit('Disallowed Key Characters.');
    }

    return $str;
}

就是它抛出的异常!

因为是“key:1354725667|8640980|43660|0|0|0”导致_clean_input_keys异常的,只要把"|"加进来即可,即把正则

/^[a-z0-9:_\/-]+$/i

改成为

/^[a-z0-9:_\/|-]+$/i

改正后的方法为:

function _clean_input_keys($str)
{
    if ( ! preg_match("/^[a-z0-9:_\/|-]+$/i", $str))
    {
        exit('Disallowed Key Characters.');
    }

    return $str;
}

 

posted @ 2012-12-06 16:22  码农神说  阅读(309)  评论(0编辑  收藏  举报