代码之家  ›  专栏  ›  技术社区  ›  animuson Hemanshu

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

  •  2
  • animuson Hemanshu  · 技术社区  · 14 年前

    好的,所以我想从我的Flash游戏发送Ajax请求到我的网站来处理数据,但是我不想让人们下载它们,解压它们,然后发送假请求来处理,所以我正在尝试找出在PHP文件中处理的最安全的方法。我的第一个想法是使用Apache内置的授权模块,需要用户名和密码才能访问我网站的单独子域上的页面,但是无论如何,您必须在Ajax请求中包含该用户名和密码,这样做似乎毫无意义。

    我目前的选择看起来很有希望,但我想确保它能奏效。基本上,它只检查使用远程地址发送的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)恶意用户是否可能将使用远程地址发送的IP地址更改为我的一个IP地址?

    有没有其他方法可以让你觉得更安全?

    4 回复  |  直到 11 年前
        1
  •  2
  •   VNO    13 年前

    那些IP是NSFW .

    请记住,如果有人对你的Flash应用程序进行解压,重新编译,然后使用Firebug或类似工具将其放回你的站点,那么你的所有工作都会浪费在你当前的思想流中。防止滥用的最好方法是需要一次性使用加密的令牌,在初始化Flash游戏时发送这些令牌,然后在回发时需要这些令牌。您还应该使用SSL。但即使这样也不能阻止所有人。Flash游戏的安全性是众所周知的困难。

        2
  •  1
  •   Matt user129975    14 年前

    远程地址将是客户机的地址,因此不会有帮助。

    如果客户机可以对其进行解码,他们将能够模拟它。

    希望没有人会那么渴望在比赛中获得高分。

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

        3
  •  1
  •   Hardik Thaker    11 年前

    在谷歌搜索了很多次后,回答结束了!

    步骤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:现在,让我们用

    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%的安全性增强!

        4
  •  0
  •   animuson Hemanshu    14 年前

    我真的在想这个。人们玩游戏是为了在记分板上获得1分,对吗?这是唯一的原因,他们想在上面。所以,我决定彻底摆脱全球记分板。当然,用户会记录他们的个人分数,这样他们就可以与自己竞争,但除此之外,每一个游戏只会授予用户完成某些特定任务的奖励。这样得分就无关紧要了。无论你得到100万还是1000,你仍然得到同样的奖励。这将威慑黑客,因为他们的努力毫无意义。是的,在通过Ajax请求将数据传输到服务器时,我仍然可以实现某种形式的低级安全性,但事实上,对于某些人来说,黑客攻击我的游戏只是为了获得一个与其他人所获得的任何奖项完全相同的奖项似乎不是很合乎逻辑。我知道我似乎在回避这个问题,但实际上我没有。我面临的真正问题是黑客,他们在保持这种竞争意识的同时,几乎破坏了他们黑客游戏的动机。大多数黑客这样做是为了引起注意,所以他们可以看看记分板,然后说,‘是的,我黑客游戏是为了得到分数。’但是如果他们的个人资料中只有一个小图标,谁会在意呢?