valorin / pwned-validator
一款超级简单的Laravel验证器,用于通过Have I Been Pwned的Pwned Passwords服务检查密码
Requires
- php: >=7.2
- ext-curl: *
- illuminate/support: ^5.5||^6.0||^7.0||^8.0|^9.0|^10.0||^11.0
README
Laravel通过Password::uncompromised()
验证规则包含官方的Pwned Passwords验证器,所以我建议查看这个:[Laravel官方文档](https://laravel.net.cn/docs/10.x/validation#validating-passwords)
Pwned Password验证器会检查用户提交的密码(在注册或密码更改表单中)是否是已知的受攻击密码。如果密码已被攻击,验证将失败,防止用户在您的应用中使用该密码。
Pwned Passwords是以前在数据泄露中暴露的五亿个真实世界密码。这种暴露使它们不适宜继续使用,因为它们有很大风险被用来接管其他账户。
此功能使用了Pwned Passwords API的范围搜索功能,它使用k-anonymity来显著降低在访问API时的信息泄露风险。对于大多数系统来说,这应该已经足够安全,尽管您应该自己决定是否适合您的应用。
请查看Troy Hunt的博客文章,其中他解释了该服务的工作原理:[Troy Hunt的博客](https://www.troyhunt.com/ive-just-launched-pwned-passwords-version-2/)
Troy与Cloudflare合作开发了此服务,他们对该服务的工作原理和安全性影响进行了深入的技术分析:[Cloudflare的博客](https://blog.cloudflare.com/validating-leaked-passwords-with-k-anonymity/)
最终,是否安全用于您的应用由您自己决定。
安装
使用Composer安装包
composer require valorin/pwned-validator
Laravel的服务提供者发现将自动为您配置Pwned服务提供者。
将验证消息添加到您的验证lang文件中
为每种语言添加一个验证消息到validation.php
,如下所示
'pwned' => 'The :attribute is not secure enough',
使用pwned
验证器
安装后,pwned
验证器将可以直接在您的验证规则中使用。
'password' => 'pwned',
在注册表单的上下文中,它看起来像这样
return Validator::make($data, [ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:6|pwned|confirmed', ]);
使用规则对象
或者,如果您更喜欢,可以使用Valorin\Pwned\Pwned
验证规则对象而不是pwned
别名
return Validator::make($data, [ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => ['required', 'string', 'min:6', new \Valorin\Pwned\Pwned, 'confirmed'], ]);
验证消息
您需要在resources/lang/*/validation.php
文件中分配自己的验证消息。规则对象和pwned
验证器别名都引用验证字符串validation.pwned
。
我没有设置默认的语言字符串,因为这很重要,您需要为预期的用户提供正确的语言。在一些系统中,像“您的密码已被攻击!请使用一个新的!”这样的消息是合适的,而在其他系统中,您可能需要更长的消息
您的密码安全性不足,因为它已在已知的密码泄露中被发现,请选择一个新的密码。 需要帮助吗?
感谢 kanalumaddela,您可以在消息中使用 :min
来指示在验证器上设置的至少出现次数。
您的密码安全性不足,因为它在已知的密码泄露中至少出现 :min 次,请选择一个新的密码。
根据密码被泄露的次数进行限制
您还可以将拒绝的密码限制为那些至少被泄露了一定次数的密码。例如,password
已被泄露 3,303,003 次,然而 P@ssword!
只被泄露了 118 次。如果我们想阻止 password
但不阻止 P@ssword!
,我们可以将最小次数指定为 150,如下所示
'password' => 'required|string|min:6|pwned:150|confirmed',
或使用规则对象
'password' => ['required', 'string', 'min:6', new \Valorin\Pwned\Pwned(150), 'confirmed'],
常见问题解答
问:这有多安全?
答:请查看Troy Hunt和Cloudflare上链接的博客文章,它们将回答您的问题并帮助您决定这对您来说是否足够安全。
问:您是否进行任何缓存?
答:是的!每个前缀查询都会被缓存一周,以防止对同一前缀进行多次检查时的不断API请求。
问:测试在哪里?
答:为了正确测试这段代码,我们需要调用网络服务。我不想自动化这个过程,以免滥用这个出色的服务。相反,由于这是一个非常简单的验证器,我目前选择手动测试。