设计valid_password的怪异问题?


78

在过去的2个小时中,我一直在尝试调试一个怪异的问题,该问题不允许我登录。

这也是我指的东西:

password 
=> 'vinodsobale'

password == 'vinodsobale'
=> true

resource.valid_password?(password)

=> false

resource.valid_password?('vinodsobale')

=> true

以及屏幕截图:

在此处输入图片说明 注意:我在devise中启用了调试器,因此上面的代码是devise内部代码。

对我来说,这似乎是一个问题Devise.secure_compare


2
打开GitHub问题?最好进行可重复的测试。
vemv

4
@Viren-我不知道关于ruby或设计的线索,但是我会检查给定密码的编码。
MByD

3
您能做一个password.encoding并告诉我们结果吗?这是我唯一会想到的错误。您还可以::BCrypt::Engine.hash_secret(password, salt)尝试并将其与实际存储的哈希进行比较。为此,比较text.bytes也可能会派上用场。
鲁道夫·

4
您可以检查password.bytes'vinodsobale'.bytes只是确定吗?
鲁道夫

3
@ lad2025,“保存一个”是什么意思?是password吗?如果是,NULL character \0则应将其编码为unicode,并且password == 'vinodsobale'不应返回true
vutran

Answers:


3

这个问题是由于红宝石2.2.0已知串腐败错误,被固定在2.2.2。

错误报告中所述,当BCrypt从其C扩展调用特定的字符串创建API时发生损坏,Devise v3.3.0通过::BCrypt::Engine.hash_secret从该Devise::Models::DatabaseAuthenticatable#valid_password?方法的调用触发了该字符串创建API 。v3.5.0中发布了针对该错误的特定于Devise的解决方法

解决方案是:

  • 将Ruby降级< 2.2.0或升级到>= 2.2.2;
  • 将“设计”升级到>= 3.5.0

0

怎么样

resource.valid_password?(password.to_s)

希望对您有帮助。


3
请编辑您的信息,并解释为什么它会起作用。
罗希特·古普塔

您为什么认为这会起作用,首先我已经提到过很多问题,例如password == 'vinodsobale' 比赛。如果那vinodsoble是类型string(我们都可以看到),那么这样做password也不会产生任何不同。其次,您刚才提到的代码是devise内部代码的一部分,您想如何实现它,例如打开devise代码并对其进行猴子修补。string.to_s
维伦(Viren)2015年

1
如果右侧存在无效类型,则等于操作符可能会自动调用to_s方法。但是我只是在猜测。你试过了吗?
巴勃罗·乔莫

这是一个合理的解释。
sevenseacat

2
您曾经使用过password == 'vinosobale'。你可以尝试password === 'vidodsobale' 比赛吗?你能读这个问题吗?stackoverflow.com/questions/7156955/…
СергійНазаревич

0

DeviseDatabaseAuthenticatable#valid_password?正在使用一种方法Encryptor::compare,该方法需要2个对象,即您要比较的当前存储的密码和新密码,我相信此方法有一个副作用,它会修改中间的第二个参数,因此它将改为修改该对象一次将被修改两次,这将导致错误的结果,因此,如果您传递了一个重复的密码对象,它可能会起作用。你可以尝试使用valid_password? password.dup


如果是这种情况,为什么resource.valid_password?('vinodsobale')每次我运行该字符串时都不会提供该修改,而以前却可以正常工作return true
Viren

0

原始源和控制台之间的编码可能有问题。如果运行password.codepoints,您应该能够看到实际的编码。运行.codepoints在原始“密码”字符串应该返回[112, 97, 115, 115, 119, 111, 114, 100]

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.