如何保护控制器免受直接访问?

时间:2012-10-15 02:35:24

标签: php jquery codeigniter

我正在使用带有jquery的codeigniter,如果你向我解释如何保护控制器免受直接访问会很好。 例如, 我查看了标准的jquery行:

$('#handler').load('tools/get_stats');

工具它是我的控制器,具有加载统计信息的功能。如果我直接在脚本http://site.com/tools/get_stats的浏览器完整地址中编写,浏览器当然会打开该数据。 如何保护浏览器的直接控制器访问?我希望我的数据只在视图中加载,而不是在控制器直接访问。

2 个答案:

答案 0 :(得分:3)

通常,由于需要提供访问权限和HTTP的简单性,您无法以有意义的方式执行此操作。或者更基本的是,您不能拒绝访问您需要提供的信息(在这种情况下是无状态连接信息)。最好的初始步骤是确保控制器只允许访问用户应该访问的数据(无论它们如何连接),而不是根据容易被篡改的请求信息进行限制。

话虽这么说,如果你有一些奇怪的理由真的追逐它,你可以使用某种形式的单一用途令牌与AJAX请求一起传递。例如,您可以生成一个随机密钥,将其保存在某个地方(理想情况下只是在内存中使用哈希表,因为永远不会有足够长的延迟以保证其他情况)并将其传递给将发出ajax的页面请求。令牌随请求一起传回并被删除,然后该令牌将不再有效。控制器将无法直接访问,因为它需要一个令牌。

这样仍然能够解决,因为可以暂停进程并使用已发布的令牌,但它会阻止任何人只是玩弄卷曲(所以真的不值得努力)

长话短说,你不能以任何方式做到这一点,任何人都不能在10分钟内解决。专注于确保只公开所需的数据,无论其检索方式如何。

答案 1 :(得分:3)

为此,CodeIgniter输入类有一个名为is_ajax_request()的方法。

if ($this->input->is_ajax_request()) 
{
    //do something
} 
else 
{
    show_error("No direct access allowed");
    //or redirect
} 

如果你有一个专门的Ajax控制器,你当然可以在__construct()方法中包含这个逻辑,否则它可以在你的控制器中逐个方法地实现。


请参阅: