限制ajax呼叫原点

时间:2011-12-29 17:43:45

标签: php javascript jquery ajax security

我有一个facebook应用程序,有些功能需要通过ajax运行一些sripts。有没有办法确保只从我的应用程序内部调用脚本?我使用jquery进行这样的ajax调用:

$.post('script.php', {var1: val1, var2: val2}, function(data){...});  


script.php中的代码运行一些sql查询,并检查所有请求的变量是否通过ajax调用传递 我应该检查什么,以便脚本只能从我的应用程序调用而不是通过显式调用执行?

提前致谢。

4 个答案:

答案 0 :(得分:3)

您可以通过很少的方法确保从您的应用程序调用Ajax请求。如果这是一项关键任务(高安全性)要求,那么我会以与保护任何特定网络资源相同的方式保护它:

  1. 使用SSL
  2. 需要登录网关才能建立会话
  3. 在允许处理请求之前检查该会话的有效性
  4. 如果您不想经历建立会话的麻烦,那么可能不太确定,但仍然非常有用的方法来阻止访问(因果访问,即):

    检查是否存在两个请求标头:Referrer和X-Requested-With。 Referrer应包含基页的URL,X-Requested-With应包含XMLHttpRequest。这些可能是假的,但它需要一个更加坚定的攻击者"而不是直接浏览网址的人。

答案 1 :(得分:1)

我认为你不能完全消除页面上下文之外的所有电话。

  • 如果可以从任何计算机调用
  • ,则无法将其从请求源中删除
  • 您不能将其基于请求的内容,因为它可以被网络嗅探和伪造

如果您可以限制特定的机器/ IP,那么就这样做。保留服务器端列入白名单的计算机列表,并确保请求来自其中一个。

除此之外,您可以做的最好的事情是要求身份验证,在这种情况下,您可以限制每个帐户的请求量。

答案 2 :(得分:0)

旋转的公钥/私钥有助于确保识别,可能使用私钥加密数据流。

在我的一些更安全的应用程序中,我将公钥分配给特定的IP地址。如果该IP未在请求流中提供该密钥,我将其视为非法请求并忽略它。

要更进一步,您可以在服务器级别锁定针对该特定IP /主机名的路径的请求。

它实际上归结为您希望Web服务的安全性/可用性。

答案 3 :(得分:0)

您要做的是使用经过相互身份验证的SSL,以便您的服务器只接受来自您应用的传入连接,而您的应用只会与您的服务器进行通信。

这是高级方法。创建自签名服务器SSL证书并在Web服务器上部署。然后创建一个自签名客户端,并将其作为资源部署在应用程序中包含的自定义密钥库中。将服务器配置为要求客户端SSL身份验证,并仅接受您生成的客户端证书。配置客户端使用该客户端证书来标识自己,并且只接受您在服务器上安装的那个服务器端证书。

如果您的应用以外的某人/某些人尝试连接到您的服务器,则不会创建SSL连接,因为服务器将拒绝未提供您的应用中包含的客户端证书的传入SSL连接。 / p>

请注意,这取决于您的应用可以保护客户端证书和相关私钥的程度。