Недавно я начал кодировать сильно поддерживаемые AJAX скрипты на PHP, дело в том, что файлы, к которым обращаются вызовы AJAX, также могут быть напрямую использованы, как отключить это?
Вы не можете надежно предотвратить это. Ключ действительно не рассматривать кого-то, обращающегося к этому файлу напрямую, как проблему безопасности – план для этого является возможным, и вы окажетесь в гораздо более безопасном месте.
Некоторые люди могут рекомендовать код, похожий на этот (или похожий):
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { // more code here }
Однако факт заключается в том, что заголовки HTTP могут быть легко подделаны и не являются средством обеспечения кода. В моем тестировании на занятом сайте некоторое время назад я заметил, что эти заголовки на самом деле не настолько надежны.
Как утверждают другие люди в своих ответах, это невозможно. Это связано с одним из основополагающих принципов компьютерной безопасности: вы никогда не сможете доверять клиенту. Вот почему мы проверяем все данные от клиента и т. Д.
Вместо того, чтобы пытаться заблокировать других клиентов от доступа к вашим услугам, вместо этого тратите время на создание защитных веб-сервисов. Смысл, убедитесь, что злоумышленники не могут удалять инъекции или другие атаки через вашу бизнес-логику. Например, убедитесь, что все электронные письма действительны, люди не покупают товары за отрицательные доллары и т. Д.
О, и тот факт, что веб-сервисы открыты, – ХОРОШЕЕ! Вы предоставляете открытый API своим пользователям, что очень удобно! Возможно, вместо того, чтобы пытаться заблокировать ваше сообщество, вы обнимаете его – дайте им документацию о том, как взаимодействовать с вашими службами, и они будут делать больше клиентов. Вместо того, чтобы покупать iPhone SDK и тратить время на изучение Objective C, один из ваших пользователей может.
Невозможно напрямую запретить доступ. Поскольку запрос всегда можно создать, чтобы соответствовать любым критериям, которые вы придумали.
Если XmlHttpRequest используется для запроса сервера, он добавляет заголовок, который можно обнаружить, используя что-то вроде:
/* AJAX check */ if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { //Do something here }
Возможно, вам следует использовать некоторую технику защиты XSS, например, передать некоторый защищенный ключ вместе с запросом ajax. И дайте только ключ к javascript, который делает асинхронные запросы вместе с загруженной страницей.
<script type="text/javascript"> window.csrf_key = '<?php $user->getCsrf(); ?>'; </script>
В этом случае вам не придется беспокоиться о том, что люди передают запросы непосредственно на файлы, только если вы храните ключи в безопасности, используйте POST для вызова действий и проверок здравомыслия.
Используйте сеансы в своем приложении.
Редактирование:
Зарегистрируйте свой сайт в сеансе, я использую UUID для этого.
Установите cookie с тем же значением, которое вы используете в сеансе.
Отправьте запрос AJAX с параметром, который также включает это значение.
Сравните значения из сеанса, файла cookie и параметра.