【发布时间】:2011-02-03 10:56:43
【问题描述】:
我正在帮助开发的产品基本上是这样工作的:
- 网络发布者在其网站上创建了一个新页面,其中包含来自我们服务器的
<script>。 - 当访问者到达该新页面时,
<script>会收集页面的文本内容并通过 POST 请求(跨域,在<iframe>中使用<form>)将其发送到我们的服务器。 - 我们的服务器处理文本内容并返回一个响应(通过JSONP),其中包括一个HTML 片段,其中列出了指向Web 相关内容的链接。此响应被缓存并提供给后续访问者,直到我们从同一 URL 收到另一个带有文本内容的 POST 请求,此时我们重新生成一个“新”响应。这些 POST 仅在我们缓存的 TTL 过期时发生,此时服务器会表示并提示页面上的
<script>再次收集和 POST 文本内容。
问题是这个系统似乎天生就不安全。理论上,任何人都可以欺骗将页面内容发送到我们的服务器的 HTTP POST 请求(包括referer 标头,因此我们不能只检查它)。这可以包括任何文本内容,然后我们将使用这些内容为该页面生成相关内容链接。
确保这个安全的主要困难是我们的 JavaScript 是公开可见的。我们不能使用任何类型的私钥或其他神秘的标识符或模式,因为这不是秘密。
理想情况下,我们需要一种方法来验证对应于特定网页的 POST 请求是否真实。我们不能只抓取网页并将内容与发布的内容进行比较,因为让 JavaScript 提交内容的目的是它可能位于登录系统之后。
有什么想法吗?我希望我已经很好地解释了这个问题。提前感谢您的任何建议。
【问题讨论】:
-
@Bungle:您提到“我们不能使用任何......神秘的标识符”,但这种机制可以公开观察,同时仍然保持安全。您可以生成从网络发布者的域(例如“foo.bar.com”)派生的加密密钥。您的服务器端代码可以解密密钥以提取域(除其他外),并且您的客户端代码显然可以访问
window.location以验证该脚本仅被授权这样做的域包含。类似于 Google 对其客户端脚本 api 所做的事情:code.google.com/apis/maps/documentation/premier/… -
@Bungle:没关系,我想我明白你在问什么。您想保护实际的 POST 请求,而不是脚本包含。
-
这不是一个容易解决的问题。我需要有关您的申请的更多信息。什么是有效的文件上传?您是否强制用户登录?您只接受来自特定域的帖子吗?您必须更具体地说明什么是有效与无效。
-
@Crescent Fresh:没错。我们的想法是任何人都可以生成模拟我们的 POST 请求,无论他们是否在网页中运行我们的
<script>。只要他们的请求具有正确的标头信息和内容,我们的服务器就会接受它并将生成的 HTML 绑定到他们指定的 URL。 -
@The Rook:本质上,我们想要一种方法来确保我们的服务器收到的 POST 请求实际上是由 Web 发布者页面上的
<script>元素发起的(即,来自我们的客户),而不仅仅是恶意方生成的 POST 请求。不涉及登录/身份验证或文件上传。我们的<script>出现在网页上,执行时收集其文本内容并将其发布到我们的服务器,在服务器上使用页面的 URL 作为键对其进行索引。恶意用户可以...
标签: javascript security authentication cross-domain jsonp