Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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
如何验证/保护/验证基于JavaScript的POST请求?_Javascript_Security_Authentication_Cross Domain_Jsonp - Fatal编程技术网

如何验证/保护/验证基于JavaScript的POST请求?

如何验证/保护/验证基于JavaScript的POST请求?,javascript,security,authentication,cross-domain,jsonp,Javascript,Security,Authentication,Cross Domain,Jsonp,我正在帮助开发的产品基本上是这样工作的: Web发布者在其网站上创建一个新页面,其中包含来自我们服务器的 当访问者到达新页面时,收集页面的文本内容,并通过POST请求将其发送到我们的服务器(跨域,使用内部的) 我们的服务器处理文本内容并返回一个响应(via),其中包括一个HTML片段,列出了指向Web上相关内容的链接。此响应被缓存并提供给后续访问者,直到我们从同一URL收到另一个包含文本内容的POST请求,此时我们重新生成一个“新鲜”响应。这些帖子只有在缓存的TTL过期时才会发生,此时服务器会

我正在帮助开发的产品基本上是这样工作的:

  • Web发布者在其网站上创建一个新页面,其中包含来自我们服务器的
  • 当访问者到达新页面时,
    收集页面的文本内容,并通过POST请求将其发送到我们的服务器(跨域,使用
    内部的
  • 我们的服务器处理文本内容并返回一个响应(via),其中包括一个HTML片段,列出了指向Web上相关内容的链接。此响应被缓存并提供给后续访问者,直到我们从同一URL收到另一个包含文本内容的POST请求,此时我们重新生成一个“新鲜”响应。这些帖子只有在缓存的TTL过期时才会发生,此时服务器会指示并提示页面上的
    收集并再次发布文本内容
问题是这个系统似乎天生就不安全。理论上,任何人都可以欺骗HTTP POST请求(包括referer头,所以我们不能只是检查它),该请求将页面内容发送到我们的服务器。这可能包括任何文本内容,然后我们将使用这些内容生成该页面的相关内容链接

使其安全的主要困难在于我们的JavaScript是公开可见的。我们不能使用任何类型的私钥或其他神秘的标识符或模式,因为这不是秘密

理想情况下,我们需要一种方法,以某种方式验证与特定网页对应的POST请求是否真实。我们不能只刮取网页并将内容与发布的内容进行比较,因为让JavaScript提交内容的目的是它可能在登录系统后面


有什么想法吗?我希望我已经把这个问题解释得足够清楚了。提前感谢您的建议。

如果您可以向站点添加服务器端代码,将数据推送到您的站点,那么您至少可以使用MAC阻止未登录用户发送任何内容

如果只允许任何人使用该页面,那么我想不出一种防水的方法来确认数据,而不刮去网页。你可以使用referer检查之类的方法让发送任意内容变得更加困难,但并非100%不可能。

怎么样:


站点A创建一个nonce(基本上是一个随机字符串),将其发送到站点B,站点B将其放入会话中。然后,当站点A从站点发出POST请求时,它会将nonce与请求一起发送,并且只有当nonce与站点B会话中的nonce匹配时,请求才会被接受。

根据每个域为用户提供密钥

让人们在请求中包含[key string+请求参数]的散列值。(哈希值应在服务器上计算)


当他们向您发送请求时,您知道参数和密钥,可以验证有效性。

您可以将散列密钥指定给每个客户端IP地址,并使用post标头中的IP在服务器上比较每个post的值。这样做的好处是,如果有人欺骗他们的IP响应仍将发送到欺骗的IP而不是攻击者的。你可能已经知道这一点,但我也建议在你的哈希表中添加盐

使用伪造的IP,无法进行正确的TCP握手,因此攻击者伪造的post无法完成


可能还有其他我不知道的安全问题,但我认为这可能是一个选项

web发布者是否也可以在其服务器上放置代理页

然后通过代理加载脚本。然后,您可以控制两台服务器之间的连接,添加加密等


什么是登录系统?使用SSO解决方案并保持脚本的独立性如何?

正如您所描述的,系统的主要缺点是您“获得”了页面内容,为什么不自己去获取页面内容呢

  • Web发布者在其网站上创建一个新页面,其中包含来自服务器的脚本
  • 当访问者到达新页面时,该脚本将向服务器发送get请求
  • 您的服务器去获取页面的内容(可能通过使用referer头来确定请求的来源)
  • 您的服务器处理文本内容并返回一个响应(通过JSONP),该响应包括一个HTML片段,其中列出了Web上相关内容的链接。此响应将被缓存,并从服务器端缓存/代理服务器提供给后续访问者
  • 当缓存版本的TTL过期时,代理将把请求转发到您的应用程序,整个循环从步骤3再次开始

  • 这可以阻止恶意内容被“馈送”到您的服务器,并允许您提供某种形式的API密钥,将请求和域或页面联系在一起(即API密钥123仅适用于mydomain.com上的引用者-其他任何内容都显然是伪造的)。由于缓存/代理,您的应用程序在某种程度上受到保护,不受任何形式的DOS类型攻击,因为每次缓存TTL过期时,页面内容只处理一次(现在您可以通过扩展TTL来处理不断增加的负载,直到可以启用额外的处理功能)。现在,您的客户端脚本非常小和简单—不再需要刮取内容并发布它—只需发送一个ajax请求,并可能填充几个参数(api键/页面)。

    您可以刮取站点,如果您得到包含脚本的代码200响应,只需使用该刮取即可。如果不是的话,你可以从你的“客户代理”那里获取信息,这样的话,问题就落在你无法抓取的网站上了

    为了提高这些情况下的安全性,您可以让多个用户发送p