3

我正在将 codeigniter 与 jquery 一起使用,如果您向我解释如何保护控制器免受直接访问,那就太好了。例如,我使用该标准 jquery 行查看:

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

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

4

2 回答 2

3

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

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

仍然可以解决,因为可以停止该过程并使用已发行的令牌,但它会阻止任何人只是在玩 curl (所以真的不值得努力)。

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

于 2012-10-15T02:52:50.297 回答
3

is_ajax_request()CodeIgniter 输入类有一个为此目的调用的方法。

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

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


看:

于 2012-10-15T03:12:29.783 回答