Ajax安全(我希望)

时间:2011-03-17 13:17:30

标签: php javascript jquery html ajax

我正在构建一个浏览器游戏,我正在使用大量的ajax而不是页面刷新。我正在使用php和javascript。经过大量的工作,我注意到ajax并不完全安全。我担心的威胁是说有人想在我的SQL服务器上查找某些信息,他们只需要将正确的信息输入到与我的ajax调用关联的.php文件中。我正在使用GET样式的ajax调用,这是一个坏主意。无论如何,经过大量的研究,我有以下安全措施。我切换到POST(这不是更安全,但它是一个小问题)。我有一个提到的地方,它也可以伪造,但又是另一种威慑力。

我已经采取的最终措施是这个问题的焦点,当我的网站加载时,我生成并保存在会话中的80字符六角密钥,当我发送ajax呼叫时,我也发送了挑战

形式的关键
challenge= <?php $_SESSION["challenge"]; ?>

现在,当ajax php文件读取此信息时,它会检查发送的质询是否与会话质询相匹配。现在这本身不会做太多,因为你可以简单地打开萤火虫,看看容易发送什么挑战。所以我所做的就是一旦使用了挑战,它就会在会话中产生一个新的挑战。

所以我的问题是这是多么安全从哪里看起来它看起来只能看到挑战键发送后然后它更新,他们再也看不到它,直到它被发送,使得它不可能从其他来源发送伪造的请求。所以有人看到这个安全方法的任何循环漏洞或有任何额外的想法或想法。

3 个答案:

答案 0 :(得分:10)

您对“安全”的定义含糊不清。您似乎不太愿意阻止数据被截获,并且更有兴趣阻止人们向您的服务器提交自定义请求。这不是安全性,这只是良好的应用程序设计 - 您的程序不应该接受导致内部状态中断的请求。您无法阻止人们提交他们想要的任何数据。解决方案是验证他们在服务器端提交的数据,而不是试图阻止他们提交数据客户端,这将始终失败。

  

我切换到POST

你不应该打扰;这与安全无关。使用适合请求的任何HTTP谓词。你在查询信息吗?使用get请求。您正在更新/插入/删除信息吗?使用帖子。

  

说有人想在我的SQL服务器上查找某些信息,他们只需要将正确的信息输入我的.php文件

您应该对所有请求进行身份验证,以确保他们可以访问他们查询的数据。 SSL将帮助您安全地执行身份验证。

  

当我的网站被加载时,我在会话中生成并保存了一个80字符的十六进制密钥,当我发送ajax调用时,我也发送了挑战密钥

这没有用。您的问题的全部前提似乎是用户安装了Firebug或类似的HTTP调试工具。如果他们这样做,您的会话密钥将变得无用。

答案 1 :(得分:1)

请参阅'meagar'的答案。

我想提一下:

通过传递Session中的标识符,您正在执行Session已经在做的事情。通常会有一个cookie,其中包含与您正在生成的标识符类似的唯一标识符,它基本上告诉您的应用程序,该人是谁。这就是PHP会话的工作方式。

在这种情况下,您需要做的是检查给定的请求 - POST GET - 特定用户(其唯一用户ID或类似用户ID存储在会话)有权使用该特定请求添加/更改/删除/任何内容。

因此,对于“搜索”请求,您只会返回用户X有权查看的结果。这样,您不必担心他们发送的内容 - 如果用户没有权限执行某些操作,系统就会知道不让他们这样做。

因此“你应该对所有请求进行身份验证”。

有人可以随意添加。

答案 2 :(得分:0)

function mysqlRequest(type,server,name,value,sync){
    $.ajax({
            type: 'POST',
        url: 'sql.php',
        data: "server=s"+server+"&type="+type+"&name="+name+"&value="+value+"&challenge=<?php echo $_SESSION['challenge']; ?>",
        cache: false,
        dataType: 'json',
        async: sync,
        success: function(data){
            },
        complete: function(){}