PHP и AJAX секретный вопрос - PullRequest
25 голосов
/ 29 июля 2010

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

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

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

Ответы [ 7 ]

54 голосов
/ 01 августа 2013

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

Шаг 1: Создание системы токенов для всех веб-служб:

Создание токена:

<?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: СЕЙЧАС, давайте защитим файл PHP обработчика ajaxс,

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% повышение безопасности!

10 голосов
/ 29 июля 2010

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

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

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

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

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

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

Почему ты так хочешь?

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

Более умные мысли в обсуждении, связанном выше.

5 голосов
/ 31 января 2012

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

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

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

2 голосов
/ 29 июля 2010

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

2 голосов
/ 29 июля 2010

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

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

1 голос
/ 29 июля 2010

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

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

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

0 голосов
/ 10 ноября 2016

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

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');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...