注意:
很多人似乎将“私有” URL与身份验证混淆了。同样,似乎有些困惑,认为通过可信实体发送链接是对两因素身份验证的尝试。明确地说,我们正在谈论的是一种可公开访问的资源,尽管这种资源很难猜测。
使用私有URL时,应始终假定它会遭到破坏-您应设计这样的URL,以便即使受到破坏,该资源也不会将信息泄漏给攻击者。
专用/难以猜测的URL不等同于基于密码的身份验证。从本质上讲,私有URL根本不是私有的-它们是可公开访问的资源。我认为“私有” URL一词用词不当,而是“晦涩”的URL。
在某些情况下,使用“私有” URL是可以接受的,但是它们本质上不如诸如密码认证或基于密钥的认证之类的传统认证方法安全。
我经常看到的一些使用“私有” URL的地方是:
- 密码重置电子邮件
- 证书生成电子邮件
- 帐户/电子邮件确认电子邮件
- 交付购买的内容(电子书等)
- 其他杂项,例如航班办理登机手续,打印登机牌,除传统身份验证外,还使用私有URL
这里的共同点是随机URL通常仅适合一次操作。此外,传统的身份验证和随机URL 也不互斥 -实际上,它们可以相互结合使用,以在交付资源时提供额外的安全性。
正如罗伯特·哈维(Robert Harvey)所指出的那样,安全地使用随机/私有URL的唯一方法是动态生成页面并以某种方式将URL提交给用户,从而可以认为用户是半认证的。这可能是电子邮件,短信等。
随机生成的/私有URL通常具有一些属性:
- 它应该在合理的时间后过期
- 它应该是一次性URL:IE,它应该在第一次访问后过期。
- 它应该将用户的身份验证推迟到它信任的其他一些实体,以安全地对用户进行身份验证。(通过电子邮件或短信等发送链接)
- 现代计算机不可能在到期前的时间范围内强行使用URL-通过限制暴露资源的API的速率或创建具有足够熵的url端点以致无法猜测它。
- 它不应泄漏有关用户的信息。IE:如果该页面要重置密码:该页面不应显示请求者的帐户信息。如果爱丽丝请求密码重置链接,而鲍勃以某种方式猜出了该URL,则鲍勃应该无法知道他正在重置谁的密码。
- 如果确实泄漏了有关用户的信息,则应在传统身份验证的基础上使用它,例如,如果页面设置了cookie或session_id仍然有效,则页面可能会认为用户已通过身份验证。
不同的资源需要不同的安全级别。例如,如果您想与一些朋友共享秘密食谱,则可以使用随机/私有URL与他们共享。但是,如果该资源可用于窃取某人的身份或损害他们在其他服务提供商处的帐户,则您可能会更关心限制对该资源的访问。