【问题标题】:Redirect when wrong parameter in CodeIgniterCodeIgniter 中参数错误时重定向
【发布时间】:2012-11-07 07:48:40
【问题描述】:

例如我有一个工作网址:

http://localhost/article/154

其中 154 是 db 中文章的 $id,控制器 article 看起来像例如:

function index ($id = '')
{

// some code here

}

现在,当我输入如下内容时:

http://localhost/article/154dsdead34

我收到错误,因为该 ID 不在我的数据库中。但是,页面上显示了 php 错误,整个页面都搞砸了。

相反,我需要重定向到名为 custom404 的控制器,它可以处理此问题(或者如果由于某种原因无法直接重定向('/'); 到主页)

对变体(例如大的 $id 编号或在 db 中找不到)的相同修复:

http://localhost/article/3004534534534234600234

或(其他参数)

http://localhost/article/154/something/derer/asdasd

如何在 CodeIgniter 中进行这样的安全检查?

【问题讨论】:

    标签: codeigniter codeigniter-2 codeigniter-routing


    【解决方案1】:

    有很多方法可以做到这一点。

    在函数内部,定义($id = NULL)使其跳过空错误,第一条语句可以是if ( ! is_numeric($id)) show_404();

    您也可以运行$id = (int)$id;,这应该会将154dsdead34 变成154

    路由也是一种选择。你喜欢什么?

    你可以这样做;在函数内部运行:

    if ( ! preg_match("~^article/\d+$~", $this->uri->uri_string())) {
        // Redirect user
    }
    

    相应地改变。 ~ 打开和关闭正则表达式。它通常是/,但像~ 一样,您不必逃避/ (\/)。 ^ 是字符串的开头,$ 是结尾。 \d+ 等于 [0-9]+ 并且需要一位数或更多位的大小写。我希望这是有道理的。

    【讨论】:

    • localhost/article/154/somehtingwrong/blablabla/eee 类型的链接怎么样?现在,它会抛出错误。
    • 路线是最简单的,但我不知道如何在正则表达式中做到这一点。我的意思是在 article/ 被允许之后只有 id (我可以在控制器中处理的 db 中的 id 检查),而像 /asdasdsad/asdasd/asda 这样的其他所有内容都不允许。有什么建议吗?
    • 添加了另一个带有解释的解决方案。只是出于好奇,这些随机网址是否有效有什么关系?是为了潜在的 SEO 优化吗?
    • 它不工作 ;( . 像 article/154/somehtingwrong/blablabla/eee 这样的链接会抛出错误 ;(
    • 终于!您的解决方案有效。但是,我需要从 $route['article/(:num)'] = 'article/$1'; 更改我的路线。到 $route['article/(:any)'] = 'article/$1'; .所以 num 到任何你的 preg_match 都会获胜。非常感谢。
    【解决方案2】:

    通过 config 文件夹中的 routes.php,只检查你需要使用的 6 位数字

    $route['article/([0-9]{1,6})'] = 'article/$1' ;
    

    并将所有其他情况提到 404 或发送给任何其他控制器

    【讨论】:

    • 不工作。如果错误,我需要重定向。您的建议与我的旧建议相同: $route['article/(:num)'] = 'article/$1' ;这根本没有帮助。
    • “并将所有其他情况提到 404 或发送给任何其他控制器”是什么意思?我当前在 routes.php 中是 $route['404_override'] = 'custom404';我怎样才能改变它?
    • 哦为custom404看看link
    • 我知道。如果有人写它们,我需要忽略其他部分,例如而不是良好的链接 localhost/article/154/ 他写了一些想像:localhost/article/154/somehtingwrong/blablabla/eee 我需要忽略 id 之后的部分。我的意思是这部分:/somehtingwrong/blablabla/eee
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多