java - 获取 JSONP 请求来自的域名以确保安全

标签 java javascript ajax jsonp xss

我想让我的应用程序的用户能够在他们的网站上放置一些代码,并通过 jsonp 请求与我的服务器进行最少的交互。但是,我只希望远程请求能够来 self 特别允许的远程站点。基本上,用户必须拥有我的应用程序的帐户。

为了安全,我的计划是:

  1. 在请求之前存储请求的来源域 允许将代码放在网站上。
  2. 当服务器收到远程请求时,获取域名 来自请求并将其与数据库进行匹配。
  3. 如果域匹配,请求被验证并返回 数据等。如果它不同,我会假设它是一些 XSS 攻击 排序并拒绝请求,向远程返回错误。

如何获取请求的来源域?为了在我的开发箱上进行测试,我设置了一个在不同端口上运行的单独静态网站

Server domain: localhost:8090
Remote domain: localhost:8095

使用 getRemoteHost 似乎返回 127.0.0.1。在现实世界的情况下,这是否是远程域的 ip,然后是否有可能从所述 ip 中找到域名的人类可读版本?存储和匹配 ip 可能不是一个好主意,因为我不知道尝试连接到我的服务的远程站点是否由动态 ip 提供服务...

也许我在这里采取了错误的方法,所以如果我错了请纠正我。无法向远程站点的用户请求用户名和密码,因为他们没有实际帐户。

也许更好的方法是将某种加密 token 存储在数据库中而不是域中,当我向用户提供代码片段以放置在他们的网站上时,它可能包含一个隐藏的输入,其中包含一个加密的随每个请求传递的此 token 的版本?然而,在这种情况下,难道任何人都无法通过查看页面源代码复制隐藏元素并对服务器具有相同的访问权限吗?

最佳答案

一方面,您说“我只希望远程请求能够来 self 特别允许的远程站点”,但是使用 JSONP 意味着您不会看到来自远程站点的请求——您将看到来自访问远程站点的浏览器的请求。这种区别很微妙但很重要,因为它严重限制了您的选择。

如果您想知道哪个网站发起了 JSONP 请求,您可以查看 Referer header 。除了...您不能依赖它的设置,尤其是跨 HTTP/HTTPS 转换。然后您可能会想“嘿,我将使用 CORS”,但是当然,任何人都可以使用他们想要的任何 header 创建请求。我可以编写一个 HTTP 客户端,声称自己是您的远程站点之一,并使用它们的凭据访问您的界面——因此,如果 header 是您限制访问的唯一方式,请知道它很容易被击败。

Referer header 上方的下一步是颁发 token 并使用这些 token 进行识别。但是,正如您所指出的,远程站点必须将其提供给浏览器才能让浏览器创建请求。所以,有人可以复制它并在任何地方使用它。回到同样的问题。

接下来您可以做的是发布 token (用于识别)和共享 secret (用于授权)。然后,您可以要求远程站点使用共享 key 来签署请求——说“是的,实际上是我,远程站点”。通过这种方式,远程站点向用户的浏览器提供签名,而不是 secret 本身。您需要确保您签署的内容足以验证远程站点的意图(即站点希望用户浏览器执行的任何操作),并且它应该包含一个时间戳以防止重放攻击。这需要从远程站点进行一些服务器端计算,但会阻止用户执行除远程站点明确允许的操作之外的任何操作。

但是...您提到这些远程站点上的用户将没有帐户。如果这意味着它们对公众可用,那么任何人都可以获取这些远程站点之一,提取签名,然后自己使用它来做与远程站点用户可以做的相同的事情。这不是实现的问题,而是架构的问题:您的设计要求随机 Web 浏览器与您的服务交互,根本没有办法阻止 man-in-the-middle .使用共享 key 允许您进行一定程度的控制,但您无法阻止它。

在这一点上,我建议您退后一步,考虑一下您实际要解决的问题是什么。这个接口(interface)有什么作用?这些远程站点上的浏览器是否需要直接与您交互?你想把谁拒之门外,为什么?如果他们绕过您的检查,会发生什么情况?

关于java - 获取 JSONP 请求来自的域名以确保安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12544971/

相关文章:

java - 如何加粗形状的边框

javascript - 如何将 'setReadyOnly' 用于 ACE 编辑器的特定 session

javascript - 无法将表单数据推送到 JSON 文件中

javascript - 在ajax中使用特殊字符

javascript - 使用 Ajax 将 JavaScript 传递到 PHP

java - Hibernate CreateCriteria 用于依赖类

java - C++ 和 Java 中的静态变量

java - 独立于平台的方式获取当前java可执行路径和文件名

javascript - Kendo Grid 如何创建标题行

javascript - 执行 jquery ajax 时没有异常但状态错误