valorin/pwned-validator

一款超级简单的Laravel验证器,用于通过Have I Been Pwned的Pwned Passwords服务检查密码

资助包维护!
valorin

1.3.7 2024-02-28 07:44 UTC

This package is auto-updated.

Last update: 2024-08-28 09:07:31 UTC


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请求。

问:测试在哪里?
答:为了正确测试这段代码,我们需要调用网络服务。我不想自动化这个过程,以免滥用这个出色的服务。相反,由于这是一个非常简单的验证器,我目前选择手动测试。