Как более безопасно обрабатывать запросы AJAX в PHP? - PullRequest
2 голосов
/ 19 марта 2010

Хорошо, поэтому я хочу отправлять запросы AJAX на мой веб-сайт из моих Flash-игр для обработки данных, но я не хочу, чтобы люди скачивали их, декомпилировали, а затем отправляли поддельные запросы для обработки, поэтому я пытаюсь выяснить наиболее безопасный способ обработки файлов PHP. Моя первая идея состояла в том, чтобы использовать встроенный в Apache модуль авторизации, чтобы требовать имя пользователя и пароль для доступа к страницам на отдельном поддомене моего веб-сайта, но затем вам все равно нужно было бы включить это имя пользователя и пароль в запрос AJAX, так что это выглядит как бессмысленно даже пытаться.

Моя текущая опция выглядит довольно многообещающе, но я хочу убедиться, что она будет работать. По сути, он просто проверяет IP-адрес, отправляемый с помощью REMOTE_ADDR, чтобы убедиться, что это IP-адрес, на котором работает мой сервер.

<?
$allowed = new Array("64.120.211.89", "64.120.211.90");
if (!in_array($_SERVER['REMOTE_ADDR'], $allowed)) header("HTTP/1.1 403 Forbidden");
?>

Оба этих IP-адреса указывают на мой сервер. Вещи, о которых я беспокоюсь:

1) Если я отправлю запрос из Flash / ActionScript, это как-то повлияет на IP-адрес?

2) Могут ли злоумышленники изменить IP-адрес, отправляемый с REMOTE_ADDR, на один из моих IP-адресов?

Какие еще способы вы могли бы предложить, чтобы быть более безопасными?

Ответы [ 4 ]

2 голосов
/ 19 марта 2010

ЭТИ IP-адреса являются NSFW .

Имейте в виду, что если кто-то декомпилирует ваше флэш-приложение, перекомпилирует его, а затем поместит обратно на ваш сайт с помощью Firebug или аналогичного, вся ваша работа будет потрачена впустую в текущем потоке мысли. Лучший способ предотвратить злоупотребления - это потребовать одноразового использования зашифрованных токенов, которые вы отправляете при инициализации флеш-игры и которые требуются на обратной стороне POST. Вы также должны использовать SSL. Но даже это не остановит всех. Общеизвестно, что безопасность флеш-игры сложна.

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

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

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

1 голос
/ 19 марта 2010

REMOTE_ADDR будет адресом клиента, поэтому он не поможет.

Если клиент сможет декодировать его, он сможет эмулировать его.

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

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

0 голосов
/ 19 марта 2010

Я действительно думал об этом. Люди взламывают игры, чтобы получить № 1 на табло, правильно? Это единственная причина, они хотят быть на вершине. Итак, я решил полностью избавиться от глобального табло. Пользователи, конечно, будут записывать свои личные результаты, чтобы они могли соревноваться друг с другом, но в остальном каждая игра будет просто давать пользователям награду за выполнение какой-то конкретной задачи. Таким образом, оценка не имеет значения. Получите ли вы 1 000 000 или 1 000, вы все равно получите ту же награду. Это будет сдерживать хакеров, потому что их усилия бессмысленны. Да, я все еще могу реализовать некоторую форму низкоуровневой защиты при передаче данных на сервер через запросы AJAX, но на самом деле для кого-то не очень логично взломать мою игру, просто чтобы получить награду, точно такую ​​же, как и у любого другого. награду кто-либо еще получил. Я знаю, что мне кажется, что я как бы избегаю этой проблемы, но на самом деле это не так. Я сталкиваюсь с реальной проблемой, которая заключается в том, что хакеры уничтожают их мотивацию взломать игру, сохраняя при этом чувство конкуренции. Большинство хакеров делают это, чтобы привлечь внимание, поэтому они могут посмотреть на табло и сказать: «Да, я взломал игру, чтобы получить этот счет». Но если у них в профиле только маленькая иконка, кого это волнует?

...