Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 限制ajax调用来源_Php_Javascript_Jquery_Ajax_Security - Fatal编程技术网

Php 限制ajax调用来源

Php 限制ajax调用来源,php,javascript,jquery,ajax,security,Php,Javascript,Jquery,Ajax,Security,我有一个facebook应用程序,有些功能需要一些通过ajax运行的SRIPT。有没有办法确保只从我的应用程序内部调用脚本?我使用jquery进行如下ajax调用: $.post('script.php', {var1: val1, var2: val2}, function(data){...}); . script.php中的代码运行一些sql查询,只需检查所有请求的变量是否通过ajax调用传递。 我还应该检查什么,以便脚本只能在从我的应用程序调用而不是显式调用时执行 提前感谢。您可以

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

$.post('script.php', {var1: val1, var2: val2}, function(data){...});  
.
script.php中的代码运行一些sql查询,只需检查所有请求的变量是否通过ajax调用传递。
我还应该检查什么,以便脚本只能在从我的应用程序调用而不是显式调用时执行


提前感谢。

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

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


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

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

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

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


    这实际上取决于您希望您的web服务的安全性/可用性。

    您想要做的是采用相互验证的SSL,这样您的服务器将只接受来自您的应用程序的传入连接,并且您的应用程序将只与您的服务器通信

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

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


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

    我认为您无法完全消除页面上下文之外的所有调用

    • 如果它可以从任何机器调用,则不能基于请求的源
    • 您不能基于请求的内容,因为这可能被网络嗅探和伪造
    如果您可以限制特定的机器/IP,那么只需这样做。在服务器端保留一个白名单,并确保请求来自其中一台


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

    您是在web应用程序中还是在Andriod应用程序中构建此功能?这并不重要。方法是一样的,我非常感兴趣的是看到任何能够生成SSL证书并将其传递回客户机的web应用程序,然后按照您的描述使用SSL证书。我从未听说过这样的事情。web应用程序不需要生成证书。使用您喜爱的密钥管理工具生成一个密钥,并将私钥和证书与web应用程序一起存储。然后让应用程序在进行SSL连接时提供客户端证书。在Java中很容易做到,但不知道如何在php中做到。这是“让应用程序呈现客户端证书”部分,再加上你必须如何指导客户端如何使用该证书,这是我没有得到的(对于Java或php来说应该没有任何不同,因为现在我们讨论的是客户端)。你不是在说小程序吧?只是普通的HTML/JS/Ajax吗?我应该指出,即使您使用了我的更安全的第一个建议(建立会话),您仍然可以(而且应该)使用检查请求头的不太安全的方法。