Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Шаг 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');
}

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

Ответ 2

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

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

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

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

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

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

Почему вы все равно хотите сделать это?

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

просто установите сеанс в приложении и проверьте, есть ли сеанс 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');
}