限制ajax呼叫原点

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

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


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

提前致谢。

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

  1. 使用SSL
  2. 需要登录网关才能建立会话
  3. 在允许处理请求之前检查该会话的有效性

如果你不想经历建立会话的麻烦,那么不太确定,但仍然是非常有用的防止访问的方法(因果访问,即):

检查是否存在两个请求标头:Referrer和X-Requested-With。 Referrer应包含基页的URL,X-Requested-With应包含XMLHttpRequest。 这些可能是伪造的,但它需要比仅仅直接浏览URL的人更加坚定的“攻击者”。

我不认为您可以完全消除页面上下文之外的所有呼叫。

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

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

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

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

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

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

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

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

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

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

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