如何确保 HTTP_REQUEST 来自正确的地方?

Posted

技术标签:

【中文标题】如何确保 HTTP_REQUEST 来自正确的地方?【英文标题】:How to ensure the HTTP_REQUEST Is coming from the right place? 【发布时间】:2011-06-01 18:41:25 【问题描述】:

我了解到 HTTP_REFERER 或任何 HTTP 请求标头都可能是假的且不可靠。

REMOTE_ADDR 是可靠的。

那么,如何确保传入的 HTTP_REQUEST 调用来自我列入白名单的网站?

例如,我有一个 js 代码将从客户端站点发送到服务器。 (类似于狙击手,跨平台)。但是,我只允许在几个网站上发生这种情况。不是其他人。所以,即使其他人复制代码并放到他们的网站上,它也行不通。

【问题讨论】:

【参考方案1】:

在一般情况下,您根本无法做到这一点。你完全听从客户的摆布。您可以通过检查引荐来源使其变得更加困难,但并非不可能。

【讨论】:

【参考方案2】:

可靠地做到这一点的唯一方法是让所有这些几个网站为每个用户生成唯一的令牌,就像保护自己免受CSRF attacks 的侵害一样。然后令牌将与您的脚本的请求一起发送,并且您的服务器需要有一种方法来检查令牌与其他网站的真实性。不用说,除非您控制所有网站,否则这很可能是不可能的。

另请参阅question on HTTP_REFERER

【讨论】:

如果它们是为每个用户唯一生成的,则不会。好吧..至少它会阻止任何随机站点添加js代码并由随机人员执行。当然,如果您构建了一个自定义客户端,该客户端将获取一个有效的令牌,然后在其他地方重新使用它,那就是另外一回事了。【参考方案3】:

没有在实践中使用过这个,所以可能存在我没有指望的实用性问题,但我想我还是会贡献这个想法。如果我解释正确,这与@Seldaek 发布的想法相似(如果不相同)。

    您的服务器会为每个页面服务生成一个唯一 ID,并将该 ID 嵌入页面中。 服务器存储 ID 和客户端的 IP 地址。 客户端的js将ID放入其对Server的请求中并发送请求。 当服务器接收到来自客户端的 js 请求时,它只会在 IP/ID 对与文件中的一对匹配时做出响应(参见 #2)。 在指定时间后(和/或浏览器会话结束时),ID/IP 条目过期。

如果共享访问者 IP 地址的人(可能两者都在同一个 NAT 框后面)实时劫持另一个访问者的会话,这可能是伪造的,但它至少可以防止某人制作另一个网页您的服务器的服务。

如果由于某种原因,您的访问者的 IP 地址在提供页面和发送 js 请求之间发生变化,也可能会出现问题。

基本上,您的服务器会说“我不会为您的 js 请求提供服务,除非您拥有我最近提供的页面中的数据,并且您来自(据我所知)我提供该页面的地方。 "

【讨论】:

【参考方案4】:

所有http头都可以伪造。

如果您只是接受来自远程服务器的通信(并且没有将客户端浏览器重定向到您的服务器),那么您可以在远程服务器和您的服务器之间设置 ***,或者您可以将防火墙配置更改为仅允许从一组特定的 IP 地址进行通信。但是,即使是后者也可能被愿意走那么远的人伪造。

如果客户端浏览器要么被重定向到您的服务器或从您的服务器加载文件,那么您绝对无能为力。

【讨论】:

【参考方案5】:

正如@Billy 所说,这根本不可能,您正在错误地考虑互联网的请求响应机制。

例如,我有一个 js 代码 将从客户端站点发送到服务器。 (有点像狙击手,十字架 平台)。

我假设您的意思是在您的“白名单”中的某个网站上提供了一些 javascript 代码,将用户重定向到您的网站。您想在您的网站上检查用户是否来自“白名单”网站?

除了设置 cookie(可能不可能 - 跨域)之外,您可能会觉得这很困难。你看过OpenID吗?如果您可以发布更多详细信息,则解决方案可能会更明显。

【讨论】:

【参考方案6】:

那么,我怎样才能确保传入 HTTP_REQUEST 调用来自 我列入白名单的网站?

我认为,如果您签署每个对该请求有效的请求(来自白名单)仅(一次)。我假设使用 uniqid 是安全的(够了吗?)。

【讨论】:

以上是关于如何确保 HTTP_REQUEST 来自正确的地方?的主要内容,如果未能解决你的问题,请参考以下文章

如何确保来自 JMS 队列的消息被传递到外部 WebService (CXF)?

带有上传证书的Android Sign APK(如何确保正确的指纹)

HTTP_ORIGIN 的安全性如何?

如何正确使用事务和锁来确保数据库完整性?

js中如何处理由ajax传回的json? var result = http_request.responseText;var json = eval(result);

X.509证书验证过程