Ограничить выполнение PHP-скрипта одним реферером - PullRequest
1 голос
/ 03 сентября 2011

Я создаю сценарий ajax / PHP и придумала что-то, чтобы защитить файл ajax от внешнего доступа, под этим я подразумеваю ограничение выполнения сценария с другого сервера (и домена).Я использую JQuery $ajax для публикации в файле PHP.

Вот файл PHP:

 <?php
 $config["url"]="mysite.com";
 if (isset($_SERVER["HTTP_REFERER"])) {
     $url = parse_url($_SERVER["HTTP_REFERER"]);

     if ($url["host"] != $config["url"]) {
         echo "You don't have access to this file.";
         exit;
     } else { 
         //Run The script
     }
 }
 ?>

По сути, этот сценарий состоит в том, что он соответствует Referer и домену.Скрипт завершится, если он не совпадает, и запустится, если он не будет.Таким образом, скрипт может быть выполнен только из mysite.com, а не из других мест.

Я не эксперт по PHP / Javascript, поэтому кто-нибудь может сказать мне, хорошо это или нет, и не получится ли при некоторых условиях?

Ответы [ 4 ]

0 голосов
/ 03 сентября 2011

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

<img src="/src/to/your/ajax?params=something_evil" />

, которое все равно будет его выполнять.Вторым наиболее распространенным методом предотвращения является использование токена CSRF для ajax.Вот два ресурса, чтобы узнать больше об этой атаке:

Описание: https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)

Предупреждение: https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

Редактировать:

Небольшое уточнение, которое может устранить путаницу в теме.

Любой пользователь может подделать заголовок реферера, но это не имеет значения.Причина, по которой это не имеет значения, состоит в том, что, если они могут подделать реферера, они могут так же легко сделать законный запрос.

Важной частью здесь является обеспечение того, что они не могут подделать запрос от любого другогопользователь .Это единственный аспект, который имеет значение и единственная причина для проверки реферера и защиты от атак CSRF.

0 голосов
/ 03 сентября 2011

Вы также можете заблокировать доступ с любого внешнего хоста, используя файл .htaccess.

<Files ~ "^\yourajaxfilename.extension">
Order allow,deny
Deny from all
</Files>

Для получения более подробной информации http://www.htpasswdgenerator.com/apache/htaccess.html

0 голосов
/ 03 сентября 2011

Имейте в виду, что люди могут загрузить страницу в своем браузере, а затем использовать консоль Javascript, встроенную в большинство браузеров, для загрузки вашей страницы ajax, предоставляя все нужные данные для получения / публикации.Есть и другие способы подделки реферера.

По сути, ваш метод будет работать против нетехнических пользователей, но вам все равно нужно будет проверить все входящие данные, чтобы убедиться, что ваш скрипт не вызоветчто-то, чего ты не хочешь делать.

0 голосов
/ 03 сентября 2011

AJAX уже имеет основанную на браузере защиту через Одинаковая политика происхождения .Вам вообще не нужны проверки реферера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...