【问题标题】:How do I block certain URLs using CodeIgniter?如何使用 CodeIgniter 阻止某些 URL?
【发布时间】:2012-12-21 09:12:31
【问题描述】:

目前一切正常,除了用户可以手动输入 URL,这会弄乱我的网站的 CI 设置方式。例如:

www.somesite.com/folder/

控制器中的这个文件夹应该无法访问...并且需要重定向到该文件夹​​索引页面,这会给他们一个 404 错误。我尝试在 htaccess 文件中对 all 添加拒绝,但它似乎没有做任何事情。

www.somesite.com/folder/index.html

我实际上希望所有文件夹都像这样运行。我在文件夹中有一个 index.html 文件,但它没有被读取。有没有办法在 CI 中解决这个问题?我还遇到了用户能够手动访问控制器功能的问题。我已经尝试按照人们的建议将它们更改为私有,但是我的脚本无法访问它们。例如:

www.somesite.com/controller_file/some_function

如何阻止他们访问此功能?

【问题讨论】:

    标签: php .htaccess codeigniter


    【解决方案1】:

    您可以创建白名单解决方案:

    1. 打开您的应用程序/config/routes.php
    2. 添加您想要允许的路线。
    3. 添加一个包罗万象的路由 .* 并将其重定向到错误处理程序

    Codeigniters 尝试按照它们在数组中列出的顺序匹配路由模式,因此 每当用户输入您未明确允许的路线时,它都会将他重定向到包罗万象的路线

    user-guide on routing

    编辑: 您可以通过仅重定向与特定模式匹配的请求来创建黑名单逻辑,并为所有其他请求保留默认行为。

    【讨论】:

    • 好的,那么我将如何为 www.somesite.com/folder/ 设置路线?我试过 $route['folder/'] = 'error_mess';
    • 我明白了!!!因此,如果我想尝试阻止用户访问控制器功能,我可以简单地这样做: $route['account/account/(:any)'] = 'error_mess';
    • 对每个没有功能的控制器都这样做会是一件坏事吗?
    • 如果你想阻止很多功能,你最好只设置明确允许的路线,然后用一条包罗万象的路线来捕捉其余的路线。这在添加新控制器时确实会增加一些开销,但恕我直言,使用允许路由的白名单是防止用户调用函数的最佳方法。
    • 您不必担心特定功能,因为如果您不希望用户使用它们,您应该坚持使用下划线命名规则(参见 Jeemusu 的回答)
    【解决方案2】:

    就拒绝访问文件系统而言,最好的办法是将ApplicationSystem 文件夹放在webroot 之外。然后编辑您的 index.php 以设置每个文件夹的新路径。我的一般设置如下所示:

    + Root
    | - Application
    | - System
    | + Webroot
    | | - js
    | | - css
    | | - index.php
    | | - ...
    + - ...
    


    至于你的第二个问题,为了防止某些功能被直接从 url 访问,你需要在它们前面加上一个下划线。

    所以不是

    public function some_function() {...}

    使用 public function _some_function() {...}

    然后可以在您的控制器中使用 $this->_some_function(); 调用它

    如果您有任何 AJAX 函数,则需要从其名称中删除下划线以使其可访问。您可以通过使用以下条件包装您的函数来阻止用户直接从 URL 访问它们。

    if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')) {}
    

    以上检查请求是否通过 AJAX。

    【讨论】:

    • 我认为它有效,但它没有...我有一个调用某个函数的 ajax 调用,当我添加下划线时,是的,它确实阻止我直接访问它,但它也阻止该 ajax 请求或任何形式的操作。
    • 为什么不接受我的回答?无论如何,对于 AJAX 请求,您需要从函数中删除下划线,但添加一个条件来检查 ajax 是否已发布数据,从而阻止用户直接从 URL 访问它。请参阅我的更新答案。
    • 因为我认为它有效,但是当我使用下划线时,您无法访问表单提交或 ajax 请求的功能。我看到了您对 AJAX 的编辑,这会起作用……但如果是表单提交呢?
    • 如果是表单提交,你只需检查它是否已发布,或者有发布数据。
    猜你喜欢
    • 1970-01-01
    • 2015-05-15
    • 2016-09-25
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多