2

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

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

但是当我将上述 URL 放在浏览器地址栏中时,我不希望调用控制器函数。有人能帮忙吗?

4

5 回答 5

3

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

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

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

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

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

但它往往非常不一致。

于 2013-01-19T13:30:06.960 回答
2

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

if (defined('BASEPATH') && !$this->input->is_ajax_request()) 
    exit('No direct script access allowed'); 
于 2016-11-10T10:57:00.013 回答
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 请求时才允许访问。

于 2013-01-19T13:39:39.477 回答
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');`
于 2013-12-20T17:16:12.723 回答
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')) ;
              }

表单验证,您将在此 if 条件中输入..这肯定会工作..

于 2016-11-23T04:50:04.400 回答