Безопасный AJAX-запрос к URI

Я знаю, что было много вопросов о безопасности AJAX. Я искал и читал, но до сих пор неясно, каков наилучший подход.

У меня очень специфический сенарио:

У меня есть приложение, которое построено на основе PHP MVC Framework. Я превратил элементы представления, такие как "меню навигации", в модульное. Модуль навигационного меню имеет контроллер (со стороны сервера). Контроллер использует модель для извлечения данных из базы данных, а затем отвечает php-эхо-данными. Я могу сделать http-запрос к контроллеру, используя AJAX, потому что контроллер направляется по URI. Я считаю, что это вызов RESTful API. Когда пользователь щелкает ссылку в меню навигации, область статического содержимого обновляется данными, которые были получены из запроса AJAX. Допустим, я выполняю другое действие в том же контроллере, который способен записывать данные в базу данных. Наличие общедоступного URI, который позволяет записывать в базу данных, явно плохо. Как защитить интерфейс URI, чтобы AJAX мог извлекать и записывать данные, но те, кто имеет злонамеренные намерения, могут причинить вред?

3 ответа

Решение

Вы должны обрабатывать запрос ajax так же, как обрабатывает запрос на получение или почтовый запрос. Другими словами, никогда не доверяйте пользователю. У вас есть управление на стороне сервера, ajax - на стороне клиента, поэтому никогда не доверяйте "СТОРОНЕ КЛИЕНТА", которая делает запрос (проверьте данные, если данные в порядке, затем верните ответ, если не верните другой ответ).

Главное правило - проверять все входные данные - проверять все входящие данные и очищать их от нежелательных символов.

Кроме того, все зависит от того, разрешаете ли вы пользователю изменять свою БД без входа в систему или нет. Зарегистрированных пользователей легче проверить, и Вы всегда можете включить скрипты проверки на стороне сервера, если текущему пользователю разрешено выполнять эту операцию.

Сложнее, когда вы разрешаете анонимному пользователю писать в вашу БД. Тогда хорошо работать, в основном, с идентификаторами, и если вы разрешаете пользователю вставлять данные из входных данных - фильтруйте все от нежелательных вещей. Хороший способ сделать это - создать белые списки символов, которые вы одобряете, и вырезать все остальное.

Вы должны помнить, что Ajax - это не что иное, как отправка POST-запроса на URL - и вы должны делать ту же защиту, что и в стандартных формах. Также хорошей практикой является добавление токена к отправляемым данным, который вы можете проверить на стороне сервера.

Контроллер может записывать в базу данных:

Не существует настоящего способа защиты открытого интерфейса URI, чтобы он мог быть доступен только той части вашего приложения, которая существует на стороне клиента. Идея состоит в том, чтобы не делать интерфейс таким публичным, то есть доступ к нему не для всех! Если URI должен указывать на "контроллер" (архитектура MVC) и, в свою очередь, контроллер имеет доступ для управления критически важной базой данных, лучше всего сделать так, чтобы клиент, отправляющий запрос контроллеру, должен "Аутентифицировать". Эта концепция верна независимо от того, поступают ли http-запросы из веб-формы или Ajax. Обычно перед проверкой подлинности учетные данные передаются по протоколу https (http + SSL), чтобы "человек посередине" не смог увидеть учетные данные.

Контроллер умеет читать из базы данных:

Когда сделан запрос на чтение, вы можете просто вернуть данные или, если их конфиденциальные данные требуют аутентифицированного клиента.

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

Другие вопросы по тегам