Ajax-запросы открыты не для всех

Я создал веб-приложение с помощью CodeIgniter. Есть несколько мест, где я использую ajax в приложении.

Я хочу знать, есть ли способ остановить прямой доступ и запрос к контроллеру ajax и разрешить обработку только законных запросов ajax, исходящих со страницы.

Спасибо.


person DMin    schedule 14.11.2011    source источник
comment
Запрос AJAX — это просто простой HTTP-запрос. Почему вы хотите остановить прямой доступ?   -  person kapa    schedule 14.11.2011
comment
Я знаю, что может быть трудно остановить решительного человека, но я хочу знать, есть ли способ запретить людям прямой доступ к странице результатов ajax. Он показывает результаты из базы данных (ничего, что нужно защищать), но я бы хотел только предполагаемое использование для него, а не чтобы кто-то пришел и очистил мою базу данных от нее.   -  person DMin    schedule 14.11.2011
comment
Но вы все равно отображаете результаты базы данных на странице, верно?   -  person kapa    schedule 14.11.2011
comment
Короткий ответ: невозможно делать то, что вы хотите. Однако вы можете определить некоторые правила ограничения на основе IP-адресов, чтобы пользователи не могли удалить базу данных (ограничить количество запросов за определенный период времени) или использовать капчу в форме Ajax.   -  person fardjad    schedule 14.11.2011


Ответы (1)


Да, вы можете сделать это без проблем. Входной класс CodeIgniter имеет метод is_ajax_request(). Просто проверьте это в начале действия вашего контроллера. Например:

function ajax_save() {
    if ($this->input->is_ajax_request()) {
        //continue on as per usual
    } else {
        show_error("No direct access allowed");
        //or redirect to wherever you would like
    }
}

Если у вас есть контроллеры, полностью предназначенные для вызовов ajax, вы можете поместить этот оператор if в конструктор function __construct() для контроллера. Не забудьте сначала вызвать parent::__constructor()!

Изменить: что касается «исходя со страницы», вам, вероятно, следует выполнять проверку подлинности + проверки безопасности (вероятно, через сеанс, чтобы вы не попали в базу данных) в своем запросе ajax. Таким образом, пользователь-мошенник, не связанный с вашим веб-приложением, в любом случае не сможет отправить запрос ajax вручную. Надеюсь, что это ответ на ваш вопрос.

person MikeMurko    schedule 14.11.2011
comment
Это просто проверяет, установлен ли флаг ajax в заголовках HTTP. Любой может установить этот флаг для любого запроса. Это полезно только для принятия решения о том, какой формат данных лучше всего возвращать. Это не обеспечит никакой безопасности. - person Quentin; 25.10.2012
comment
Согласованный. Не защищает от хакеров, но предотвращает случайные запросы в приложении (т. е. из hrefs) от непреднамеренного доступа к действиям контроллера AJAX. - person MikeMurko; 25.10.2012