签名的URL作为安全措施


1

实施签名URL是一种有效的安全措施,可防止通过GET请求访问的公共资源上的URL篡改和中毒。

例如 http://www.domain.com/:url_to_resource/:hash http://cdn.domain.com/:url_to_resource.js?:hash

哈希在我的情况下,将对应的资源我的缓存键。

任何反馈,改进或批评将不胜感激。

1

如果客户端正在修改客户端,那么我们还需要客户端证书的机制以获得信任。为了避免对来自服务器的连接进行更改,SSL已经覆盖了这个和更多。真的,我没有看到这将提供什么SSL功能,除非您只是寻找一种轻量级的方式来保护链接,而无需使用完整的SSL连接。

这似乎也会对重播攻击非常开放,除非提供某种类型的IV,因为如果服务器曾经向攻击者显示URL,那么该URL可以随签名一起复制给任何未来的用户。这对于允许用户创建链接的网站来说尤其具有破坏性,尽管也许这些链接可能不受信任和未签名。

  0

这将如何影响您的答案: 当用户第一次访问该页面时,只会创建一个HTTP,安全Cookie HMAC(SessionID,SharedSecret,scrypt(密码),过期)。 Cookie与数据库表相关联会话(SessionID,数据,HMAC,签名,到期)。所有数据都在客户端加密,因此服务器无法读取数据。 (合理可变性)。 12 8月. 132013-08-12 13:33:22

  0

@ 4e494c - 我不确定我是否按照您的意见或意图从该评论。是“你”服务器吗?如果是这样,什么是数据和签名是指什么?没有足够的背景知道你打算如何使用这些值来理解它。 12 8月. 132013-08-12 13:39:33

  0

正确,“你”是指服务器。 SharedSecret是指服务器和用户cookie之间的唯一共享密钥。会话签名基本上只是哈希签名的标准化表示,到期仅仅是数字格式的失效日期。 12 8月. 132013-08-12 13:49:47

  0

@ 4e494c - 好吧,那对于签署链接和在哪个方向的情况应该如何?我仍然不理解如何在原始情况下使用它。 12 8月. 132013-08-12 13:52:39

  0

签名&& || HMAC将包含JS文件哈希。处理流程:用户 - >站点 - > Cookie /会话 - >站点 - > JS(带有签名的URL)。为了解决混乱问题,我试图解决几个很多问题。 12 8月. 132013-08-12 14:02:06

  0

@ 4e494c - 你只是想确保客户端返回的链接与提供给它的服务器相同吗?如果HMAC和签名都来自服务器,或者在服务器上知道,那么你想要完成什么。我真的迷失在这一点上。 12 8月. 132013-08-12 14:19:35

  0

对不起,漫长的一天。对于我的用例我只是寻找一种方法来验证从服务器发送的JavaScript文件是真实的,并在它到达用户时不变。其他客户端加密是非常无用的,并且如果我不能验证文件签名就容易被利用。 虽然我最初的问题是URL签名可以用来防止URI漏洞利用的分配,所以我试图推广这个问题以使问题对其他人更有用。 例如/index.php?:hash&file=../../../etc/password 12 8月. 132013-08-12 14:30:32

  0

@ 4e494c - 在这种情况下,仅仅基于服务器证书的签名就足以验证JS文件,但问题是让浏览器知道它应该期望JS文件被签名。这实际上也是一个基本问题,即最近的SSL攻击大多数都是通过使浏览器不期望签名或加密的内容来加强这一过程而采用的。我没有看到简单地使用SSL进行连接的任何实际收益,因为如果没有这些,设置浏览器检查的标志可能会被剥离,就像SSLStrip所做的那样。 12 8月. 132013-08-12 15:14:06

  0

会开发一个浏览器插件,验证/验证JS文件是这个问题的一个可行的解决方案? 14 8月. 132013-08-14 14:14:56

  0

@Null - 除非互联网上的每个JS文件都已签名,否则浏览器无法知道它何时首次访问JS文件应提供签名的站点。每次尝试建立服务器的SSL连接都可以被剥离并作为非保护页面发送给用户。 14 8月. 132013-08-14 14:49:47

  0

我不认为每个JS都需要它。它可以通过在同一台服务器上声明一个CORS类型配置并应用相同的原始策略来加入。然后这可以与我上面提到的签名url概念相关联。SSLStrip是一个我没有考虑过的问题。感谢您的指导。 14 8月. 132013-08-14 15:47:39

  0

@Null - 但你如何确保该信息到达客户端?这样的签名的目的是为了防止mitm攻击,但mitm可能根本不设置配置。你永远不会对正确的服务器进行通话,所以你的浏览器永远不会知道期待它。 14 8月. 132013-08-14 16:21:06


0

如果在运输过程中进行篡改(代理,MITM),可能会有所帮助,但如果在服务器上进行了篡改(SQL或PHP注入或替换文件),将无济于事。

鉴于网页的很大比例是动态生成的,散列必须由服务器计算,因为它服务于页面......我认为这需要彻底检查服务器和浏览器端,因为一个请求将需要返回页面和它的散列,否则在发送第二个请求以获取散列时,该页面可能会合法地更改。

它确实证明的是该页面是服务器发送给您的页面,我们已经为此提供了HTTPS。

  0

谢谢罗德,感谢您的意见。我最初的设计是允许通过SSL/TLS从可信服务器安全地进行客户端JS传输,这将是一个相对静态的资产,预期的用例是客户端加密。除了通常的客户端加密之外,你是否看到任何明显的陷阱? 12 8月. 132013-08-12 12:38:55

  0

如果你使用它来证明url没有被改变,那么你就像https证明那样浪费了你的时间。客户端加密是什么意思?你在谈论认证吗? 12 8月. 132013-08-12 12:45:56

  0

由于在BlackHat 2013上发布的对SSL/TLS的各种攻击,我担心的是SSL/TLS,也就是HTTPS已经在减弱,没有被破坏。因此,HTTPS证明不是完全可以证明的。例如如果实体要拦截HTTPS流量(PRISM),我理论上可以在网络级别更改响应(文件),或者甚至可以更轻松地将CDN网址重新映射到假服务器并发送恶意资产。 我的预期用例是提供浏览器密码,以使用共享密钥对客户端上的会话数据进行加密,并仅处理服务器上的加密数据。 12 8月. 132013-08-12 13:04:19

  0

如果恶意方可以更改页面的内容,那么他​​们肯定可以指向你想要的任何资产(并禁用任何基于JavaScript的验证你实现) 12 8月. 132013-08-12 13:17:56

  0

@RossDargan正确,但如果我可以使用这个散列/签名的服务器发送测试这个有效性,我可以然后拒绝会话,刷新页面,警告用户,并尝试重新生成。或者我错过了什么? 12 8月. 132013-08-12 13:22:42

  0

如果有人被恶意攻击,他们可能会强迫你从不同的服务器上获取数据,而不进行检查。如果他们想从你的服务器获得它,那么他们可能会做一个MITM攻击,在那里他们强迫你从那里得到一个服务器,它向你的服务器请求获得一个有效的散列,然后他们得到这些数据并返回它给你。如果他们打破了SSL,他们有你的会话cookies,所以可以模仿你。 12 8月. 132013-08-12 13:27:01

  0

@RossDargan,这将如何影响你的答案。 当用户第一次访问该页面时,仅创建HTTP,安全Cookie HMAC(SessionID,SharedSecret,scrypt(密码),过期)。 Cookie与数据库表相关联会话(SessionID,数据,HMAC,签名,到期)。所有数据都在客户端加密,因此服务器无法读取数据。那么对攻击者来说它是没用的? 12 8月. 132013-08-12 13:36:01

  0

它很难理解你实际保护的是什么。如果你担心ssl被破坏,那么只需要cookie http就无关紧要了 - 一次MITM攻击可以把cookie取出来,让攻击者可以使用它来解密所有需要的信息。 12 8月. 132013-08-12 14:09:26

  0

@RossDargan,我会给我一些想法和重述。 12 8月. 132013-08-12 14:15:02