带有令牌参数的https URL:它的安全性如何?


88

在我们的网站上,我们根据用户的私人信息(通过表格提供)向他们提供模拟。我们希望允许他们稍后再获得其模拟结果,但又不必强迫他们创建登录名/密码帐户。

我们已经考虑过向他们发送带有链接的电子邮件,他们可以从中获取结果。但是,自然地,我们必须保护此URL,因为私有数据受到威胁。

因此,我们打算在URL中传递令牌(如字母和数字的40个字符的组合,或MD5哈希),并使用SSL。

最后,他们会收到这样的电子邮件:

嗨,
https://www.example.com/load_simulation?token=uZVTLBCWcw33RIhvnbxTKxTxM2rKJ7YJrwyUXhXn上获取结果

你怎么看待这件事?它足够安全吗?对于代币生成,您有什么建议?如何在https请求中传递URL参数呢?


Answers:


97

SSL将保护传输中的查询参数;但是,电子邮件本身并不安全,并且电子邮件可能会在到达目的地之前沿任意数量的服务器反弹。

另外,取决于您的Web服务器,完整的URL可能会记录在其日志文件中。根据数据的敏感程度,您可能不希望IT人员访问所有令牌。

此外,带有查询字符串的URL将保存在用户的历史记录中,从而允许同一计算机的其他用户访问该URL。

最后,最不安全的是,URL在所有资源(甚至第三方资源)的所有请求的Referer标头中发送。因此,例如,如果您使用的是Google Analytics(分析),则将URL令牌以及所有令牌发送给Google。

我认为这是一个坏主意。


1
我没有考虑过HTTP引荐来源问题,但是url链接将重定向到结果页面,而不是合适的页面(没有google Analytics(分析)或其他第三方脚本)。
Flackou

5
从HTTPS到HTTP时,大多数浏览器都不会删除引荐来源网址吗?
凯文·马克2010年

2
这类似于用户激活(或密码重置)链接吗?那该如何处理呢?许多网站都将重置网址发送到电子邮件,但POST是不可选项,因为它应该是可单击的。谢谢。
pinkpanther

2
那么解决方案是什么?
RT

1
如果网址中的令牌与用于api请求的令牌不同,并且仅持续一小时,那会有什么危害呢?
user1709076

13

我会为此使用cookie。工作流程应如下所示:

  1. 用户是第一次访问您的网站。
  2. 网站设置了一个cookie
  3. 用户输入数据。数据使用Cookie中存储的某些密钥存储在DB中。
  4. 用户离开后,您可以通过https:链接向他们发送电子邮件
  5. 当用户回来时,站点发现cookie,并可以向用户显示旧数据。

现在,用户希望在其他计算机上使用其他浏览器。在这种情况下,请提供一个“转移”按钮。当用户单击此按钮时,她将获得一个“令牌”。她可以在另一台计算机上使用此令牌来重置cookie。通过这种方式,用户可以决定她希望传输令牌的安全性。


4

SSL可保护传输中数据的内容,但我不确定该URL。

无论如何,减轻攻击者重用该URL令牌的一种方法是确保每个令牌只能使用一次。您甚至可以设置一个cookie,以便合法用户可以继续使用该链接,但是首次访问后,它将仅对具有cookie的人起作用。

如果用户的电子邮件被盗用,而攻击者首先获得了链接,那么,您将大受打击。但是用户也有更大的问题。


10
在传输URL之前,必须确保SSL连接的安全。
大卫,2009年

1

电子邮件本质上是不安全的。如果任何人都可以单击该链接并访问数据,那么您并不是真正在保护它。


确切,但许多网站对此并不在意,并通过邮件发送登录名/密码。但这并不是模仿它们的理由...
Flackou

我同意没有理由模仿它们,但是它们通常会告诉您在您首次登录后更改密码。
杰森·普尼扬

1

那么令牌通过SSL传递时是安全的。您将要遇到的问题是,可以通过查看URL来使人(不适合其使用的人)满意。

如果是像SSN这样的私人信息,我认为我不会通过电子邮件发送URL。我希望他们为该网站创建一个用户名和密码。对于您和他们来说,危及具有此类危险信息的电子邮件太容易了。如果某人的帐户受到损害,就会引起怀疑,这实际上是谁的错。从严格的CYA角度出发,越安全越好。


1
您说对了:例如,URL仍将保留在浏览器历史记录中
Flackou 2009年

0

对于存在严重隐私问题的情况,我真的不认为这样的安全性足够。到目前为止,您通过(可能是明文)电子邮件发送URL的事实是最弱的链接。之后,存在对令牌进行蛮力攻击的风险,这种令牌(缺乏真实的身份验证机制的结构)比结构合理的用户名和密码设置更容易受到攻击。

顺便说一句,https请求中的参数根本没有问题。


您对暴力攻击的风险是正确的。我看不到如何防止机器人受到此类攻击。禁止“固定” IP并不是足够的保护。您对此主题有想法吗?
Flackou

实际上,使用我们正在讨论的密钥空间类型,将if(this_ip_number_has_requested_an_invalid_token_today())睡眠(5); 在您的load_simulation脚本中将是完全足够的保护。(速率限制是好的身份验证机制的特征之一。)
混乱

感谢您的回答。但是我认为同一个漫游器可以轻松获取不同的IP,这使得IP速率限制不足。我错了吗?
Flackou

每个IP只能进行一次不延迟的尝试。IP地址空间不是那么容易获得,因此很有用。
混乱

0

实际上,这将是一个坏主意。您将通过易于使用来破坏安全性。如前所述,SSL仅保护服务器和客户端浏览器之间的信息传输,并且仅防止中间人攻击。电子邮件非常危险且不安全。

最好的办法是使用用户名和密码验证来访问信息。

我或多或少喜欢cookie的想法。您还应该加密cookie信息。您还应该生成带有盐和关键字短语以及$ _SERVER ['HTTP_USER_AGENT']的令牌,以限制攻击的可能性。在Cookie中存储有关客户端的尽可能多的非敏感信息,以供验证使用。

关键字可以存储在cookie中以方便使用,但请记住,cookie也可能被盗=(。

最好让客户键入他提供的关键词,该关键词也与他的数据一起存储在数据库中。

或者,如果该人使用的其他机器的$ _SERVER ['HTTP_USER_AGENT']参数有所不同,或者只是错过了cookie,则可以使用该键。这样就可以传输或设置Cookie。

还要确保敏感数据在数据库中已加密。你永远都不会知道 ;)


-1

您知道,如果有任何黑客可以访问您的数据库,那么可以免费提供许多个人信息?

之后,我想说这还不错。我不会使用MD5或SHA1,因为它们对于散列不是很安全。可以很容易地将它们“解密”(我知道这不是加密)。

否则,我可能会使用不会通过电子邮件发送的第二种信息作为密码。原因很简单,如果某人可以访问用户的电子邮件(如果您不取消会话,则很容易使用hotmail),他将有权访问该用户发送的任何信息。

请注意,HTTPS将保护和加密从您的站点发送给最终用户的数据。没什么,把它当作一个安全的隧道。没什么比没什么少。


从任何意义上说,盐化的SHA1哈希如何准确解密?
Eli

“您知道,如果有任何黑客可以访问您的数据库,那么可以免费提供许多个人信息吗?” 是的,但不是所有网站都有问题吗?
Flackou

@Flackou是的,但是如果您可以访问贝宝的数据库,则不会找到清楚保存的信用卡信息,所有信息都已加密。@Eli:theregister.co.uk/2005/02/17/sha1_hashing_broken
埃里克

-1

根据我对您的想法的了解,从理论上讲,有人可以输入40个随机字符串或MD5哈希值,并获取他人的详细信息。尽管这不太可能发生,但是只需要发生一次。

更好的解决方法是向用户发送令牌,然后要求他们输入一些详细信息,例如他们的姓名,邮政编码,ssn或这些内容的组合。


5
SSN?你是认真的吗?无论如何,我建议您对有40个字符随机字符串进行数学计算。这不仅仅是“极不可能”
Eli

没错,我们可能应该在网址中添加另一个参数,例如电子邮件(即使a..z + A..Z + 0..9 = 62个字符,而62 ^ 40是一个很大的数字)。
Flackou

伙计们,62 ^ 40比宇宙中的原子数大得多。从字面上是不可猜测的。
Eli

1
令我惊讶的是,有多少人无法掌握这些数字的规模。如果您每秒猜测一百万个令牌,那么在您受到打击之前太阳很可能会烧掉
Eli

4
理查德,听起来您在指出通常所说的生日悖论...不仅重要的是可能的组合数量,而且还使用了其中的多少。好了,在这种情况下,您需要使用62 ^ 40个组合中的大约2 ^ 119个,机会才有意义。
erickson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.