Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 解释令牌在通过GET传输数据时的使用_Ruby On Rails 4_Get_Uri_Token_Email - Fatal编程技术网

Ruby on rails 4 解释令牌在通过GET传输数据时的使用

Ruby on rails 4 解释令牌在通过GET传输数据时的使用,ruby-on-rails-4,get,uri,token,email,Ruby On Rails 4,Get,Uri,Token,Email,(完整上下文=对该问题的最新答复/讨论:) 我希望用户单击电子邮件中的链接,并能够在我的数据库中发布数据。我目前的理解是: 最佳实践(根据上述问题的最新答案以及我已经尝试过的其他答案)=使用GET将令牌传输到我的网站(可能类似于example.com?token=asdfaiosukljlkdjslfjasklf),然后在我的网站上使用脚本获取该令牌,解析数据并发布它 令牌应该与GET一起使用的原因是它不安全;任何人都可以看到URI,它可以被缓存/添加书签,因此,如果不断提交,它可能会导致错误

(完整上下文=对该问题的最新答复/讨论:)

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

  • 最佳实践(根据上述问题的最新答案以及我已经尝试过的其他答案)=使用GET将令牌传输到我的网站(可能类似于
    example.com?token=asdfaiosukljlkdjslfjasklf
    ),然后在我的网站上使用脚本获取该令牌,解析数据并发布它

  • 令牌应该与GET一起使用的原因是它不安全;任何人都可以看到URI,它可以被缓存/添加书签,因此,如果不断提交,它可能会导致错误的发布到数据库,也就是说,我不应该像GET那样做
    example.com/:id/action
    ,因为这会反复触发操作(在我的情况下,由于我的一个操作导致删除记录,这将是不好的)

我不明白的是代币有什么不同,因为这不像每次用户打开他的/她的电子邮件时,他/她都会看到不同的链接。即使我传递了一个代币,并且电子邮件中的链接是
example.com?token=asdfaiosugkljlfkdjslfjasklf
,那么这个链接仍然可以被书签/缓存/无论什么。作为我研究的一部分,我查看了另一个web服务向我发送的电子邮件,其中有一个按钮,我可以单击该按钮发布内容。事实上,每次我检查链接时,它都是一样的:
www.theirsite.com/?uid=ABC
其中ABC是Base64令牌。事实上,我可以反复单击它,我可以将其添加到书签中,然后反复打开它。看起来数据上的掩码,但每次都是相同的掩码,是没有意义的

现在,如果出于安全考虑,掩码在那里,我有点明白了,因为可能只有您的网站能够解码令牌。但在我的情况下,我只想确保URI不会无意中导致多次重复发布,正如我所说,这会删除数据。我没有敏感的用户信息

当然,我意识到我的理解中可能存在巨大的漏洞,因此我想让更聪明的人来解释“大人物”在以下方面的行为:

  • 当您需要将数据发布到数据库时,是否仍然需要使用令牌通过HTTP GET请求传输数据(比如说敏感数据,因为即使现在没有用,我相信在某些时候我也需要它)

  • 如何确保URI只能修改数据库一次?(是否有某种类型的
    first
    方法?之后,用户会看到一个弹出窗口,表明他们已经执行了操作?)


  • 令牌在这里有两个用途。首先,它们可用于验证您的行为是否合法地来自您发送的电子邮件,而不是来自强制使用URL的人。其次,令牌可用于防止意外重播或直接重播攻击。下面是如何:

    当你发送一封带有如下链接的电子邮件时:/requests/1001/accept?token=asdf…你实际上应该是:a)以安全的方式随机生成令牌,B)将令牌存储到数据库中,可能还有一些额外的元数据。关于元数据的更多信息

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

    您可以向令牌添加其他元数据,例如,只有合法使用它的用户的ID。但这可能会导致数据库的非规范化,具体取决于其他表的设置方式


    作为旁注,这不是RESTful,因为它是GET请求中的一个变异操作,但在这种情况下,POST被高估了,不会在GET上提供任何信息。它也很难在电子邮件中实现(您可以使用rails的_method参数对其进行破解,但它没有真正的好处)。

    令牌在这里有两个用途。首先,它们可以用来验证您的行为是否合法地来自您发送的电子邮件,而不是来自强制使用URL的人。其次,令牌可用于防止意外重放或直接重放攻击。以下是方法:

    当你发送一封带有如下链接的电子邮件时:/requests/1001/accept?token=asdf。。。实际上,您应该是:A)以安全的方式随机生成令牌,B)将令牌存储到数据库中,可能还有一些额外的元数据。关于元数据的更多信息

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

    您可以向令牌添加其他元数据,例如,只有合法使用它的用户的ID。但这可能会导致数据库的非规范化,具体取决于您的