Codeigniter - 限制从URL调用直接访问控制器功能

时间:2013-01-19 13:15:37

标签: php codeigniter codeigniter-2

我想知道是否有任何方法可以限制通过URL访问我的控制器功能。但我想通过网站上的链接给他们打电话。例如,如果我的网站中有一个指向控制器功能的链接:

<a href='test/function'>Call me</a>

但是当我将上述URL放在我的浏览器地址栏中时,我不希望调用控制器功能。任何人都可以帮忙吗?

5 个答案:

答案 0 :(得分:3)

这是不可能的。 Apache和CodeIgniter允许通过手动输入的浏览器URL或访问的超链接访问您的PHP脚本到外部世界。这两种方案都以完全相同的方式连接到您的Web应用程序,但它们只是以不同方式实现

您可以通过以下方式仅允许访问CodeIgniter脚本(即阻止公共用户访问控制器):

if ( ! defined('BASEPATH')) exit('No direct script access allowed');

正如马库斯指出的那样,你可以使用类似的东西:

if (!$_SERVER['HTTP_REFERER']) $this->redirect('/home');

但它通常非常不一致。

答案 1 :(得分:2)

解决方案:将此代码放在每个控制器方法的开头

if (defined('BASEPATH') && !$this->input->is_ajax_request()) 
    exit('No direct script access allowed'); 

答案 2 :(得分:0)

正如您在评论中所述,如果您想通过AJAX加载链接:

您的加价:

<a href="test/function" data-key="abc">

你的jquery:

$('a').on('click',function(){
    var data = $(this).data('key');
    $('#result').load($(this).attr("href") + '?key=' + data);
});

然后在CodeIgniter控制器中,检查您的密钥是否存在并匹配(“abc”),否则返回403或类似的东西。

此外,您当然可以检查$_SERVER['HTTP_REFERER']以查看用户来自哪里(但这很容易被欺骗)并且只允许在您自己的网站上发出GET请求时进行访问。

答案 3 :(得分:0)

这确实有帮助。我还将此添加为附加检查

$allowed_host = gethostname();
$host = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);
if(substr($host, 0 - strlen($allowed_host)) != $allowed_host)
  $this->redirect('/home');`

答案 4 :(得分:0)

 In view: `<input type="hidden" value="1" name="back">`

 put inside your function in Controller: 


if(($this->input->post('back'))==1)
              {
                echo " what you want do here";
              }
              else
              {
                 $this->load->view('template',array('welcome_page')) ;
              }

表格验证你会把这个条件放在这个条件下......这肯定会有效..