square1/pwned-check-laravel

验证密码更改是否与已知的受损害密码相匹配

1.2.1 2022-11-15 17:31 UTC

This package is auto-updated.

Last update: 2024-09-21 10:56:13 UTC


README

Laravel验证规则,用于确定密码是否出现在一组已知的受损害密码中。这是Pwned Check实用类PHP包装器,利用Pwned Passwords服务,由Troy Hunt提供。

安装

通过Composer

$ composer require square1/pwned-check-laravel

Laravel 5.5+

如果你使用Laravel 5.5+,则该软件包将自动发现。

Laravel <= 5.4

要使用Pwned Check验证规则,必须在启动你的Laravel应用程序时注册提供者。

找到你的config/app.php中的providers键并添加以下内容。

    'providers' => array(
        // ...
        Square1\Laravel\PwnedCheck\Providers\PwnedCheckServiceProvider::class,
    )

发布配置文件

php artisan vendor:publish --provider="Square1\Laravel\PwnedCheck\Providers\PwnedCheckServiceProvider" --tag=config

这将发布配置文件到pwned-check.php

配置选项

提供了一些配置选项来修改类的行为。

用法

    // RegisteredUserController.php
    public function store(Request $request)
    {
        $request->validate([
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:'.User::class],
            'password' => ['required', 'confirmed', Rules\Password::defaults(), 'pwned'],
        ]);

    // ...
    // Reject any password that has appeared in the list of compromised ones more than ten times
    'password' => ['required', 'confirmed', Rules\Password::defaults(), 'pwned:10'],

常见问题解答

如何设置显示的验证错误消息?

在应用运行的所有语言的lang/{LANG}/validation中,可以在custom数组中设置消息。

    'custom' => [
        'password' => [
            'pwned' => 'The :attribute has appeared in a known set of compromised passwords. Please choose a different password.',
        ],
    ],

如何确定密码是“已知的受损害”的?

Pwned Passwords服务是由Troy Hunt提供的,它是一个很好的资源,汇集了在已知数据泄露中发现的所有密码。该API允许我们检查密码是否出现在以前的数据泄露中,以及它出现的频率。频率允许我们决定在决定密码是否被视为受损害时有多严格。例如,abcd1234可能在数据泄露中出现了334,000次,而totallyuniqueandrandompass1234可能只出现了一次。根据你的用例,可能只应该将广泛受损害的密码列入黑名单。频率计数使我们能够这样做。

将密码发送到服务不是安全风险吗?

Pwned密码API允许进行范围查询。这涉及在应用程序中通过此库哈希密码,并将部分内容发送到API。API返回一组密码哈希(以及每个哈希的频率计数)。然后可以将这些与完整的密码哈希进行匹配,完整的密码哈希从未需要离开应用程序。Cloudflare与Troy密切合作设计了此API,并在这篇博客文章中详细介绍了此方法。

如果API服务器响应缓慢,我的应用程序会遇到问题吗?

典型的API响应速度非常快 - 值得阅读的这篇文章在这里。然而,在某个时刻,可能会有连接问题或与服务的其他性能问题。为了在这些情况下保护你的应用程序,你可以设置connection_timeoutremote_processing_timeout配置值。这些是在杀死curl连接之前等待的秒数和连接后的等待时间。如果服务调用因达到这些超时之一而被终止,将抛出Square1\Pwned\Exception\ConnectionFailedException

如果API超时,这和密码被破解的行为是否相同?

这可以通过 fail_on_timeout 配置值来控制。当它设置为 true 时,任何连接失败都将被视为验证失败。然而,你可能希望将此破解检查视为不太重要的一项,因此在远程服务失败的情况下,你更希望用户注册不受影响。将此值设置为 false 将意味着连接失败不会触发验证失败。

API结果是否被缓存?

API结果默认缓存一天。此值可以在 cache_default_ttl 配置变量中修改。

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件