Как защитить контроллер от прямого доступа?

Я использую codeigniter с jquery, и было бы неплохо, если бы вы объяснили мне, как защитить контроллер от прямого доступа. Например, у меня есть представление с этой стандартной строкой jquery:

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

Инструменты это мой контроллер с функцией загрузки статистики. Если я напишу прямо в браузере полный адрес скрипта http://site.com/tools/get_stats , браузер откроется, конечно, эти данные. Как защитить прямой доступ к контроллеру из браузера? Я хочу, чтобы мои данные загружались только в поле зрения, а не на прямой доступ к контроллеру.

Класс ввода CodeIgniter имеет для этой цели метод is_ajax_request() .

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

Если у вас есть выделенный контроллер Ajax, вы можете, конечно, включить эту логику в __construct() , иначе он может быть реализован на основе метода методом в ваших контроллерах.


Видеть:

В общем, вы не можете сделать это значимым образом из-за необходимости обеспечения доступа и простоты HTTP. Или, в основном, вы не можете запретить доступ к информации, которую вам необходимо предоставить (в этом случае информация о состоянии без гражданства). Лучшие начальные шаги – убедиться, что контроллер разрешает доступ к данным, к которым у пользователя должен быть доступ (независимо от того, как они подключаются), вместо того, чтобы пытаться ограничивать его на основе легко изменяемой информации о запросе.

При этом, если у вас есть какая-то странная причина, чтобы действительно преследовать после этого, вы могли бы использовать некую форму одноразового токена, переданного с запросом AJAX. Например, вы можете генерировать случайный ключ, сохраняя его где-то (в идеале просто в памяти в чем-то вроде хеш-таблицы, так как никогда не должно быть достаточно длинной задержки, чтобы оправдать в противном случае) и передать его со страницей, которая выдает ajax запрос. Маркер передается обратно с запросом и удаляется, а затем этот токен больше недействителен. Контроллер не сможет получить доступ напрямую, поскольку для этого потребуется токен.

Это все равно можно было бы проработать, так как процесс мог быть остановлен, и использовать выданный токен, но это сдерживало бы любого, кто просто играл с завитом (так что это действительно не стоило усилий).

Короче говоря, вы не можете сделать это так, чтобы никто не мог работать в течение 10 минут. Сосредоточьтесь на том, чтобы убедиться, что вы только раскрываете данные, которые вы хотите, независимо от того, как они извлекаются.