我正在使用带有jquery的codeigniter,如果你向我解释如何保护控制器免受直接访问会很好。 例如, 我查看了标准的jquery行:
$('#handler').load('tools/get_stats');
工具它是我的控制器,具有加载统计信息的功能。如果我直接在脚本http://site.com/tools/get_stats的浏览器完整地址中编写,浏览器当然会打开该数据。 如何保护浏览器的直接控制器访问?我希望我的数据只在视图中加载,而不是在控制器直接访问。
答案 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()
方法中包含这个逻辑,否则它可以在你的控制器中逐个方法地实现。
请参阅: