Codeigniter – Ограничение прямого доступа к функциям контроллера из вызова URL

Я хочу знать, есть ли способ, с помощью которого я могу ограничить доступ к своим функциям контроллера через URL. Но я хочу дать им звонок по моей ссылке на сайте. Например, если у меня есть ссылка на моем сайте, которая указывает на функцию контроллера:

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

Но я не хочу, чтобы функция контроллера вызывалась, когда я помещаю вышеуказанный URL в адресную строку браузера. Может кто-нибудь помочь с этим?

Как вы сказали в комментарии, если вы хотите загрузить ссылку через 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-запрос сделан с вашего собственного сайта.

Это невозможно. Apache и, следовательно, CodeIgniter, позволяют доступ к вашему скрипту PHP во внешний мир, будь то вручную введенный URL-адрес браузера или через посещенную гиперссылку. Оба сценария подключаются к вашему веб-приложению точно так же, но они просто добираются туда по-другому .

Вы можете разрешить доступ только к вашим сценариям CodeIgniter (то есть запретить публичным пользователям доступ к контроллеру), используя:

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

Как отметил Маркус, вы можете использовать что-то вроде:

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

Но это часто очень непоследовательно.

Решение: поместите этот код в начале каждого метода контроллера

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

Это действительно помогло. Я также добавил это как дополнительную проверку

 $allowed_host = gethostname(); $host = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST); if(substr($host, 0 - strlen($allowed_host)) != $allowed_host) $this->redirect('/home');` 
  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. Это определенно сработает.