Quay lại
Custom password rule object trong Laravel

Mật khẩu là dữ liệu nhạy cảm và chúng cần được xử lý hết sức cẩn thận. Một cách để đảm bảo rằng mật khẩu của người dùng vẫn an toàn là yêu cầu họ nhập mật khẩu mạnh ngay từ đầu.

Nếu bạn đang sử dụng Laravel, bạn có thể thực hiện việc này bằng cách thiết lập validation rules cho các trường của mình, bao gồm cả mật khẩu. Tuy nhiên, hiện tại có những quy tắc rất hạn chế mà bạn có thể áp dụng trên một lĩnh vực nhạy cảm như mật khẩu.

Cách cũ

Ví dụ: Nếu bạn muốn áp dụng quy tắc xác thực mật khẩu để đảm bảo quy tắc đó là bắt buộc (required), phải là một chuỗi (string), có trường xác nhận mật khẩu bổ sung (password confirmation field) và phải có độ dài ít nhất 8 ký tự, bạn có thể thêm quy tắc xác thực như sau:

$request->validate([
    'password' => 'required|string|confirmed|min:8',
    'password_confirmation' => ['required'],
]);

Như bạn có thể thấy, những quy tắc này rõ ràng là không đủ để khiến người dùng nhập mật khẩu mạnh. Cần có nhiều quy tắc phù hợp hơn với tiêu chuẩn hiện đại và làm cho việc giả mạo mật khẩu trở nên kém hiệu quả hơn.

Và đó chính xác là điều mà chương trình PR dành cho Laravel 8.x này cố gắng giải quyết. Nhập đối tượng quy tắc mật khẩu tùy chỉnh.

Custom password rule object

Nuno Maduro, thành viên nổi bật của hệ sinh thái Laravel, đã thêm một đối tượng quy tắc mật khẩu tùy chỉnh mới (Illuminate\Validation\Rules\Password) thông qua PR này, giúp dễ dàng thêm quy tắc mật khẩu vào các trường mật khẩu. Và trên hết, nó còn đưa ra một số quy tắc mật khẩu hữu ích.

Vì vậy, nếu bạn muốn điều chỉnh ví dụ trước để sử dụng đối tượng quy tắc mật khẩu mới, bạn có thể làm như sau:

use Illuminate\Validation\Rules\Password;

$request->validate([
    'password' => ['required', 'string', 'confirme', Password::min(8)],
    'password_confirmation' => ['required'],
]);

Như bạn có thể biết, có phương pháp này được gọi là min, có thể đảm bảo mật khẩu phải có tối thiểu 8 ký tự.

Có thêm một vài quy tắc mà bạn có thể áp dụng trên các trường mật khẩu như vậy.

use Illuminate\Validation\Rules\Password;

$request->validate([
    // Makes the password require at least one uppercase and one lowercase letter.
    'password' =>  ['required', 'confirmed', Password::min(8)->mixedCase()],

    // Makes the password require at least one letter.
    'password' =>  ['required', 'confirmed', Password::min(8)->letters()],

    // Makes the password require at least one number.
    'password' =>  ['required', 'confirmed', Password::min(8)->numbers()],

    // Makes the password require at least one symbol.
    'password' =>  ['required', 'confirmed', Password::min(8)->symbols()],

    // Ensures the password has not been compromised in data leaks.
    'password' =>  ['required', 'confirmed', Password::min(8)->uncompromised()],
]);

Chain them all together

Tất nhiên bạn có thể xâu chuỗi tất cả chúng lại với nhau như sau:

use Illuminate\Validation\Rules\Password;

$request->validate([
    'name' => 'required|string|max:255',
    'email' => 'required|string|email|max:255|unique:users',
    'password' => ['required', 'confirmed', Password::min(8)
            ->mixedCase()
            ->letters()
            ->numbers()
            ->symbols()
            ->uncompromised(),
    ],
]);

Xác minh xem mật khẩu đã nhập có bị xâm phạm do rò rỉ dữ liệu hay không?

Có rất nhiều quy tắc thú vị mà đối tượng này đang giới thiệu nhưng quy tắc thực sự khiến tôi chú ý là quy tắc mật khẩu xác thực xem mật khẩu đã nhập có bị lộ trong một vụ rò rỉ dữ liệu trước đây hay không.

Đó là sử dụng uncompromised() method, trước tiên, hãy kiểm tra cách bạn có thể thêm quy tắc mật khẩu này vào trường mật khẩu của mình.

use Illuminate\Validation\Rules\Password;

$request->validate([
    // Ensures the password has not been compromised in data leaks.
    'password' =>  ['required', 'confirmed', Password::uncompromised()],
]);

Như bạn có thể biết, bạn cần sử dụng phương thức uncompromised() của đối tượng Illuminate\Validation\Rules\Password để xác định xem mật khẩu đã nhập có bị rò rỉ trong một trong các vụ rò rỉ dữ liệu trước đây hay không.

Nếu mật khẩu bị rò rỉ ở đâu đó, nó sẽ cung cấp cho bạn thông báo xác thực sau:

Tự hỏi làm sao nó có thể check được như vậy ?

Tôi đã cố gắng tìm hiểu tính năng này để biết nó hoạt động như thế nào và phát hiện ra rằng nó đang được sử dụng API nâng cao trong Illuminate\Validation\NotPwnedVerifier để kiểm tra xem mật khẩu trước đó có bị rò rỉ hay không.

/**
 * Search by the given hash prefix and returns all occurrences of leaked passwords.
 *
 * @param  string  $hashPrefix
 * @return \Illuminate\Support\Collection
 */
protected function search($hashPrefix)
{
    try {
        $response = $this->factory->withHeaders([
            'Add-Padding' => true,
        ])->get(
            'https://api.pwnedpasswords.com/range/'.$hashPrefix
        );
    } catch (Exception $e) {
        report($e);
    }

    $body = (isset($response) && $response->successful())
        ? $response->body()
        : '';

    return Str::of($body)->trim()->explode("\n")->filter(function ($line) {
        return Str::contains($line, ':');
    });
}
 

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday