2012-12-21 58 views
-1

目前一切工作正常,除了用户可以手动输入一个URL,这会弄乱CI如何为我的网站设置。例如:如何使用CodeIgniter阻止某些URL?

www.somesite.com/folder/

此文件夹中的控制器不应该容易......并且需要重定向到该文件夹​​的索引页,这将给他们一个404错误。我试过在htaccess文件中添加拒绝,但它似乎没有做任何事情。

www.somesite.com/folder/index.html

其实我是想所有文件夹功能,喜欢这个。我在文件夹中有一个index.html文件,但它没有被读取。有没有办法在CI中解决这个问题?我也遇到了用户能够手动访问控制器功能的问题。我试图按照人们的建议将它们更改为私有,但随后我的脚本无法访问它们。例如:

www.somesite.com/controller_file/some_function

如何阻止他们访问这个功能呢?

回答

1

您可以创建一个白名单sollution:

  1. 打开你的application/config/routes.php文件
  2. 添加要允许的路由。
  3. 添加一个包罗万象的路线.*,重定向到一个errot处理

Codeigniters改掉他们在阵列中列出的顺序路由模式匹配,从而 只要用户输入的路线,你没有明确允许它会allqays他重定向到包罗万象的路线

user-guide on routing

编辑: 您可以通过重定向请求只有符合特定模式的创建黑名单逻辑,并保持defaul对所有其他人的行为。

+0

好的,那么我将如何为www.somesite.com/folder/设置路线?我试过$ route ['folder /'] ='error_mess'; – KraigBalla

+0

我懂了!因此,如果我想尝试阻止用户访问控制器功能,我可以简单地执行此操作:$ route ['account/account /(:any)'] ='error_mess'; – KraigBalla

+0

这样做到每个控制器比它有一个功能是一件坏事? – KraigBalla

1

只要拒绝访问文件系统,最好的办法就是将您的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。

+0

我认为它的工作,但它不......我有一个ajax调用,调用某个函数,当我添加底条,是的,它确实阻止我直接访问它,但它也阻止了该Ajax请求或对此事采取任何形式的行动。 – KraigBalla

+0

你为什么不接受我的回答?无论如何,对于AJAX请求,您需要从您的functons中删除underbar,但添加一个条件来检查数据是否已由ajax发布,从而阻止用户直接从URL访问它。看到我更新的答案。 – Jeemusu

+0

因为我认为它有效,但是当我使用下划线时,无法访问表单提交或ajax请求上的功能。我看到了你对AJAX的编辑,这会起作用......但是如果它是表单提交呢? – KraigBalla