如何在PHP中更安全地处理AJAX请求?

时间:2010-03-19 02:18:27

标签: php ajax flash security actionscript

好的,所以我想从我的Flash游戏中向我的网站发送AJAX请求以处理数据,但我不希望人们下载它们,反编译它们,然后发送虚假请求进行处理,所以我试图找出PHP文件中最安全的处理方式。我的第一个想法是使用Apache的内置授权模块来要求用户名和密码来访问我网站的单独子域中的页面,但是你必须在AJAX请求中包含该用户名和密码,这样才能看起来很亲切甚至没有尝试。

我目前的选择看起来非常有希望,但我想确保它能够正常运作。基本上它只是检查使用REMOTE_ADDR发送的IP地址,以确保它是我的服务器运行的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)恶意用户是否可以将使用REMOTE_ADDR发送的IP地址更改为我的某个IP地址?

您建议的其他任何方式可能更安全吗?

4 个答案:

答案 0 :(得分:2)

这些IP是NSFW

请记住,如果有人反编译您的Flash应用,重新编译它,然后使用Firebug或类似信息将其放回您的网站,您的所有工作都会浪费在您当前的思维流中。防止滥用的最佳方法是要求一次性使用您在初始化Flash游戏时发送的加密令牌,并要求POST回来。您还应该使用SSL。但即便如此也不会阻止所有人。众所周知,Flash游戏安全性很难。

答案 1 :(得分:1)

REMOTE_ADDR将是客户端的地址,因此无济于事。

如果客户端可以解码它,他们将能够模拟它。

希望没有人能够在你的比赛中获得高分。

我认为嗅探数据包比反编译闪存更容易,因此在发送数据时以某种方式加密数据可能是值得的。

答案 2 :(得分:1)

谷歌搜索结束后的结论!

步骤1:为所有Web服务生成令牌系统:

生成令牌:

<?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%安全性!

答案 3 :(得分:0)

我一直在想这个。黑客入侵游戏以在记分牌上获得第一名,对吗?这是唯一的原因,他们希望成为最佳人选。所以,我决定彻底摆脱全球记分牌。当然,用户将记录他们的个人分数,以便他们可以与自己竞争,但除此之外,每个游戏将简单地为用户提供完成某项特定任务的奖励。那样得分无关紧要。无论您获得1,000,000还是1,000,您仍然可以获得相同的奖励。这将阻止黑客,因为他们的努力毫无意义。是的,当通过AJAX请求将数据传输到服务器时,我仍然可以实现某种形式的低级安全性,但实际上,为了获得与任何一个完全相同的奖励而破解我的游戏似乎是不合逻辑的。其他人收到的奖励。我知道我似乎有点避免这个问题,但我真的不是。我面临着真正的问题,即黑客,并且几乎摧毁了他们破解游戏的动机,同时仍然保持着竞争意识。大多数黑客都是为了获得关注,所以他们可以看看记分牌并说:“是的,我入侵了游戏以获得分数。”但如果他们的个人资料中只有一个小图标,谁会关心?