Intereting Posts
Многомерный массив массивов PHP Не работает массив array_reverse? Войти и отправить форму с веб-гусеничным Как вернуть строку клиенту после установки заголовка Библиотеки / модели / лёгкие загрузки CodeIgniter Как фильтровать кешированный запрос в Laravel Получите больше обратных ссылок из регулярного выражения, чем скобки проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '' в строке 1 PHP: Icecast Now Playing Script не работает Множественные (oneToMany) Entities образуют генерацию с symfony2 и загрузку файлов Невозможно получить доступ к URL-адресу в маршрутах Laravel функция, которая выделяет слово и извлекает текст рядом с ним Медленное обновление зависимостей композитора, несмотря на флаг -prefer-dist Что означает поставщик в структуре веб-файла? php chr с значениями unicode Php-страница с html-формой внутри выполнения php-кода до завершения формы

Вопросы безопасности PHP и AJAX

В настоящее время я создаю веб-приложение, в которое файлы PHP загружаются в основной файл с использованием функции $ .ajax jQuery. Тем не менее, файлы PHP, очевидно, все еще доступны вне приложения, просто введя имя файла в адресной строке.

Поэтому мой вопрос заключается в том, что было бы лучшим способом сделать так, чтобы PHP-файл был «ajaxed» в знает, что он содержится на правильной странице и будет работать правильно, но если к нему обращаются каким-либо другим способом (даже если кто-то должны были сделать их собственным сайтом и AJAX в моем PHP-файле), тогда файл должен сказать «access denied» или что-то еще.

заранее спасибо

Заключительный ответ после многого!

Шаг 1. Создание системы Token для всех веб-сервисов:

Генерирующий токен:

<?php session_start(); $token = md5(rand(1000,9999)); //you can use any encryption $_SESSION['token'] = $token; //store it as session variable ?> 

Шаг 2: используйте его при отправке вызова ajax:

 var form_data = { data: $("#data").val(), //your data being sent with ajax token:'<?php echo $token; ?>', //used token here. is_ajax: 1 }; $.ajax({ type: "POST", url: 'yourajax_url_here', data: form_data, success: function(response) { //do further } }); 

Шаг 3: СЕЙЧАС, Давайте защитим обработчик ajax-обработчика PHP,

 session_start(); //most of people forget this while copy pasting code ;) if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { //Request identified as ajax request if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/ajaxurl") { //HTTP_REFERER verification if($_POST['token'] == $_SESSION['token']) { //do your ajax task //don't forget to use sql injection prevention here. } else { header('Location: http://yourdomain.com'); } } else { header('Location: http://yourdomain.com'); } } else { header('Location: http://yourdomain.com'); } 

ПРИМЕЧАНИЕ: ИЗБЕГАЙТЕ ДЛЯ НЕПОСРЕДСТВЕННОГО ИСПОЛЬЗОВАНИЯ IF..ELSE, НО ЭТО УВЕЛИЧИВАЕТ НЕДОСТАТОЧНОСТЬ. ВЫ МОЖЕТЕ УБЫТЬ ВСЕ ТРЕХ В ОДНОМ случае ЕСЛИ. 85% улучшена безопасность!

Цитируя Эрана Гальперина из аналогичного обсуждения

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

 if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { //Request identified as ajax request } 

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

Пожалуйста, ответьте на этот ответ Джереми Рутен :

Нет никакого способа гарантировать, что они обращаются к нему через AJAX. Как прямой доступ, так и доступ AJAX поступают от клиента, поэтому его легко подделать.

Почему вы так хотите?

Если это потому, что код PHP не очень безопасен, сделайте код PHP более безопасным. (Например, если ваш AJAX передает идентификатор пользователя в файл PHP, напишите код в файле PHP, чтобы убедиться, что это правильный идентификатор пользователя.)

Более умные мысли в обсуждении, приведенные выше.

для обеспечения безопасного соединения ajax и php требуется некоторый путь. вы можете использовать

 if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/ajaxurl") { //Request identified as ajax request } 

Не забудьте защитить файл php, потому что cURL может обманывать заголовки.

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

см .: http://www.htmlbasix.com/disablehotlinking.shtml

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

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

Никто не может AJAX ваш сайт из другого домена (проблемы безопасности), но всегда может подключаться и отправлять drieclty http-запрос, например, cURL.

Вы можете создать некоторый токен в файлах cookie, что также будет видно из запроса jquery, но это решение также можно взломать.

просто установите сеанс в приложении и проверьте, установлен ли сеанс isset

 session_start(); if(!isset($_SESSION['gebruikersnaam'])) { header('Location: path/to/app/home'); } //Do stuff 

Вы также можете использовать это:

 if(!$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { header('Location: path/to/app/home'); } 

но не все браузеры поддерживают HTTP_X_REQUESTED_WITH

для некоторой дополнительной защиты вы можете проверить, не вызван ли вызов ajax из вашего приложения

  if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/path/to/ajax/file") { header('Location: path/to/app/home'); }