首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释令牌在GET上传输数据的使用

解释令牌在GET上传输数据的使用
EN

Stack Overflow用户
提问于 2014-08-18 23:07:04
回答 1查看 164关注 0票数 0

(全文=对此问题的最新答复/讨论:to in email not posting)

我希望用户点击电子邮件中的链接,并能够在我的数据库中发布数据。我目前的理解是:

  • 最佳实践(以上问题的最新答案,以及我已经尝试过的其他答案)=使用GET将令牌传送到我的网站(因此可能类似于example.com?token=asdfaiosugkljlfkdjslfjasklf),然后在我的网站上有一个脚本来获取该令牌,解析数据,并将其发布
  • 与GET一起使用令牌的原因是,它不安全;任何人都可以看到URI,可以缓存/标记它,因此,如果不断提交,它可能导致错误的发布到数据库,也就是说,我不应该作为GET执行类似于example.com/:id/action的操作,因为这会多次触发操作(在我的例子中,这会导致删除记录,这是很糟糕的)

我不明白的是,令牌是如何不同的,因为它并不是每次用户打开他/她的电子邮件时,都会看到不同的链接。即使我传递了一个令牌,并且电子邮件中的链接是example.com?token=asdfaiosugkljlfkdjslfjasklf,这个链接仍然可以被书签/缓存/任何东西。作为我研究的一部分,我查看了另一个web服务发送给我的电子邮件,在电子邮件中有一个按钮,我可以点击这个按钮发布一些信息。实际上,每次我检查链接时,都是一样的:www.theirsite.com/?uid=ABC,其中ABC是Base64令牌。事实上,我可以反复点击它,我可以一次又一次地给它做书签和打开它。它看起来就像是数据的掩码,但每次都是相同的掩码,毫无意义。

现在,如果掩码在那里是为了安全起见,我有点理解,因为也许只有您的网站能够解码令牌。但在我的例子中,我只想确保URI不会无意中导致多个重复的POSTings,正如我所说的,这将删除数据。我没有敏感的用户信息。

当然,我意识到在我的理解中可能有很大的漏洞,所以我打开这个让更聪明的人来解释“大人物”在以下方面所做的事情:

  1. 当您需要将数据发送到数据库时,是否仍然需要使用令牌来传输数据(比如敏感数据,因为即使现在没有用,我肯定在某个时候会需要它)通过HTTP请求吗?
  2. 如何确保URI只能修改数据库一次?(有某种first方法吗?在此之后,用户会弹出一个显示他们已经执行了操作的弹出?)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-21 04:07:34

代币在这里有几个用途。首先,它们可以用来验证您的行为是合法的来自您发送的电子邮件,而不是来自某个野蛮人-强制一个URL。第二,令牌可以用来防止意外重播,或完全重播攻击。下面是操作步骤:

当你发送一封电子邮件,链接到:/requestes1001/accept?token=asdf.实际上,您应该是:( A)以安全的方式随机生成令牌;( B)将令牌存储到数据库中,可能还包含一些额外的元数据。稍后将更多地介绍元数据。

设计应该是:只有在令牌未被使用的情况下,请求才是有效的,并且令牌仅为一次性使用。当用户单击电子邮件链接时,需要检查所提供的令牌是否与令牌表中的一行匹配。然后从表中删除令牌(除非您喜欢竞争条件,请使用事务)。这显然是实现你想要的东西的最简单的方法--你不需要做任何其他的事情来确保链接不能被重复跟踪,而且你不能做更少的事情(根据定义,跟踪一个链接是否被使用需要你记住一些特定于该链接的信息)。您在调查的电子邮件中看到的令牌就是这样操作的。

您可以将其他元数据添加到令牌中,例如,只有可能合法使用它的用户的ID。但是,根据其他表的设置方式,这可能最终导致数据库的非规范化。

顺便提一句,这不是RESTful,因为它是GET请求中的一个可变操作,但在本例中,POST被高估了,不会给出任何超出GET的内容。它也很难在电子邮件中实现(你可以用rails的_method参数破解它,但它没有真正的好处)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25373406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档