Mật khẩu PHP MySQL

Trong chủ đề này, chúng ta sẽ tìm hiểu cách tạo Hệ thống đăng nhập PHP MySQL với sự trợ giúp của cơ sở dữ liệu PHP và MySQL. Có một vài bước được đưa ra để tạo một hệ thống đăng nhập với cơ sở dữ liệu MySQL

Trước khi tạo hệ thống đăng nhập trước, chúng ta cần biết về các điều kiện tiên quyết để tạo mô-đun đăng nhập

Yêu cầu

  • Chúng ta nên có kiến ​​thức về HTML, CSS, PHP và MySQL để tạo hệ thống đăng nhập
  • Trình soạn thảo văn bản - Để viết mã. Chúng ta có thể sử dụng bất kỳ trình soạn thảo văn bản nào như Notepad, Notepad++, Dreamweaver, v.v.
  • XAMPP - XAMPP là một phần mềm đa nền tảng, viết tắt của Cross-platform(X) Apache server (A), MySQL (M), PHP (P), Perl (P). XAMPP là một gói phần mềm hoàn chỉnh, vì vậy, chúng ta không cần phải cài đặt tất cả những thứ này một cách riêng biệt

Cài đặt môi trường

Bây giờ, chúng ta cần khởi động máy chủ web và tạo các tệp cho hệ thống đăng nhập. Có vài bước được đưa ra dưới đây để thiết lập môi trường

  • Mở Bảng điều khiển XAMPP
  • Khởi động máy chủ Apache bằng cách nhấp vào nút Bắt đầu
  • Khởi động MySQL bằng cách nhấp vào nút Bắt đầu
  • Tạo tất cả các tệp cần thiết để đăng nhập
  • Tạo bảng đăng nhập vào cơ sở dữ liệu bằng phpMyAdmin trong XAMPP

Bây giờ, chúng tôi sẽ tạo bốn tệp ở đây cho hệ thống đăng nhập

  1. mục lục. html - Tệp này được tạo cho giao diện GUI của trang đăng nhập và xác thực trường trống
  2. Phong cách. css - Tệp này được tạo để có giao diện hấp dẫn của biểu mẫu đăng nhập
  3. sự liên quan. php - Tệp kết nối chứa mã kết nối để kết nối cơ sở dữ liệu
  4. xác thực. php - Tệp này xác thực dữ liệu biểu mẫu với cơ sở dữ liệu do người dùng gửi

Lưu tất cả các tệp này vào thư mục htdocs bên trong thư mục cài đặt Xampp. Mô tả chi tiết và mã cho các tệp này được thảo luận bên dưới

mục lục. html

Đầu tiên, chúng ta cần thiết kế form đăng nhập để người dùng website tương tác với nó. Biểu mẫu đăng nhập này được tạo bằng html và cũng chứa xác thực trường trống, được viết bằng JavaScript. Mã cho chỉ mục. tập tin html được đưa ra dưới đây

Sau khi thực thi đoạn mã trên trên trình duyệt, trang đăng nhập sẽ xuất hiện như bên dưới nếu nó không chứa style. tập tin css

Mật khẩu PHP MySQL

Phong cách. css

Bây giờ, chúng ta sẽ tạo phong cách. css để cung cấp giao diện hấp dẫn hơn cho biểu mẫu đăng nhập. Mã CSS cho phong cách. tập tin css được đưa ra dưới đây

Sau khi bao gồm tệp CSS ở trên trong chỉ mục. html, biểu mẫu đăng nhập sẽ giống như -

Mật khẩu PHP MySQL

Ghi chú. Tất cả các tệp này nên được lưu trong cùng một thư mục để chúng tôi có thể dễ dàng truy cập chúng mà không bị gián đoạn

Cơ sở dữ liệu và tạo bảng

Bây giờ, bước tiếp theo là tạo cơ sở dữ liệu và bảng đăng nhập bên trong cơ sở dữ liệu

  • Truy cập phpMyAdmin trên trình duyệt bằng localhost/phpmyadmin/ và tạo bảng trong cơ sở dữ liệu. Ở đây chúng tôi sẽ tạo một cơ sở dữ liệu và bảng bằng cách sử dụng phpMyAdmin dựa trên GUI thay vì thực thi truy vấn
  • Bấm vào Mới và nhập tên cơ sở dữ liệu rồi bấm vào nút Tạo
Mật khẩu PHP MySQL
  • Bây giờ chúng ta sẽ tạo một bảng đăng nhập trong cơ sở dữ liệu. Tạo một bảng theo tên đăng nhập trong cơ sở dữ liệu mà bạn đã tạo trước đó
Mật khẩu PHP MySQL
  • Chỉ định cột Tên, Loại và Độ dài của chúng trong bảng mà chúng tôi sẽ lưu trữ tên người dùng và mật khẩu cho những người dùng khác nhau và lưu nó bằng cách nhấp vào nút lưu
Mật khẩu PHP MySQL
  • Nhấp vào phần chèn, từ đó chúng ta có thể chèn các bản ghi vào cột. Vì vậy, hãy nhập tên người dùng và mật khẩu vào đây và nhấp vào nút Bắt đầu để lưu hồ sơ
Mật khẩu PHP MySQL

sự liên quan. php

Bước tiếp theo là thực hiện kết nối biểu mẫu đăng nhập với cơ sở dữ liệu mà chúng ta đã tạo ở các bước trước. Chúng tôi sẽ tạo kết nối. php tập tin mà mã được đưa ra dưới đây

xác thực. php

Bây giờ, chúng tôi đã thiết lập cơ sở dữ liệu của mình, vì vậy chúng tôi có thể thực hiện xác thực người dùng. Tệp này xử lý dữ liệu biểu mẫu đăng nhập được gửi qua chỉ mục. tệp html. Nó xác thực dữ liệu được gửi qua biểu mẫu đăng nhập, nếu tên người dùng và mật khẩu khớp với cơ sở dữ liệu thì đăng nhập sẽ thành công nếu không đăng nhập sẽ thất bại

Đây là mã SQL để tạo bảng (bạn có thể sử dụng nó với PhpMyAdmin để tạo bảng trên môi trường phát triển của mình)


CREATE TABLE `accounts` (
  `account_id` int(10) UNSIGNED NOT NULL,
  `account_name` varchar(255) NOT NULL,
  `account_passwd` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `accounts`
  ADD PRIMARY KEY (`account_id`);
ALTER TABLE `accounts`
  MODIFY `account_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;

Quan trọng

Đảm bảo đặt cột mật khẩu dưới dạng  varchar .

(Một varchar là một cột văn bản có độ dài thay đổi. )

Lý do là kích thước của hàm băm từ password_hash() có thể thay đổi (sẽ biết thêm chi tiết về vấn đề này sau)

Nếu bạn cần trợ giúp về SQL, bạn có thể tìm thấy tất cả những gì bạn cần tại đây. Cách sử dụng PHP với MySQL

 

Bây giờ, bạn cần kết nối với cơ sở dữ liệu từ tập lệnh PHP của mình

Nếu bạn không biết cách, đây là tập lệnh kết nối PDO đơn giản mà bạn có thể sử dụng ngay

Chỉ cần chỉnh sửa các tham số kết nối để làm cho nó hoạt động với môi trường của riêng bạn


/* Host name of the MySQL server. */
$host = 'localhost';
/* MySQL account username. */
$user = 'myUser';
/* MySQL account password. */
$passwd = 'myPasswd';
/* The default schema you want to use. */
$schema = 'mySchema';
/* The PDO object. */
$pdo = NULL;
/* Connection string, or "data source name". */
$dsn = 'mysql:host=' . $host . ';dbname=' . $schema;
/* Connection inside a try/catch block. */
try
{  
   /* PDO object creation. */
   $pdo = new PDO($dsn, $user,  $passwd);
   
   /* Enable exceptions on errors. */
   $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e)
{
   /* If there is an error, an exception is thrown. */
   echo 'Database connection failed.';
   die();
}

 

Bây giờ bạn đã sẵn sàng để thêm người dùng mới vào bảng

Đây là một ví dụ đầy đủ (pdo. php là tập lệnh chứa đoạn kết nối cơ sở dữ liệu trước đó)


/* Include the database connection script. */
include 'pdo.php';
/* Username. */
$username = 'John';
/* Password. */
$password = 'my secret password';
/* Secure password hash. */
$hash = password_hash($password, PASSWORD_DEFAULT);
/* Insert query template. */
$query = 'INSERT INTO accounts (account_name, account_passwd) VALUES (:name, :passwd)';
/* Values array for PDO. */
$values = [':name' => $username, ':passwd' => $hash];
/* Execute the query. */
try
{
  $res = $pdo->prepare($query);
  $res->execute($values);
}
catch (PDOException $e)
{
  /* Query error. */
  echo 'Query error.';
  die();
}

Quan trọng. Trong ví dụ này, chúng tôi đã bỏ qua các bước xác thực, bao gồm

  • kiểm tra độ dài tên người dùng và mật khẩu
  • kiểm tra các ký tự không hợp lệ
  • kiểm tra xem tên người dùng đã tồn tại chưa
Và như thế. Việc xác thực nằm ngoài phạm vi của hướng dẫn này, nhưng hãy nhớ rằng bạn luôn cần xác thực các biến đầu vào của mình. Bạn có thể tham khảo Hướng dẫn đăng nhập và xác thực của tôi để biết thêm chi tiết và ví dụ. Nếu bạn muốn tìm hiểu thêm về bảo mật PHP, hãy xem khóa học Bảo mật PHP của tôi

 

Cách thay đổi mật khẩu của người dùng

Ví dụ tiếp theo cho thấy cách thay đổi mật khẩu của người dùng hiện có

Đầu tiên, lấy mật khẩu mới và tạo hàm băm của nó bằng password_hash()


/* New password. */
$password = $_POST['password'];
/* Remember to validate the password. */
/* Create the new password hash. */
$hash = password_hash($password, PASSWORD_DEFAULT);

Sau đó, cập nhật hàng trong bảng có cùng ID tài khoản của người dùng hiện tại và đặt hàm băm mới

Ghi chú. chúng tôi cho rằng biến $accountId chứa ID tài khoản


/* Include the database connection script. */
include 'pdo.php';
/* ID of the account to edit. */
$accountId = 1;
/* Update query template. */
$query = 'UPDATE accounts SET account_passwd = :passwd WHERE account_id = :id';
/* Values array for PDO. */
$values = [':passwd' => $hash, ':id' => $accountId];
/* Execute the query. */
try
{
  $res = $pdo->prepare($query);
  $res->execute($values);
}
catch (PDOException $e)
{
  /* Query error. */
  echo 'Query error.';
  die();
}

Cách sử dụng password_verify()

Để xác minh mật khẩu do người dùng từ xa cung cấp, bạn cần sử dụng hàm password_verify()

password_verify() nhận hai đối số

  • mật khẩu bạn cần xác minh, làm đối số đầu tiên
  • hàm băm từ password_hash() của mật khẩu ban đầu, làm đối số thứ hai

Nếu mật khẩu đúng, password_verify() trả về true

Đây là một ví dụ


/* Include the database connection script. */
include 'pdo.php';
/* Login status: false = not authenticated, true = authenticated. */
$login = FALSE;
/* Username from the login form. */
$username = $_POST['username'];
/* Password from the login form. */
$password = $_POST['password'];
/* Remember to validate $username and $password. */
/* Look for the username in the database. */
$query = 'SELECT * FROM accounts WHERE (account_name = :name)';
/* Values array for PDO. */
$values = [':name' => $username];
/* Execute the query */
try
{
  $res = $pdo->prepare($query);
  $res->execute($values);
}
catch (PDOException $e)
{
  /* Query error. */
  echo 'Query error.';
  die();
}
$row = $res->fetch(PDO::FETCH_ASSOC);
/* If there is a result, check if the password matches using password_verify(). */
if (is_array($row))
{
  if (password_verify($password, $row['account_passwd']))
  {
    /* The password is correct. */
    $login = TRUE;
  }
}

 

Quan trọng

Bạn không thể chỉ so sánh hai giá trị băm khác nhau để xem chúng có khớp không

Lý do là password_hash() tạo ra các giá trị băm muối

Băm muối bao gồm một chuỗi ngẫu nhiên, được đặt tên là muối muối, như một biện pháp bảo vệ chống lại các cuộc tấn công từ điển và bảng cầu vồng

Do đó, mọi hàm băm sẽ khác nhau ngay cả khi mật khẩu nguồn giống nhau

 

Hãy thử đoạn mã sau. Bạn sẽ thấy rằng hai giá trị băm khác nhau, ngay cả khi mật khẩu giống nhau


$password = 'my password';
echo password_hash($password, PASSWORD_DEFAULT);
echo '
'; echo password_hash($password, PASSWORD_DEFAULT);

 

Ghi chú

password_verify() chỉ hoạt động với các giá trị băm được tạo bởi password_hash()

Bạn không thể sử dụng nó để kiểm tra mật khẩu đối với hàm băm MD5 hoặc SHA

Cách tăng bảo mật băm

Băm được tạo bởi password_hash() rất an toàn

Nhưng bạn có thể làm cho nó mạnh hơn nữa bằng hai kỹ thuật đơn giản

  1. Tăng chi phí Bcrypt
  2. Tự động cập nhật thuật toán băm

 

chi phí Bcrypt

Bcrypt là thuật toán băm mặc định hiện tại được sử dụng bởi password_hash()

Thuật toán này nhận một tham số tùy chọn có tên là “chi phí”. Giá trị chi phí mặc định là 10

Bằng cách tăng chi phí, bạn có thể làm cho hàm băm khó tính toán hơn. Chi phí càng cao, thời gian cần thiết để tạo hàm băm càng lâu

Chi phí cao hơn khiến việc phá vỡ hàm băm trở nên khó khăn hơn. Tuy nhiên, nó cũng làm cho quá trình tạo băm và kiểm tra lâu hơn

Vì vậy, bạn muốn tìm một sự thỏa hiệp giữa bảo mật và tải máy chủ

Đây là cách bạn có thể đặt giá trị chi phí tùy chỉnh cho password_hash()


/* Password. */
$password = 'my secret password';
/* Set the "cost" parameter to 12. */
$options = ['cost' => 12];
/* Create the hash. */
$hash = password_hash($password, PASSWORD_DEFAULT, $options);

 

Nhưng bạn nên đặt giá trị chi phí nào?

Một thỏa hiệp tốt là giá trị chi phí cho phép máy chủ của bạn tạo hàm băm trong khoảng 100 mili giây

Đây là một thử nghiệm đơn giản để tìm giá trị này


/* User's password. */
$password = 'my secret password';
/* Secure password hash. */
$hash = password_hash($password, PASSWORD_DEFAULT);
0

Khi bạn đã tìm thấy chi phí của mình, bạn có thể sử dụng nó mỗi khi bạn thực thi password_hash() như trong ví dụ trước

 

Luôn cập nhật giá trị băm của bạn với password_needs_rehash()

Để hiểu bước này, hãy xem cách password_hash() hoạt động

password_hash() nhận ba đối số

  1. Mật khẩu bạn cần băm
  2. Thuật toán băm bạn muốn sử dụng
  3. Một loạt các tùy chọn để chuyển đến thuật toán băm

PHP hỗ trợ các thuật toán băm khác nhau, nhưng bạn thường muốn sử dụng thuật toán băm mặc định

Bạn có thể chọn thuật toán mặc định bằng cách sử dụng hằng số PASSWORD_DEFAULT, như bạn đã thấy trong các ví dụ trước

 

Kể từ tháng 6 năm 2020, thuật toán mặc định là Bcrypt

Tuy nhiên, PHP có thể thay đổi thuật toán mặc định trong tương lai, nếu một thuật toán tốt hơn và an toàn hơn được triển khai

Khi điều đó xảy ra, hằng PASSWORD_DEFAULT sẽ trỏ đến thuật toán mới. Vì vậy, tất cả các giá trị băm mới sẽ được tạo bằng thuật toán mới

Nhưng điều gì sẽ xảy ra nếu bạn muốn lấy tất cả các giá trị băm cũ của mình, được tạo bằng thuật toán trước đó và tự động tạo lại chúng bằng thuật toán mới?

 

Đây là lúc password_needs_rehash() phát huy tác dụng

Hàm này kiểm tra xem một hàm băm đã được tạo bằng một thuật toán và tham số nhất định chưa

Ví dụ


/* User's password. */
$password = 'my secret password';
/* Secure password hash. */
$hash = password_hash($password, PASSWORD_DEFAULT);
1

Nếu thuật toán băm mặc định hiện tại khác với thuật toán dùng để tạo hàm băm, password_needs_rehash() sẽ trả về true

password_needs_rehash() cũng kiểm tra xem thông số tùy chọn có khác không

Điều này rất hữu ích nếu bạn muốn cập nhật giá trị băm của mình sau khi thay đổi một tham số như chi phí Bcrypt

 

Ví dụ này cho thấy cách bạn có thể tự động kiểm tra hàm băm mật khẩu và cập nhật nó nếu cần, khi người dùng từ xa đăng nhập


/* User's password. */
$password = 'my secret password';
/* Secure password hash. */
$hash = password_hash($password, PASSWORD_DEFAULT);
2

Cách tự động chuyển đổi các giá trị băm cũ

Trong ví dụ này, bạn sẽ triển khai một tập lệnh đơn giản để tự động chuyển đổi các giá trị băm cũ, dựa trên MD5 thành các giá trị băm an toàn được tạo bằng password_hash()

Đây là cách nó hoạt động

  • Khi người dùng đăng nhập, trước tiên bạn kiểm tra mật khẩu của họ bằng password_verify()
  • Nếu đăng nhập không thành công, hãy kiểm tra xem hàm băm trong cơ sở dữ liệu có phải là hàm băm MD5 không nếu mật khẩu
  • Nếu đúng như vậy, thì bạn cập nhật hàm băm bằng hàm được tạo bởi password_hash()

 

Đây là kịch bản


/* User's password. */
$password = 'my secret password';
/* Secure password hash. */
$hash = password_hash($password, PASSWORD_DEFAULT);
3

Phần kết luận

Trong hướng dẫn này, bạn đã học cách sử dụng password_hash() và password_verify() để tạo các giá trị băm an toàn cho mật khẩu của mình (và tại sao bạn không nên sử dụng MD5)

Bạn cũng đã học cách làm cho mật khẩu của mình được băm an toàn hơn bằng cách đặt chi phí Bcrypt phù hợp và tự động băm lại mật khẩu của bạn khi cần

Làm cách nào tôi có thể tìm thấy mật khẩu MySQL?

Cách khôi phục mật khẩu MySQL của bạn .
Dừng quá trình máy chủ MySQL bằng lệnh Sudo service mysql stop
Khởi động máy chủ MySQL bằng lệnh sudo mysqld_safe –skip-grant-tables –skip-networking &
Kết nối với máy chủ MySQL với tư cách là người dùng root bằng lệnh mysql -u root

Mật khẩu mặc định của MySQL là gì?

Người dùng mặc định cho MySQL là root và theo mặc định, nó có không có mật khẩu . Nếu bạn đặt mật khẩu cho MySQL và bạn không thể nhớ lại, bạn luôn có thể đặt lại mật khẩu đó và chọn một mật khẩu khác.

Làm cách nào để mã hóa mật khẩu trong PHP MySQL?

PHP bao gồm thuật toán băm để mã hóa mật khẩu. Phần lớn nó được sử dụng trong các chức năng mã hóa mật khẩu là crypt(), password_hash() và md5() .

Làm cách nào để đặt lại mật khẩu trong PHP MySQL?

Hôm nay tôi sẽ giải thích cách đặt lại mật khẩu tài khoản của bạn bằng PHPMailer, PHP và MySQL, trong hướng dẫn này tôi sẽ thực hiện Quên mật khẩu khôi phục (Đặt lại) bằng PHP và MySQL. .
Tạo bảng mã thông báo tạm thời. .
Tạo kết nối cơ sở dữ liệu. .
Tạo một tệp chỉ mục (Gửi email).
Tạo tệp đặt lại mật khẩu. .
Tạo một tệp CSS