包含令牌参数的https URL:它有多安全?
在我们的网站上,我们向用户提供基于其私人信息(通过表格给出)的模拟。 我们希望稍后让他们恢复模拟结果,但不要强制他们创buildlogin名/密码帐户。
我们曾想过给他们发送一封带有链接的电子邮件,从中可以得到他们的结果。 但是,自然,我们必须保护这个URL,因为私人数据处于危险之中。
所以我们打算在URL中传递一个令牌(比如40个字母和数字的组合,或者一个MD5哈希),并使用SSL。
最后,他们会收到这样的电子邮件:
嗨,
通过https://www.example.com/load_simulation?token=uZVTLBCWcw33RIhvnbxTKxTxM2rKJ7YJrwyUXhXn获取结果
你怎么看待这件事? 它足够安全吗? 你会怎么build议我为代币生成? 在https请求中传递URL参数怎么样?
SSL将保护传输中的查询参数; 然而,电子邮件本身并不安全,并且在到达目的地之前,电子邮件可以在任何数量的服务器上弹跳。
另外,根据您的Web服务器,完整的URL可能会logging在其日志文件中。 根据数据的敏感程度,您可能不希望您的IT人员访问所有的令牌。
另外,带有查询string的URL将被保存在用户的历史logging中,以允许同一台机器的其他用户访问该URL。
最后是什么使得这个非常不安全的是,URL在任何资源的所有请求的Referer头部中发送,甚至是第三方资源。 因此,如果您使用Google Analytics(分析),则会将Google URL标记全部发送给他们。
在我看来,这是一个坏主意。
我会用这个cookie。 工作stream应该是这样的:
- 用户首次来到您的网站。
- 网站设置一个cookie
- 用户input数据。 数据使用存储在cookie中的一些密钥存储在数据库中。
- 当用户离开时,您向他们发送带有https:链接的电子邮件
- 当用户返回时,站点发现cookie并且可以向用户呈现旧数据。
现在,用户想要在不同的机器上使用不同的浏览器。 在这种情况下,提供一个“转移”button。 当用户点击这个button时,她会得到一个“令牌”。 她可以在另一台计算机上使用此令牌来重置Cookie。 这样,用户决定她想要传送令牌的安全性。
SSL保护传输中的数据内容,但我不确定URL。
无论如何,缓解攻击者重用URL标记的一种方法是确保每个标记只能使用一次。 你甚至可以设置一个cookie,以便合法用户可以继续使用该链接,但在第一次访问后,它只能用于cookie的人。
如果用户的电子邮件受到攻击,并且攻击者首先获得链接,那么您就会受到攻击。 但用户也有更大的问题。
电子邮件本质上是不安全的。 如果任何人都可以点击该链接并获取数据,那么您并不真正保护它。
那么令牌在通过SSL时是安全的。 您将遇到的问题是,通过查看url,人们(无意的人)可以使用它。
如果是私人信息,如SSN,我不认为我会通过电子邮件发送一个URL。 我宁愿让他们为网站创build一个用户名和密码。 为了你和他们的利害攸关的信息而妥协一个电子邮件太容易了。 如果某人的账户被压缩了,它会进入一个真正的错误。 从CYA严格的angular度来看,越安全越好。
对于存在严重隐私问题的情况,我真的不会认为这足够安全。 事实上,你发送一个(大概明文)电子邮件的URL是迄今为止最薄弱的环节。 之后就是对令牌进行暴力攻击的风险,这种风险(缺乏真正authentication机制的结构)比构build良好的用户名和密码设置可能更容易受到攻击。
顺便说一句,https请求中的参数根本没有问题。
事实上,这将是一个坏主意。 你会很容易地使用安全性。 如前所述,SSL只会保护服务器和客户端浏览器之间的信息传输,并且只会防止中间人攻击。 电子邮件是非常危险和不安全的。
最好的将是一个用户名和密码authentication来访问信息。
我喜欢cookies的想法或多或less。 您还应该encryptioncookie信息。 您还应该使用salt和关键短语加上$ _SERVER ['HTTP_USER_AGENT']来生成令牌,以限制攻击的可能性。 在cookie中存储关于客户端的非敏感信息,以便validation使用情况。
关键短语可以存储在cookie中,以方便使用,但请记住,cookie也可以被窃取。
最好让客户端键入他提供的关键短语,这些关键短语也与他的数据一起存储在数据库中。
或者,如果用户使用不同于$ _SERVER ['HTTP_USER_AGENT']参数的机器,或者仅仅是错过了cookie,则可以使用该密钥。 所以cookie可以被转移或设置。
还要确保敏感数据在数据库中被encryption。 你永远不会知道 ;)
你知道,如果有黑客访问你的数据库,很多人的信息可以自由地给出?
之后我会说这个想法不错。 我不会使用MD5或SHA1,因为它们对哈希不是很安全。 他们可以很容易“解密”(我知道这不是encryption)。
否则,我可能会使用第二个信息,不会通过电子邮件types的密码发送。 原因很简单,如果有人能够访问用户的电子邮件(如果不杀死你的会话,用hotmail很容易),他将有权访问用户发送的任何信息。
请注意,HTTPS将保护并隐藏从您的网站发送给最终用户的数据。 没有别的,把它作为一个安全的tunel。 没有什么比这更less的了。
根据我的理解你的想法,理论上有人可以input一个随机的40个字符的string或MD5散列,并得到别人的细节。 虽然这可能不太可能,但只需要发生一次。
更好的解决办法可能是向用户发送令牌,然后要求他们input一些细节,例如他们的姓名,邮政编码,ssn或这些的组合。