Tạo một hệ thống đăng ký người dùng đơn giản bằng PHP và MySQL. Hệ thống đăng ký người dùng đơn giản Đăng ký điều hành php

Trong bài viết này bạn sẽ học cách tạo biểu mẫu đăng ký và ủy quyền sử dụng HTML, JavaScript, PHP và MySql. Những biểu mẫu như vậy được sử dụng trên hầu hết mọi trang web, bất kể loại trang web đó. Chúng được tạo cho diễn đàn, cửa hàng trực tuyến, mạng xã hội (chẳng hạn như Facebook, Twitter, Odnoklassniki) và nhiều loại trang web khác.

Nếu bạn có một trang web trên máy tính cục bộ của mình thì tôi hy vọng rằng bạn đã có máy chủ cục bộ được cài đặt và đang chạy. Không có nó, sẽ không có gì hoạt động.

Tạo một bảng trong Cơ sở dữ liệu

Để thực hiện đăng ký người dùng, trước hết chúng ta cần có Cơ sở dữ liệu. Nếu bạn đã có rồi thì tuyệt vời, nếu không, bạn cần phải tạo nó. Trong bài viết, tôi giải thích chi tiết cách thực hiện việc này.

Và như vậy chúng ta đã có một Database (viết tắt là DB), bây giờ chúng ta cần tạo một bảng người dùng trong đó chúng tôi sẽ thêm người dùng đã đăng ký của mình.

Tôi cũng đã giải thích cách tạo bảng trong cơ sở dữ liệu trong bài viết. Trước khi tạo bảng, chúng ta cần xác định bảng sẽ chứa những trường nào. Các trường này sẽ tương ứng với các trường từ mẫu đăng ký.

Vì vậy, chúng tôi đã nghĩ, tưởng tượng những trường mà biểu mẫu của chúng tôi sẽ có và tạo một bảng người dùng với các trường này:

  • nhận dạng- Định danh. Cánh đồng nhận dạng Mỗi bảng trong cơ sở dữ liệu nên có nó.
  • tên đầu tiên- Để lưu tên.
  • họ- Để bảo toàn họ.
  • e-mail- Để lưu địa chỉ bưu điện. Chúng tôi sẽ sử dụng e-mail làm thông tin đăng nhập, vì vậy trường này phải là duy nhất, nghĩa là có chỉ mục ĐỘC ĐÁO.
  • email_status- Một trường để cho biết thư có được xác nhận hay không. Nếu thư được xác nhận thì nó sẽ có giá trị là 1, nếu không thì giá trị là 0.
  • mật khẩu- Để lưu mật khẩu.


Nếu bạn muốn mẫu đăng ký của mình có một số trường khác, bạn cũng có thể thêm chúng vào đây.

Thế là xong, bàn của chúng ta người dùng sẵn sàng. Hãy chuyển sang giai đoạn tiếp theo.

Kết nối cơ sở dữ liệu

Chúng ta đã tạo xong cơ sở dữ liệu, bây giờ chúng ta cần kết nối với nó. Chúng tôi sẽ kết nối bằng phần mở rộng PHP MySQLi.

Trong thư mục của trang web của chúng tôi, tạo một tệp có tên dbconnect.php và viết đoạn script sau vào đó:

Lỗi kết nối cơ sở dữ liệu. Mô tả lỗi: ".mysqli_connect_error()."

"; exit(); ) // Đặt mã hóa kết nối $mysqli->set_charset("utf8"); // Để thuận tiện, hãy thêm một biến ở đây sẽ chứa tên trang web của chúng tôi $address_site = "http://testsite .local" ; ?>

tập tin này dbconnect.php sẽ cần phải được kết nối với trình xử lý biểu mẫu.

Chú ý biến $address_site, ở đây tôi đã chỉ ra tên của trang web thử nghiệm mà tôi sẽ làm việc. Vui lòng cho biết tên trang web của bạn cho phù hợp.

Cấu trúc trang web

Bây giờ hãy xem cấu trúc HTML của trang web của chúng tôi.

Chúng ta sẽ di chuyển đầu trang và chân trang của trang web thành các file riêng biệt, tiêu đề.phpchân trang.php. Chúng tôi sẽ đưa chúng vào tất cả các trang. Cụ thể là trên trang chính (tập tin chỉ mục.php), đến trang có mẫu đăng ký (file form_register.php) và đến trang có mẫu ủy quyền (file form_auth.php).

Chặn bằng các liên kết của chúng tôi, sự đăng kýủy quyền, hãy thêm chúng vào tiêu đề trang web để chúng được hiển thị trên tất cả các trang. Một liên kết sẽ được nhập vào trang mẫu đăng ký(tài liệu form_register.php) và cái còn lại vào trang có hình thức uỷ quyền(tài liệu form_auth.php).

Nội dung của tệp header.php:

Tên trang web của chúng tôi

Kết quả là trang chính của chúng tôi trông như thế này:


Tất nhiên, trang web của bạn có thể có cấu trúc hoàn toàn khác, nhưng điều này hiện không quan trọng đối với chúng tôi. Điều chính là có các liên kết (nút) để đăng ký và ủy quyền.

Bây giờ chúng ta hãy chuyển sang mẫu đăng ký. Như bạn đã hiểu, chúng tôi có nó trong hồ sơ form_register.php.

Đi tới Cơ sở dữ liệu (trong phpMyAdmin), mở cấu trúc bảng người dùng và xem chúng tôi cần những lĩnh vực nào. Điều này có nghĩa là chúng ta cần các trường để nhập họ và tên, trường để nhập địa chỉ bưu chính (Email) và trường để nhập mật khẩu. Và vì mục đích bảo mật, chúng tôi sẽ thêm trường để nhập hình ảnh xác thực.

Trên máy chủ, do xử lý biểu mẫu đăng ký, nhiều lỗi khác nhau có thể xảy ra do người dùng không thể đăng ký. Vì vậy, để người dùng hiểu được nguyên nhân đăng ký không thành công, cần hiển thị thông báo về các lỗi này.

Trước khi hiển thị biểu mẫu, hãy thêm một khối để hiển thị thông báo lỗi từ phiên.

Và một điều nữa, nếu người dùng đã được ủy quyền và vì tò mò, anh ta sẽ truy cập trực tiếp vào trang đăng ký bằng cách viết vào thanh địa chỉ của trình duyệt site_address/form_register.php, thì trong trường hợp này, thay vì biểu mẫu đăng ký, chúng tôi sẽ hiển thị tiêu đề cho biết anh ấy đã đăng ký.

Nói chung, mã tập tin form_register.php chúng tôi đã nhận được điều này:

Bạn đã đăng kí

Trong trình duyệt, trang có mẫu đăng ký trông như thế này:


Bằng cách sử dụng thuộc tính bắt buộc, chúng tôi đã bắt buộc tất cả các trường.

Hãy chú ý đến mã mẫu đăng ký nơi hình ảnh xác thực được hiển thị:


Chúng tôi đã chỉ định đường dẫn đến tệp trong giá trị của thuộc tính src cho hình ảnh captcha.php, tạo ra hình ảnh xác thực này.

Hãy xem mã tập tin captcha.php:

Mã được nhận xét tốt, vì vậy tôi sẽ chỉ tập trung vào một điểm.

Bên trong một hàm hình ảnhTtfText(), đường dẫn đến phông chữ được chỉ định verdana.ttf. Vì vậy để captcha hoạt động chính xác chúng ta phải tạo thư mục phông chữ và đặt tập tin phông chữ ở đó verdana.ttf. Bạn có thể tìm và tải xuống từ Internet hoặc lấy từ kho lưu trữ cùng với tài liệu của bài viết này.

Chúng ta đã hoàn thành cấu trúc HTML, đã đến lúc tiếp tục.

Kiểm tra tính hợp lệ của email bằng jQuery

Bất kỳ biểu mẫu nào cũng cần kiểm tra tính hợp lệ của dữ liệu đã nhập, cả ở phía máy khách (sử dụng JavaScript, jQuery) và phía máy chủ.

Chúng ta phải đặc biệt chú ý đến trường Email. Điều rất quan trọng là địa chỉ bưu chính đã nhập là hợp lệ.

Đối với trường nhập này, chúng tôi đặt loại email (loại="email"), điều này sẽ cảnh báo chúng tôi một chút về các định dạng không chính xác. Nhưng điều này vẫn chưa đủ, vì thông qua trình kiểm tra mã mà trình duyệt cung cấp cho chúng ta, chúng ta có thể dễ dàng thay đổi giá trị thuộc tính kiểu Với e-mail TRÊN chữ, và thế là séc của chúng tôi sẽ không còn giá trị nữa.


Và trong trường hợp này, chúng ta phải thực hiện một cuộc kiểm tra đáng tin cậy hơn. Để làm điều này, chúng tôi sẽ sử dụng thư viện jQuery từ JavaScript.

Để kết nối thư viện jQuery, trong tệp tiêu đề.php giữa các thẻ , trước thẻ đóng , thêm dòng này:

Ngay sau dòng này chúng ta sẽ thêm mã xác thực email. Ở đây chúng tôi sẽ thêm một mã để kiểm tra độ dài của mật khẩu đã nhập. Độ dài của nó phải có ít nhất 6 ký tự.

Sử dụng tập lệnh này, chúng tôi kiểm tra tính hợp lệ của địa chỉ email đã nhập. Nếu người dùng nhập Email không chính xác, chúng tôi sẽ hiển thị thông báo lỗi về điều này và tắt nút gửi biểu mẫu. Nếu mọi thứ đều ổn thì chúng tôi sẽ loại bỏ lỗi và kích hoạt nút gửi biểu mẫu.

Và như vậy, chúng ta đã hoàn thành việc xác thực biểu mẫu ở phía máy khách. Bây giờ chúng ta có thể gửi nó đến máy chủ, nơi chúng ta cũng sẽ thực hiện một số kiểm tra và thêm dữ liệu vào cơ sở dữ liệu.

Đăng ký người dùng

Chúng tôi gửi biểu mẫu vào tệp để xử lý đăng ký.php, thông qua phương thức POST. Tên của tệp xử lý này được chỉ định trong giá trị thuộc tính hoạt động. Và phương thức gửi được chỉ định trong giá trị thuộc tính phương pháp.

Mở tập tin này đăng ký.php và điều đầu tiên chúng ta cần làm là viết hàm khởi chạy phiên và kết nối tệp chúng ta đã tạo trước đó dbconnect.php(Trong tệp này, chúng tôi đã tạo kết nối tới cơ sở dữ liệu). Ngoài ra chúng ta hãy khai báo ngay các ô thông báo lỗithành công_tin nhắn trong mảng phiên toàn cầu. TRONG thông báo lỗi chúng tôi sẽ ghi lại tất cả các thông báo lỗi xảy ra trong quá trình xử lý biểu mẫu và trong thành công_tin nhắn, chúng ta sẽ ghi lại những tin nhắn vui vẻ.

Trước khi tiếp tục, chúng ta phải kiểm tra biểu mẫu đã được gửi chưa?. Kẻ tấn công có thể nhìn vào giá trị thuộc tính hoạt động từ biểu mẫu và tìm ra tệp nào đang xử lý biểu mẫu này. Và anh ta có thể có ý tưởng truy cập trực tiếp vào tệp này bằng cách nhập địa chỉ sau vào thanh địa chỉ của trình duyệt: http://site_address/register.php

Vì vậy, chúng ta cần kiểm tra một ô trong mảng POST toàn cục có tên khớp với tên của nút "Đăng ký" trong biểu mẫu. Bằng cách này, chúng tôi kiểm tra xem nút "Đăng ký" có được nhấp hay không.

Nếu kẻ tấn công cố gắng truy cập trực tiếp vào tệp này, chúng sẽ nhận được thông báo lỗi. Hãy để tôi nhắc bạn rằng biến $address_site chứa tên của trang web và nó đã được khai báo trong tệp dbconnect.php.

Lỗi! Trang chính.

"); } ?>

Giá trị hình ảnh xác thực trong phiên đã được thêm vào khi nó được tạo, trong tệp captcha.php. Xin nhắc lại, tôi sẽ cho bạn xem lại đoạn mã này từ tệp captcha.php, trong đó giá trị hình ảnh xác thực được thêm vào phiên:

Bây giờ chúng ta hãy tiến hành xác minh chính nó. Trong tập tin đăng ký.php, bên trong khối if, nơi chúng tôi kiểm tra xem nút "Đăng ký" đã được nhấp hay đúng hơn là nơi nhận xét " // (1) Khoảng trống cho đoạn mã tiếp theo"chúng tôi viết:

// Kiểm tra hình ảnh xác thực đã nhận // Cắt bớt khoảng trắng ở đầu và cuối dòng $captcha = Trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //So sánh giá trị nhận được với giá trị từ phiên. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Nếu hình ảnh xác thực không chính xác, chúng tôi sẽ đưa người dùng trở lại trang đăng ký và ở đó chúng tôi sẽ hiển thị thông báo lỗi cho anh ấy rằng anh ấy đã nhập sai hình ảnh xác thực $error_message = "

Lỗi! Bạn nhập sai captcha

"; // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] = $error_message; // Đưa người dùng trở lại trang đăng ký header("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: " .$address_site ."/form_register.php"); //Dừng tập lệnh exit(); // (2) Đặt đoạn mã tiếp theo )else( //Nếu hình ảnh xác thực không được chuyển hoặc nó trống thì thoát( "

Lỗi! Không có mã xác minh, tức là mã captcha. Bạn có thể vào trang chính.

"); }

Tiếp theo, chúng ta cần xử lý dữ liệu nhận được từ mảng POST. Trước hết, chúng ta cần kiểm tra nội dung của mảng POST toàn cục, tức là xem có ô nào ở đó có tên tương ứng với tên của các trường đầu vào từ biểu mẫu của chúng ta hay không.

Nếu ô tồn tại thì chúng tôi sẽ cắt bớt khoảng trắng ở đầu và cuối dòng so với ô này, nếu không, chúng tôi sẽ chuyển hướng người dùng quay lại trang có biểu mẫu đăng ký.

Tiếp theo, sau khi đã cắt bớt các khoảng trắng, chúng ta thêm dòng vào biến và kiểm tra biến này xem có trống không; nếu nó không trống thì chúng ta tiếp tục, nếu không chúng ta sẽ chuyển hướng người dùng quay lại trang có biểu mẫu đăng ký.

Dán mã này vào vị trí đã chỉ định" // (2) Khoảng trống cho đoạn mã tiếp theo".

/* Kiểm tra xem có dữ liệu nào được gửi từ biểu mẫu trong mảng toàn cục $_POST hay không và gói dữ liệu đã gửi trong các biến thông thường.*/ if(isset($_POST["first_name"]))( //Cắt bớt khoảng trắng từ đầu và cuối chuỗi $first_name = Trim($_POST["first_name"]); //Kiểm tra biến xem có trống không if(!empty($first_name))( // Để đảm bảo an toàn, hãy chuyển đổi các ký tự đặc biệt thành thực thể HTML $first_name = htmlspecialchars($first_name, ENT_QUOTES) ; )else( // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] .= "

Nhập tên của bạn

Trường tên bị thiếu

"; // Đưa người dùng trở lại tiêu đề trang đăng ký("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_register.php"); //Dừng tập lệnh exit(); ) if( isset($_POST["last_name"]))( //Cắt bỏ khoảng trắng ở đầu và cuối dòng $last_name = Trim($_POST["last_name"]); if(!empty($last_name)) ( // Để bảo mật, hãy chuyển đổi các ký tự đặc biệt thành các thực thể HTML $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] .= "

Vui lòng nhập họ của bạn

"; // Đưa người dùng trở lại tiêu đề trang đăng ký("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_register.php"); //Dừng tập lệnh exit(); ) )else ( // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] .= "

Trường họ bị thiếu

"; // Đưa người dùng trở lại tiêu đề trang đăng ký("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_register.php"); //Dừng tập lệnh exit(); ) if( isset($_POST["email"]))( //Cắt bỏ khoảng trắng ở đầu và cuối dòng $email = Trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) Vị trí mã để kiểm tra định dạng của địa chỉ email và tính duy nhất của nó )else( // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] .= "

Nhập email của bạn

"; // Đưa người dùng trở lại tiêu đề trang đăng ký("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_register.php"); //Dừng tập lệnh exit(); ) )else ( // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] .= "

"; // Đưa người dùng trở lại tiêu đề trang đăng ký("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_register.php"); //Dừng tập lệnh exit(); ) if( isset($_POST["password"]))( //Cắt bớt khoảng trắng ở đầu và cuối chuỗi $password = Trim($_POST["password"]); if(!empty($password)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //Mã hóa mật khẩu $password = md5($password."top_secret");else( //Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] . = "

Nhập mật khẩu của bạn

"; // Đưa người dùng trở lại tiêu đề trang đăng ký("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_register.php"); //Dừng tập lệnh exit(); ) )else ( // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] .= "

"; // Đưa người dùng trở lại tiêu đề trang đăng ký("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_register.php"); //Dừng tập lệnh exit(); ) // (4) Nơi chứa mã để thêm người dùng vào cơ sở dữ liệu

Đặc biệt quan trọng là lĩnh vực e-mail. Chúng ta phải kiểm tra định dạng của địa chỉ bưu chính nhận được và tính duy nhất của nó trong cơ sở dữ liệu. Tức là có người dùng nào có cùng địa chỉ email đã đăng ký chưa?

Tại địa điểm được chỉ định" // (3) Mã vị trí để kiểm tra định dạng của địa chỉ bưu chính và tính duy nhất của nó"thêm đoạn mã sau:

//Kiểm tra định dạng của địa chỉ email nhận được bằng biểu thức chính quy $reg_email = "/^**@(+(*+)*\.)++/i"; //Nếu định dạng của địa chỉ email nhận được không khớp với biểu thức chính quy if(!preg_match($reg_email, $email))( // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] .= "

Bạn đã nhập sai email

"; // Đưa người dùng trở lại tiêu đề trang đăng ký("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_register.php"); //Dừng tập lệnh exit(); ) // Chúng tôi kiểm tra xem địa chỉ đó đã có trong cơ sở dữ liệu chưa $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email.""); chính xác là một hàng, có nghĩa là người dùng có địa chỉ email này đã được đăng ký if($result_query->num_rows == 1)( //Nếu kết quả thu được không sai if(($row = $result_query->fetch_assoc() ) != false) ( // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] .= "

Người dùng có địa chỉ email này đã được đăng ký

"; //Trả người dùng về tiêu đề trang đăng ký("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_register.php"); )else( // Lưu thông báo lỗi vào phiên $_SESSION["error_messages"] .= "

Lỗi truy vấn cơ sở dữ liệu

"; //Trả người dùng về tiêu đề trang đăng ký("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_register.php"); ) /* đóng lựa chọn */ $ result_query-> close(); //Dừng tập lệnh exit() ) /* đóng vùng chọn */ $result_query->close();

Và như vậy, chúng ta đã hoàn tất tất cả các bước kiểm tra, đã đến lúc thêm người dùng vào cơ sở dữ liệu. Tại địa điểm được chỉ định" // (4) Nơi chứa code thêm người dùng vào cơ sở dữ liệu"thêm đoạn mã sau:

//Truy vấn để thêm người dùng vào cơ sở dữ liệu $result_query_insert = $mysqli->query("INSERT INTO `users` (first_name, Last_name, email, pass) GIÁ TRỊ ("".$first_name."", "".$last_name ." ", "".$email.", "".$password."")"); if(!$result_query_insert)( // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] .= "

Lỗi khi yêu cầu thêm người dùng vào cơ sở dữ liệu

"; // Đưa người dùng trở lại tiêu đề trang đăng ký("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_register.php"); //Dừng tập lệnh exit(); )else( $_SESSION["success_messages"] = "

Đăng ký hoàn tất thành công!!!
Bây giờ bạn có thể đăng nhập bằng tên người dùng và mật khẩu của mình.

"; //Gửi người dùng đến trang ủy quyền header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_auth.php"); ) /* Hoàn thành yêu cầu */ $ result_query_insert-> close(); //Đóng kết nối tới cơ sở dữ liệu $mysqli->close();

Nếu xảy ra lỗi trong yêu cầu thêm người dùng vào cơ sở dữ liệu, chúng tôi sẽ thêm thông báo về lỗi này vào phiên và đưa người dùng trở lại trang đăng ký.

Mặt khác, nếu mọi thứ suôn sẻ, chúng tôi cũng thêm một thông báo vào phiên, nhưng lần này thú vị hơn, cụ thể là chúng tôi thông báo cho người dùng rằng đăng ký đã thành công. Và chúng tôi chuyển hướng nó đến trang có biểu mẫu ủy quyền.

Đoạn script kiểm tra định dạng địa chỉ email và độ dài mật khẩu có trong file tiêu đề.php, do đó, nó cũng sẽ áp dụng cho các trường từ biểu mẫu này.

Phiên cũng được bắt đầu trong tập tin tiêu đề.php, vì vậy trong tập tin form_auth.php Không cần phải bắt đầu một phiên vì chúng ta sẽ gặp lỗi.


Như tôi đã nói, tập lệnh kiểm tra định dạng địa chỉ email và độ dài mật khẩu cũng hoạt động ở đây. Do đó, nếu người dùng nhập sai địa chỉ email hoặc mật khẩu ngắn, ngay lập tức sẽ nhận được thông báo lỗi. Một nut bâm đi vào sẽ trở nên không hoạt động.

Sau khi sửa lỗi, nút đi vào bắt đầu hoạt động và người dùng sẽ có thể gửi biểu mẫu đến máy chủ, nơi nó sẽ được xử lý.

Ủy quyền người dùng

Để thuộc tính giá trị hoạt động handicap ủy quyền có một tập tin được chỉ định auth.php, điều này có nghĩa là biểu mẫu sẽ được xử lý trong tệp này.

Và vì vậy, hãy mở tập tin auth.php và viết mã để xử lý mẫu ủy quyền. Điều đầu tiên bạn cần làm là bắt đầu một phiên và kết nối tệp dbconnect.phpđể kết nối với cơ sở dữ liệu.

//Khai báo một ô để bổ sung các lỗi có thể xảy ra khi xử lý biểu mẫu. $_SESSION["error_messages"] = ""; //Khai báo một ô để thêm tin nhắn thành công $_SESSION["success_messages"] = "";

/* Kiểm tra xem biểu mẫu đã được gửi hay chưa, nghĩa là nút Đăng nhập có được nhấp hay không. Nếu có thì chúng tôi tiếp tục, nếu không, chúng tôi sẽ hiển thị thông báo lỗi cho người dùng cho biết rằng họ đã truy cập trực tiếp vào trang này. */ if(isset($_POST["btn_submit_auth"]) && !empty($_POST["btn_submit_auth"]))( //(1) Khoảng trống cho đoạn mã tiếp theo )else( exit("

Lỗi! Bạn đã truy cập trực tiếp vào trang này nên không có dữ liệu để xử lý. Bạn có thể vào trang chính.

"); }

//Kiểm tra captcha đã nhận if(isset($_POST["captcha"]))( //Cắt bớt khoảng trắng ở đầu và cuối dòng $captcha = Trim($_POST["captcha"]); if(! trống($captcha ))( //So sánh giá trị nhận được với giá trị từ phiên. if(($_SESSION["Rand"] != $captcha) && ($_SESSION["Rand"] != "")) ( // Nếu hình ảnh xác thực không chính xác thì chúng tôi sẽ đưa người dùng trở lại trang ủy quyền và ở đó chúng tôi sẽ hiển thị thông báo lỗi cho anh ta rằng anh ta đã nhập sai hình ảnh xác thực $error_message = ".

Lỗi! Bạn nhập sai captcha

"; // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] = $error_message; // Đưa người dùng trở lại trang ủy quyền header("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: " .$address_site ."/form_auth.php"); //Dừng tập lệnh exit()) )else( $error_message = "

Lỗi! Trường nhập hình ảnh xác thực không được để trống.

"; // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] = $error_message; // Đưa người dùng trở lại trang ủy quyền header("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: " .$address_site ."/form_auth.php"); //Dừng script exit() //(2) Nơi xử lý địa chỉ email //(3) Nơi xử lý mật khẩu //(4) Nơi soạn thảo một yêu cầu tới cơ sở dữ liệu)else ( //Nếu mã xác thực không được chuyển, hãy thoát ("

Lỗi! Không có mã xác minh, tức là mã captcha. Bạn có thể vào trang chính.

"); }

Nếu người dùng nhập đúng mã xác minh thì chúng tôi sẽ tiếp tục, nếu không, chúng tôi sẽ đưa anh ấy trở lại trang ủy quyền.

Kiểm tra địa chỉ gửi thư

//Cắt bớt khoảng trắng ở đầu và cuối dòng $email = Trim($_POST["email"]); if(isset($_POST["email"]))( if(!empty($email))( $email = htmlspecialchars($email, ENT_QUOTES); //Kiểm tra định dạng của địa chỉ email đã nhận bằng biểu thức chính quy $ reg_email = " /^**@(+(*+)*\.)++/i" //Nếu định dạng của địa chỉ email nhận được không khớp với biểu thức chính quy if(!preg_match($reg_email, $email ))( // Lưu vào thông báo lỗi phiên. $_SESSION["error_messages"] .= "

Bạn đã nhập sai email

"; //Trả người dùng về tiêu đề trang ủy quyền("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_auth.php"); //Dừng tập lệnh exit(); ) )else ( // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] .= "

Trường nhập địa chỉ bưu chính (email) không được để trống.

"; // Đưa người dùng trở lại tiêu đề trang đăng ký("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_register.php"); //Dừng tập lệnh exit(); ) )else ( // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] .= "

Trường nhập email bị thiếu

"; //Trả người dùng về tiêu đề trang ủy quyền("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_auth.php"); //Dừng tập lệnh exit(); ) // (3) Vùng xử lý mật khẩu

Nếu người dùng đã nhập địa chỉ email sai định dạng hoặc giá trị của trường địa chỉ email trống thì chúng tôi sẽ đưa anh ta trở lại trang ủy quyền nơi chúng tôi hiển thị thông báo về điều này.

Xác minh mật khẩu

Trường tiếp theo cần xử lý là trường mật khẩu. Đến nơi quy định" //(3) Nơi xử lý mật khẩu", chúng tôi viết:

If(isset($_POST["password"]))( //Cắt bớt khoảng trắng ở đầu và cuối chuỗi $password = Trim($_POST["password"]); if(!empty($password))( $password = htmlspecialchars($password, ENT_QUOTES); //Mã hóa mật khẩu $password = md5($password."top_secret");else( //Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] .= "

Nhập mật khẩu của bạn

"; //Đưa người dùng trở lại tiêu đề trang đăng ký("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_auth.php"); //Dừng tập lệnh exit(); ) )else ( // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] .= "

Trường mật khẩu bị thiếu

"; //Đưa người dùng trở lại tiêu đề trang đăng ký("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_auth.php"); //Dừng tập lệnh exit(); )

Ở đây chúng tôi sử dụng hàm md5() để mã hóa mật khẩu nhận được vì mật khẩu của chúng tôi ở dạng mã hóa trong cơ sở dữ liệu. Một từ bí mật bổ sung trong mã hóa, trong trường hợp của chúng tôi " top_secret" phải là tên đã được sử dụng khi đăng ký người dùng.

Bây giờ bạn cần thực hiện truy vấn tới cơ sở dữ liệu để chọn người dùng có địa chỉ email bằng địa chỉ email đã nhận và có mật khẩu bằng mật khẩu đã nhận.

// Truy vấn cơ sở dữ liệu dựa trên lựa chọn của người dùng. $result_query_select = $mysqli->query("CHỌN * TỪ `users` WHERE email = "".$email."" VÀ mật khẩu = "".$password."""); if(!$result_query_select)( // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] .= "

Lỗi truy vấn khi chọn người dùng từ cơ sở dữ liệu

"; //Đưa người dùng trở lại tiêu đề trang đăng ký("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_auth.php"); //Dừng tập lệnh exit(); )else( //Kiểm tra xem không có người dùng nào có dữ liệu đó trong cơ sở dữ liệu, sau đó hiển thị thông báo lỗi if($result_query_select->num_rows == 1)( // Nếu dữ liệu đã nhập khớp với dữ liệu từ cơ sở dữ liệu thì hãy lưu thông tin đăng nhập và mật khẩu cho mảng phiên $_SESSION["email"] = $email; $_SESSION["password"] = $password; // Đưa người dùng trở lại tiêu đề trang chính ("HTTP/1.1 301 Đã di chuyển vĩnh viễn" ); ."/index.php"); )else( // Lưu thông báo lỗi vào phiên. $_SESSION["error_messages"] .= "

Đăng nhập và/hoặc mật khẩu không chính xác

"; //Trả người dùng về tiêu đề trang ủy quyền("HTTP/1.1 301 Đã di chuyển vĩnh viễn"); header("Location: ".$address_site."/form_auth.php"); //Dừng tập lệnh exit(); ) )

Thoát khỏi trang web

Và điều cuối cùng chúng tôi thực hiện là thủ tục rời khỏi trang web. Hiện tại, trong tiêu đề chúng tôi hiển thị các liên kết đến trang ủy quyền và trang đăng ký.

Trong tiêu đề trang web (tệp tiêu đề.php), bằng cách sử dụng phiên này, chúng tôi sẽ kiểm tra xem người dùng đã được cấp phép chưa. Nếu không, thì chúng tôi sẽ hiển thị các liên kết đăng ký và ủy quyền, nếu không (nếu anh ấy được ủy quyền), thì thay vì các liên kết đăng ký và ủy quyền, chúng tôi sẽ hiển thị liên kết Lối ra.

Đoạn mã được sửa đổi từ tập tin tiêu đề.php:

Sự đăng ký

Lối ra

Khi bạn nhấp vào liên kết thoát khỏi trang web, chúng tôi sẽ được đưa đến một tập tin đăng xuất.php, trong đó chúng tôi chỉ cần hủy các ô có địa chỉ email và mật khẩu khỏi phiên. Sau đó, chúng tôi đưa người dùng quay lại trang đã nhấp vào liên kết lối ra.

Mã tập tin đăng xuất.php:

Đó là tất cả. Bây giờ bạn biết làm thế nào thực hiện và xử lý các biểu mẫu đăng ký, ủy quyền người dùng trên trang web của bạn. Những biểu mẫu này được tìm thấy trên hầu hết mọi trang web, vì vậy mọi lập trình viên nên biết cách tạo chúng.

Chúng tôi cũng đã học cách xác thực dữ liệu đầu vào, cả ở phía máy khách (trong trình duyệt, sử dụng JavaScript, jQuery) và phía máy chủ (sử dụng PHP). Chúng tôi cũng đã học được thực hiện thủ tục rời khỏi trang web.

Tất cả các tập lệnh đã được thử nghiệm và đang hoạt động. Bạn có thể tải xuống kho lưu trữ với các tệp của trang web nhỏ này từ liên kết này.

Trong tương lai tôi sẽ viết một bài báo mà tôi sẽ mô tả. Và tôi cũng định viết một bài để giải thích (không cần tải lại trang). Vì vậy, để được thông tin về việc phát hành các bài viết mới, bạn có thể đăng ký vào trang web của tôi.

Nếu bạn có bất kỳ câu hỏi nào, xin vui lòng liên hệ với tôi và nếu bạn nhận thấy bất kỳ sai sót nào trong bài viết, vui lòng cho tôi biết.

Giáo án (Phần 5):

  1. Tạo cấu trúc HTML cho biểu mẫu ủy quyền
  2. Chúng tôi xử lý dữ liệu nhận được
  3. Chúng tôi hiển thị lời chào của người dùng trong tiêu đề trang web

Bạn có thích bài viết này?

Hôm nay chúng ta sẽ xem xét việc khai thác một lỗ hổng nghiêm trọng trong 1 ngày trong CMS Joomla phổ biến, lỗ hổng này đã bùng nổ trên Internet vào cuối tháng 10. Chúng ta sẽ nói về lỗ hổng bằng những con số CVE-2016-8869, CVE-2016-8870CVE-2016-9081. Cả ba đều đến từ một đoạn mã đã nằm sâu trong khuôn khổ trong 5 năm dài, chờ đợi trong cánh, chỉ để sau đó thoát ra và mang theo sự hỗn loạn, các trang web bị tấn công và những giọt nước mắt của những người dùng vô tội của Joomla này. Chỉ những nhà phát triển dũng cảm và can đảm nhất, có đôi mắt đỏ hoe vì ánh sáng của màn hình và bàn phím dính đầy vụn bánh mì, mới có thể thách thức những linh hồn ma quỷ đang hoành hành và đặt đầu họ lên bàn thờ sửa lỗi.

CẢNH BÁO

Tất cả thông tin được cung cấp chỉ nhằm mục đích thông tin. Cả người biên tập và tác giả đều không chịu trách nhiệm về bất kỳ tác hại nào có thể xảy ra do tài liệu của bài viết này gây ra.

Nơi tất cả bắt đầu

Vào ngày 6 tháng 10 năm 2016, Demis Palma đã tạo một chủ đề trên Stack Exchange trong đó anh hỏi: tại sao trên thực tế, trong phiên bản Joomla 3.6 lại có hai phương thức đăng ký người dùng có cùng tên register()? Cái đầu tiên nằm trong bộ điều khiển UsersControllerRegistration và cái thứ hai nằm trong bộ điều khiển UsersControllerUser. Damis muốn biết liệu phương thức UsersControllerUser::register() đã được sử dụng ở đâu đó hay đó chỉ là một lỗi thời tiến hóa còn sót lại từ logic cũ. Mối quan tâm của anh ấy là ngay cả khi phương pháp này không được sử dụng bởi bất kỳ chế độ xem nào, nó vẫn có thể được gọi bằng một truy vấn được tạo ra. Tôi đã nhận được phản hồi từ một nhà phát triển có biệt danh itoctopus, người này đã xác nhận: vấn đề thực sự tồn tại. Và gửi một báo cáo cho các nhà phát triển Joomla.

Sau đó các sự kiện phát triển nhanh nhất. Vào ngày 18 tháng 10, các nhà phát triển Joomla đã chấp nhận báo cáo từ Damis, người vào thời điểm đó đã soạn thảo PoC cho phép người dùng đăng ký. Anh ấy đã đăng một ghi chú trên trang web của mình, nơi anh ấy nói một cách chung chung về vấn đề anh ấy tìm thấy và suy nghĩ của anh ấy về vấn đề này. Cùng ngày, một phiên bản mới của Joomla 3.6.3 được phát hành, phiên bản này vẫn chứa mã dễ bị tấn công.

Sau đó, Davide Tampellini đã khắc phục lỗi đến mức đăng ký không phải người dùng đơn giản mà là quản trị viên. Và vào ngày 21 tháng 10, một trường hợp mới đến với nhóm bảo mật Joomla. Nó đã nói về việc tăng đặc quyền. Cùng ngày, một thông báo xuất hiện trên trang web Joomla rằng vào thứ Ba, ngày 25 tháng 10, phiên bản tiếp theo với số sê-ri 3.6.3 sẽ được phát hành, sửa một lỗ hổng nghiêm trọng trong nhân hệ thống.

Ngày 25 tháng 10 Nhóm tấn công bảo mật Joomla tìm ra vấn đề mới nhất được tạo ra bởi đoạn mã được phát hiện bởi Damis. Sau đó, một cam kết ngày 21 tháng 10 với cái tên khó thấy Chuẩn bị 3.6.4 Bản phát hành ổn định được đẩy vào nhánh chính của kho lưu trữ Joomla chính thức, giúp sửa lỗi đáng tiếc.

Sau khi điều này xuất hiện, nhiều cá nhân quan tâm tham gia cộng đồng nhà phát triển - họ bắt đầu quảng bá lỗ hổng và chuẩn bị khai thác.

Vào ngày 27 tháng 10, nhà nghiên cứu Harry Roberts tải một bản khai thác có sẵn lên kho lưu trữ Xiphos Research, có thể tải tệp PHP lên máy chủ có CMS dễ bị tấn công.

Chi tiết

Chà, phần nền đã xong, hãy chuyển sang phần thú vị nhất - phân tích lỗ hổng. Tôi đã cài đặt Joomla 3.6.3 làm phiên bản thử nghiệm nên tất cả số dòng sẽ phù hợp với phiên bản này. Và tất cả các đường dẫn đến tệp mà bạn thấy bên dưới sẽ được chỉ ra tương ứng với thư mục gốc của CMS đã cài đặt.

Nhờ phát hiện của Damis Palma, chúng tôi biết rằng có hai phương pháp thực hiện đăng ký người dùng trong hệ thống. Cái đầu tiên được CMS sử dụng và nằm trong tệp /comComponents/com_users/controllers/registration.php:108. Cái thứ hai (cái mà chúng ta sẽ cần gọi) nằm trong /comComponents/com_users/controllers/user.php:293. Chúng ta hãy xem xét kỹ hơn về nó.

286: /** 287: * Phương thức đăng ký người dùng. 288: * 289: * @return boolean 290: * 291: * @since 1.6 292: */ 293: public function register() 294: ( 295: JSession::checkToken("post") hoặc jexit(JText::_ ("JINVALID_TOKEN")); ... 300: // Lấy dữ liệu biểu mẫu 301: $data = $this->input->post->get("user", array(), "array"); . 315: $return = $model->validate($form, $data); 316: 317: // Kiểm tra lỗi 318: if ($return === false) 319: ( ... 345: / / Hoàn tất đăng ký 346: $return = $model->register($data);

Ở đây tôi chỉ để lại những dòng thú vị. Phiên bản đầy đủ của phương pháp dễ bị tấn công có thể được xem trong kho Joomla.

Hãy cùng tìm hiểu điều gì xảy ra trong quá trình đăng ký người dùng thông thường: dữ liệu nào được gửi và cách xử lý dữ liệu đó. Nếu đăng ký người dùng được bật trong cài đặt, bạn có thể tìm thấy biểu mẫu tại http://joomla.local/index.php/comComponent/users/?view=registration.


Yêu cầu đăng ký người dùng hợp pháp trông giống như ảnh chụp màn hình sau.


Thành phần com_users chịu trách nhiệm làm việc với người dùng. Hãy chú ý đến tham số nhiệm vụ trong yêu cầu. Nó có định dạng $controller.$method . Hãy nhìn vào cấu trúc tập tin.

Tên các script trong thư mục bộ điều khiển tương ứng với tên của bộ điều khiển được gọi. Vì yêu cầu của chúng tôi hiện chứa $controller = "registration" , nên tệp sẽ được gọi đăng ký.php và phương thức register() của nó.

Chú ý, câu hỏi: làm cách nào để chuyển quá trình xử lý đăng ký sang vị trí dễ bị tổn thương trong mã? Có lẽ bạn đã đoán được rồi. Tên của phương thức thực và dễ bị tấn công là giống nhau (đăng ký), vì vậy chúng ta chỉ cần thay đổi tên của bộ điều khiển được gọi. Bộ điều khiển dễ bị tấn công của chúng tôi nằm ở đâu? Đúng vậy, trong tập tin người dùng.php. Hóa ra $controller="user" . Đặt mọi thứ lại với nhau chúng ta có được task = user.register . Bây giờ yêu cầu đăng ký được xử lý theo phương pháp chúng tôi cần.


Điều thứ hai chúng ta cần làm là gửi dữ liệu theo đúng định dạng. Mọi thứ đều đơn giản ở đây. Đăng ký hợp pháp() mong đợi từ chúng tôi một mảng có tên jform , trong đó chúng tôi chuyển dữ liệu đăng ký - tên, thông tin đăng nhập, mật khẩu, email (xem ảnh chụp màn hình với yêu cầu).

  • /comComponents/com_users/controllers/registration.php: 124: // Lấy dữ liệu người dùng. 125: $requestData = $this->input->post->get("jform", array(), "array");

Khách hàng của chúng tôi lấy dữ liệu này từ một mảng có tên user.

  • /comComponents/com_users/controllers/user.php: 301: // Lấy dữ liệu biểu mẫu. 302: $data = $this->input->post->get("user", array(), "array");

Do đó, chúng tôi thay đổi tên của tất cả các tham số trong yêu cầu từ jfrom thành user .

Bước thứ ba của chúng tôi là tìm mã thông báo CSRF hợp lệ, vì nếu không có mã thông báo này thì sẽ không có đăng ký.

  • /comComponents/com_users/controllers/user.php: 296: JSession::checkToken("post") hoặc jexit(JText::_("JINVALID_TOKEN"));

Nó trông giống như hàm băm MD5 và bạn có thể lấy nó, ví dụ: từ biểu mẫu ủy quyền trên trang web /index.php/comComponent/users/?view=login.


Bây giờ bạn có thể tạo người dùng bằng phương pháp mong muốn. Nếu mọi thứ đều ổn thì xin chúc mừng - bạn vừa khai thác được một lỗ hổng CVE-2016-8870"Thiếu kiểm tra quyền đăng ký người dùng mới."

Đây là giao diện của phương thức register() “đang hoạt động” từ bộ điều khiển UsersControllerRegistration:

  • /comComponents/com_users/controllers/registration.php: 113: // Nếu đăng ký bị tắt - Chuyển hướng đến trang đăng nhập. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view= login", false)); 117: 118: trả về sai; 119: )

Và vì vậy dễ bị tổn thương:

  • /thành phần/com_users/bộ điều khiển/user.php:

Vâng, không thể nào.

Để hiểu vấn đề thứ hai, nghiêm trọng hơn nhiều, hãy gửi yêu cầu mà chúng tôi đã tạo và xem cách nó được thực thi trong các phần khác nhau của mã. Đây là phần chịu trách nhiệm xác thực dữ liệu do người dùng gửi trong phương thức worker:

Việc tiếp tục chỉ dành cho thành viên

Tùy chọn 1. Tham gia cộng đồng “trang web” để đọc tất cả tài liệu trên trang web

Tư cách thành viên trong cộng đồng trong khoảng thời gian quy định sẽ cung cấp cho bạn quyền truy cập vào TẤT CẢ tài liệu của Hacker, tăng chiết khấu tích lũy cá nhân của bạn và cho phép bạn tích lũy xếp hạng Điểm Xakep chuyên nghiệp!

Việc tạo một trang web dựa trên thành viên ban đầu có vẻ như là một nhiệm vụ khó khăn. Nếu bạn từng muốn tự mình làm việc này nhưng rồi lại từ bỏ khi bắt đầu nghĩ về cách kết hợp nó bằng kỹ năng PHP của mình, thì bài viết này là dành cho bạn. Chúng tôi sẽ hướng dẫn bạn mọi khía cạnh của việc tạo trang web dựa trên tư cách thành viên, với khu vực thành viên an toàn được bảo vệ bằng mật khẩu.

Toàn bộ quá trình bao gồm hai phần lớn: đăng ký người dùng và xác thực người dùng. Trong phần đầu tiên, chúng ta sẽ đề cập đến việc tạo biểu mẫu đăng ký và lưu trữ dữ liệu trong cơ sở dữ liệu MySQL. Trong phần thứ hai, chúng ta sẽ tạo biểu mẫu đăng nhập và sử dụng nó để cho phép người dùng truy cập vào khu vực bảo mật.

Tải mã xuống

Bạn có thể tải xuống toàn bộ mã nguồn cho hệ thống đăng ký/đăng nhập từ liên kết bên dưới:

Cấu hình & Tải lên
Tệp ReadMe chứa hướng dẫn chi tiết.

Mở nguồn\include\membersite_config.php tập tin trong trình soạn thảo văn bản và cập nhật cấu hình. (Đăng nhập cơ sở dữ liệu, tên trang web của bạn, địa chỉ email của bạn, v.v.).

Tải lên toàn bộ nội dung thư mục. Kiểm tra register.php bằng cách gửi biểu mẫu.

Mẫu đăng ký

Để tạo tài khoản người dùng, chúng tôi cần thu thập một lượng thông tin tối thiểu từ người dùng. Chúng tôi cần tên của anh ấy, địa chỉ email cũng như tên người dùng và mật khẩu mong muốn của anh ấy. Tất nhiên, chúng tôi có thể yêu cầu thêm thông tin vào thời điểm này, nhưng một biểu mẫu dài luôn gây khó chịu. Vì vậy, hãy giới hạn bản thân trong những lĩnh vực đó.

Đây là mẫu đăng ký:

Đăng ký

Vì vậy, chúng tôi có các trường văn bản cho tên, email và mật khẩu. Lưu ý rằng chúng tôi đang sử dụng để có khả năng sử dụng tốt hơn.

Xác thực mẫu

Tại thời điểm này, bạn nên đặt một số mã xác thực biểu mẫu để đảm bảo rằng chúng tôi có tất cả dữ liệu cần thiết để tạo tài khoản người dùng. Chúng ta cần kiểm tra xem tên, email và mật khẩu đã được điền chưa và email có ở định dạng phù hợp hay không.

Xử lý việc gửi biểu mẫu

Bây giờ chúng ta phải xử lý dữ liệu biểu mẫu được gửi.

Đây là trình tự (xem tệp fg_membersite.php trong nguồn đã tải xuống):

hàm RegisterUser() ( if(!isset($_POST["submit"])) ( return false; ) $formvars = array(); if(!$this->ValidateRegistrationSubmission()) ( return false; ) $this- >CollectRegistrationSubmission($formvars); if(!$this->SaveToDatabase($formvars)) ( return false; ) if(!$this->SendUserConfirmationEmail($formvars)) ( return false; ) $this->SendAdminIntimationEmail($ formvars); trả về true;

Đầu tiên, chúng tôi xác nhận việc gửi biểu mẫu. Sau đó, chúng tôi thu thập và 'làm sạch' dữ liệu gửi biểu mẫu (luôn thực hiện việc này trước khi gửi email, lưu vào cơ sở dữ liệu, v.v.). Việc gửi biểu mẫu sau đó được lưu vào bảng cơ sở dữ liệu. Chúng tôi gửi email đến người dùng yêu cầu xác nhận. Sau đó chúng tôi thân mật với quản trị viên mà người dùng đã đăng ký.

Lưu dữ liệu vào cơ sở dữ liệu

Bây giờ chúng tôi đã thu thập tất cả dữ liệu, chúng tôi cần lưu trữ nó vào cơ sở dữ liệu.
Đây là cách chúng tôi lưu biểu mẫu gửi vào cơ sở dữ liệu.

function SaveToDatabase(&$formvars) ( if(!$this->DBLogin()) ( $this->HandleError("Database login failed!"); return false; ) if(!$this->Ensuretable()) ( return false; ) if(!$this->IsFieldUnique($formvars,"email")) ( $this->HandleError("Email này đã được đăng ký"); return false; ) if(!$this->IsFieldUnique( $formvars,"username")) ( $this->HandleError("Tên người dùng này đã được sử dụng. Vui lòng thử tên người dùng khác"); return false; ) if(!$this->InsertIntoDB($formvars)) ( $this- >HandleError("Chèn vào cơ sở dữ liệu không thành công!"); trả về sai;

Lưu ý rằng bạn đã định cấu hình chi tiết đăng nhập Cơ sở dữ liệu trong tệp membersite_config.php. Hầu hết các trường hợp, bạn có thể sử dụng “localhost” làm máy chủ cơ sở dữ liệu.
Sau khi đăng nhập, chúng ta kiểm tra xem bảng đã tồn tại chưa. (Nếu không, script sẽ tạo bảng theo yêu cầu).
Sau đó, chúng tôi đảm bảo rằng tên người dùng và email là duy nhất. Nếu nó không phải là duy nhất, chúng tôi sẽ trả lại lỗi cho người dùng.

Cấu trúc bảng cơ sở dữ liệu

Đây là cấu trúc bảng. Hàm CreateTable() trong tệp fg_membersite.php sẽ tạo bảng. Đây là mã:

function CreateTable() ( $qry = "Tạo bảng $this->tablename (". "id_user INT NOT NULL AUTO_INCREMENT ," "name VARCHAR(128) NOT NULL ," "email VARCHAR(64) NOT NULL ," " "phone_number VARCHAR(16) NOT NULL ," "tên người dùng VARCHAR(16) NOT NULL ," "mật khẩu VARCHAR(32) NOT NULL ," "xác nhận mã VARCHAR(32) ," " ")"; this->connection)) ( $this->HandleDBError("Lỗi tạo bảng \nquery was\n $qry"); return false; ) return true )

Trường id_user sẽ chứa id duy nhất của người dùng và cũng là khóa chính của bảng. Lưu ý rằng chúng tôi cho phép 32 ký tự cho trường mật khẩu. Chúng tôi làm điều này vì, như một biện pháp bảo mật bổ sung, chúng tôi sẽ lưu trữ mật khẩu trong cơ sở dữ liệu được mã hóa bằng MD5. Xin lưu ý rằng vì MD5 là phương thức mã hóa một chiều nên chúng tôi sẽ không thể khôi phục mật khẩu trong trường hợp người dùng quên.

Chèn đăng ký vào bảng

Đây là đoạn mã chúng tôi sử dụng để chèn dữ liệu vào cơ sở dữ liệu. Chúng tôi sẽ có tất cả dữ liệu có sẵn trong mảng $formvars.

hàm InsertIntoDB(&$formvars) ( $confirmcode = $this->MakeConfirmationMd5($formvars["email"]); $insert_query = "insert to ".$this->tablename."(name, email, username, pass, confirmcode) giá trị ("" . $this->SanitizeForSQL($formvars["name"]) . "", "" . $this->SanitizeForSQL($formvars["email"]) . "", "" . $ this->SanitizeForSQL($formvars["username"]) . "", "" .md5($formvars["password"]) "", "" $confirmcode . $insert_query ,$this->connection)) ( $this->HandleDBError("Lỗi khi chèn dữ liệu vào bảng\nquery:$insert_query"); return false; ) return true )

Lưu ý rằng chúng tôi sử dụng hàm PHP md5() để mã hóa mật khẩu trước khi chèn nó vào cơ sở dữ liệu.
Ngoài ra, chúng tôi tạo mã xác nhận duy nhất từ ​​địa chỉ email của người dùng.

Gửi e-mail

Bây giờ chúng tôi đã đăng ký trong cơ sở dữ liệu của mình, chúng tôi sẽ gửi email xác nhận cho người dùng. Người dùng phải nhấp vào liên kết trong email xác nhận để hoàn tất quá trình đăng ký.

hàm SendUserConfirmationEmail(&$formvars) ( $mailer = new PHPMailer(); $mailer->CharSet = "utf-8"; $mailer->AddAddress($formvars["email"],$formvars["name"]) ; $mailer->Subject = "Đăng ký của bạn với ".$this->sitename; $mailer->From = $this->GetFromAddress(); $confirmcode = urlencode($this->MakeConfirmationMd5($formvars["email" ])); $confirm_url = $this->GetAbsoluteURLFolder()."/confirmreg.php?code=".$confirmcode; $mailer->Body ="Xin chào ".$formvars["name"]."\r\ n\r\n". "Cảm ơn bạn đã đăng ký với ".$this->sitename."\r\n". "Vui lòng nhấp vào liên kết bên dưới để xác nhận đăng ký của bạn.\r\n." "$confirm_url\r \n". "\r\n". "Trân trọng,\r\n". "Quản trị trang web\r\n". $this->sitename; if(!$mailer->Send()) ( $this-> HandleError("Không gửi được email xác nhận đăng ký."); return false; return true)

Cập nhật

Ngày 9 tháng 1 năm 2012
Tính năng Đặt lại mật khẩu/Đổi mật khẩu được thêm vào
Mã hiện được chia sẻ tại GitHub.

Chào mừng trở lạiTên người dùngFullName(); ?>!

Giấy phép


Mã được chia sẻ theo giấy phép LGPL. Bạn có thể tự do sử dụng nó trên các trang web thương mại hoặc phi thương mại.

Không có bài viết liên quan.

Bình luận về cụm từ này được đóng.

Để chia khách truy cập trang web thành các nhóm nhất định, một hệ thống nhỏ phải được cài đặt trên trang web đăng ký bằng php. Bằng cách này, bạn có điều kiện chia khách truy cập thành hai nhóm gồm những khách truy cập ngẫu nhiên đơn giản và thành một nhóm người dùng có đặc quyền hơn mà bạn cung cấp nhiều thông tin có giá trị hơn.

Trong hầu hết các trường hợp, hệ thống đăng ký đơn giản hơn được sử dụng, được viết bằng php trong một tệp đăng ký.php.

Vì vậy, chúng ta đã lạc đề một chút và bây giờ chúng ta sẽ xem xét kỹ hơn về tệp đăng ký.

Đăng ký tập tin.php

Để đảm bảo rằng việc này không chiếm nhiều thời gian của bạn, chúng tôi sẽ tạo một hệ thống thu thập người dùng, chấp nhận thông tin liên hệ tối thiểu từ họ. Trong trường hợp này, chúng tôi sẽ nhập mọi thứ vào cơ sở dữ liệu mysql. Để có tốc độ cao nhất của cơ sở dữ liệu, chúng tôi sẽ tạo bảng người dùng ở định dạng MyISAM và mã hóa utf-8.

Ghi chú! Tất cả các tập lệnh phải luôn được viết bằng cùng một bảng mã. Tất cả các tệp trang web và cơ sở dữ liệu MySql phải ở cùng một mã hóa. Các bảng mã phổ biến nhất là UTF-8 và Windows-1251.

Tại sao bạn cần viết mọi thứ trong một bảng mã, chúng ta sẽ nói sau. Hiện tại, hãy coi thông tin này làm quy tắc nghiêm ngặt để tạo tập lệnh, nếu không bạn sẽ gặp vấn đề với tập lệnh trong tương lai. Tất nhiên là không sao, nhưng bạn sẽ mất rất nhiều thời gian để tìm kiếm lỗi trong tập lệnh.

Bản thân kịch bản sẽ hoạt động như thế nào?

Chúng tôi muốn đơn giản hóa mọi thứ và nhận được kết quả nhanh chóng. Vì vậy, chúng tôi sẽ chỉ nhận thông tin đăng nhập, email và mật khẩu từ người dùng. Và để bảo vệ khỏi robot spam, chúng tôi sẽ cài đặt một hình ảnh xác thực nhỏ. Nếu không, một cậu bé nào đó đến từ London sẽ viết một trình phân tích cú pháp robot nhỏ sẽ lấp đầy toàn bộ cơ sở dữ liệu với những người dùng giả mạo trong vài phút, và sẽ vui mừng trước thiên tài và sự vô tội của cậu ấy.

Đây là kịch bản chính nó. Mọi thứ được ghi lại trong một tập tin đăng ký.php:

! `; // dấu chấm hỏi màu đỏ $sha=$sh."scripts/pro/"; //đường dẫn đến thư mục chính $bg=` bgcolor="#E1FFEB"`; // màu nền của các hàng?> Ví dụ về tập lệnh đăng ký register.php style.css" />

Trong trường hợp này, tập lệnh đề cập đến chính nó. Và nó là một biểu mẫu và bộ xử lý dữ liệu được nhập vào biểu mẫu. Xin lưu ý rằng tệp được nén dưới dạng kho lưu trữ zip và chứa tệp cấu hình config.php, kết xuất cơ sở dữ liệu người dùng, tệp chứa các hàm phụ trợ.php, tệp kiểu style.css và chính tệp register.php. Ngoài ra còn có một số tệp chịu trách nhiệm vận hành và tạo ký hiệu hình ảnh xác thực.

Quá trình tạo ra một hệ thống đăng ký có khá nhiều công việc. Bạn cần viết mã để kiểm tra kỹ tính hợp lệ của địa chỉ email, gửi email xác nhận, cung cấp khả năng khôi phục mật khẩu, lưu trữ mật khẩu ở nơi an toàn, xác thực biểu mẫu nhập, v.v. Ngay cả khi bạn làm tất cả những điều này, người dùng sẽ miễn cưỡng đăng ký, vì ngay cả việc đăng ký tối thiểu nhất cũng yêu cầu hoạt động của họ.

Trong hướng dẫn hôm nay, chúng ta sẽ phát triển một hệ thống đăng ký đơn giản không yêu cầu bất kỳ mật khẩu nào! Kết quả sẽ là một hệ thống có thể dễ dàng sửa đổi hoặc tích hợp vào trang web PHP hiện có. Nếu bạn quan tâm, hãy tiếp tục đọc.

PHP

Bây giờ chúng ta đã sẵn sàng để bắt đầu với mã PHP. Chức năng chính của hệ thống đăng ký được cung cấp bởi lớp Người dùng, bạn có thể xem bên dưới. Lớp này sử dụng (), là một thư viện cơ sở dữ liệu tối giản. Lớp Người dùng chịu trách nhiệm truy cập cơ sở dữ liệu, tạo mã thông báo đăng nhập và xác thực chúng. Nó cung cấp cho chúng ta một giao diện đơn giản có thể dễ dàng tích hợp vào hệ thống đăng ký của các trang web dựa trên PHP của bạn.

Người dùng.class.php

// Phiên bản ORM riêng
$orm riêng tư;

/**
* Tìm người dùng theo chuỗi mã thông báo. Chỉ những mã thông báo hợp lệ mới được đưa vào
* Sự xem xét. Mã thông báo có hiệu lực trong 10 phút sau khi được tạo.
* @param string $token Mã thông báo cần tìm kiếm
* Người dùng @return
*/

Hàm tĩnh công khai findByToken($token)(

// tìm nó trong cơ sở dữ liệu và đảm bảo dấu thời gian là chính xác


->where("mã thông báo", $mã thông báo)
->where_raw("token_validity > NOW()")
->find_one();

Nếu(!$kết quả)(
trả về sai;
}

Trả về người dùng mới($result);
}

/**
* Đăng nhập hoặc đăng ký người dùng.
* Người dùng @return
*/

Hàm tĩnh công khai loginOrRegister($email)(

// Nếu người dùng đó đã tồn tại, hãy trả lại nó

If(User::exists($email))(
trả lại Người dùng mới($email);
}

// Ngược lại thì tạo và trả về

Return User::create($email);
}

/**
* Tạo người dùng mới và lưu nó vào cơ sở dữ liệu
* @param string $email Địa chỉ email của người dùng
* Người dùng @return
*/

Hàm tĩnh riêng tạo ($ email)(

// Viết một người dùng mới vào cơ sở dữ liệu và trả về nó

$result = ORM::for_table("reg_users")->create();
$kết quả->email = $email;
$kết quả->lưu();

Trả về người dùng mới($result);
}

/**
* Kiểm tra xem người dùng đó có tồn tại trong cơ sở dữ liệu hay không và trả về một boolean.
* @param string $email Địa chỉ email của người dùng
* @return boolean
*/

Hàm tĩnh công khai tồn tại($email)(

// Người dùng có tồn tại trong cơ sở dữ liệu không?
$result = ORM::for_table("reg_users")
->where("email", $email)
->đếm();

Trả về kết quả $ == 1;
}

/**
* Tạo đối tượng người dùng mới
* @param $param Phiên bản ORM, id, email hoặc null
* Người dùng @return
*/

Hàm công khai __construct($param = null)(

If($param instanceof ORM)(

// Một instance ORM đã được truyền
$this->orm = $param;
}
nếu không thì if(is_string($param))(

// Một email đã được chuyển
$cái này->
->where("email", $param)
->find_one();
}
khác(

Nếu(is_numeric($param))(
// Id người dùng được truyền dưới dạng tham số
$id = $param;
}
khác nếu(isset($_SESSION["loginid"]))(

// Không có ID người dùng nào được chuyển, hãy xem phiên
$id = $_SESSION["loginid"];
}

$this->orm = ORM::for_table("reg_users")
->where("id", $id)
->find_one();
}

/**
* Tạo mã thông báo đăng nhập SHA1 mới, ghi nó vào cơ sở dữ liệu và trả về.
* @return chuỗi
*/

Hàm công khai generateToken())(
// tạo mã thông báo cho người dùng đã đăng nhập. Lưu nó vào cơ sở dữ liệu.

$token = sha1($this->email.time().rand(0, 1000000));

// Lưu mã thông báo vào cơ sở dữ liệu,
// và đánh dấu nó là hợp lệ chỉ trong 10 phút tiếp theo

$this->orm->set("mã thông báo", $token);
$this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")");
$this->orm->save();

Trả lại mã thông báo $;
}

/**
* Đăng nhập người dùng này
* @return void
*/

Đăng nhập chức năng công cộng()

// Đánh dấu người dùng là đã đăng nhập
$_SESSION["loginid"] = $this->orm->id;

// Cập nhật trường db Last_login
$this->orm->set_expr("last_login", "NOW()");
$this->orm->save();
}

/**
* Phá hủy phiên và đăng xuất người dùng.
* @return void
*/

Đăng xuất chức năng công cộng()
$_SESSION = mảng();
unset($_SESSION);
}

/**
* Kiểm tra xem người dùng đã đăng nhập chưa.
* @return boolean
*/

Hàm công khai postedIn())(
return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id;
}

/**
* Kiểm tra xem người dùng có phải là quản trị viên không
* @return boolean
*/

Hàm công khai làAdmin())(
return $this->rank() == "quản trị viên";
}

/**
* Tìm loại người dùng. Nó có thể là quản trị viên hoặc thường xuyên.
* @return chuỗi
*/

Xếp hạng chức năng công cộng()
if($this->orm->rank == 1)(
trả về "quản trị viên";
}

Trả về "thường xuyên";
}

/**
* Phương pháp kỳ diệu để truy cập các phần tử riêng tư
* Ví dụ $orm là thuộc tính của đối tượng người dùng
* @param string $key Tên thuộc tính được truy cập
* @return hỗn hợp
*/

Hàm công khai __get($key)(
if(isset($this->orm->$key))(
trả về $this->orm->$key;
}

Trả về giá trị rỗng;
}
}
Mã thông báo được tạo bằng thuật toán và được lưu trữ trong cơ sở dữ liệu. Chúng tôi sử dụng MySQL để đặt cột token_validity thành 10 phút. Khi xác thực mã thông báo, chúng tôi thông báo với công cụ rằng chúng tôi cần mã thông báo, trường token_validity vẫn chưa hết hạn. Bằng cách này, chúng tôi giới hạn thời gian mà mã thông báo sẽ hợp lệ.

Lưu ý rằng chúng ta sử dụng phương thức ma thuật __get() ở cuối tài liệu để truy cập các thuộc tính của đối tượng người dùng. Điều này cho phép chúng ta truy cập dữ liệu được lưu trữ trong cơ sở dữ liệu dưới dạng các thuộc tính: $user->email, $user->token. Ví dụ: hãy xem cách chúng ta có thể sử dụng lớp này trong đoạn mã sau:


Một tệp khác lưu trữ chức năng cần thiết là hàm.php. Ở đó, chúng tôi có một số hàm trợ giúp cho phép chúng tôi giữ phần còn lại của mã gọn gàng hơn.

Hàm.php

Hàm send_email($from, $to, $subject, $message)(

// Hàm trợ giúp gửi email

$headers = "Phiên bản MIME: 1.0" . "\r\n";
$headers .= "Loại nội dung: text/plain; charset=utf-8" . "\r\n";
$headers .= "Từ: ".$from . "\r\n";

Trả lại thư($to, $subject, $message, $headers);
}

hàm get_page_url())(

// Tìm URL của file PHP

$url = "http".(empty($_SERVER["HTTPS"])?"":""")."://".$_SERVER["SERVER_NAME"];

If(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")(
$url.= $_SERVER["REQUEST_URI"];
}
khác(
$url.= $_SERVER["PATH_INFO"];
}

Trả về url $;
}

hàm rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)(

// Số lần đăng nhập trong giờ qua theo địa chỉ IP này

$count_hour = ORM::for_table("reg_login_attempt")
->
->where_raw("ts > SUBTIME(NOW(),"1:00")")
->đếm();

// Số lần đăng nhập trong 10 phút qua bằng địa chỉ IP này

$count_10_min = ORM::for_table("reg_login_attempt")
->where("ip", sprintf("%u", ip2long($ip)))
->where_raw("ts > SUBTIME(NOW(),"0:10")")
->đếm();

Nếu($count_hour > $limit_hour || $count_10_min > $limit_10_min)(
ném ngoại lệ mới ("Quá nhiều lần đăng nhập!");
}
}

hàm rate_limit_tick($ip, $email)(

// Tạo một bản ghi mới trong bảng thử đăng nhập

$login_attempt = ORM::for_table("reg_login_attempt")->create();

$login_attempt->email = $email;
$login_attempt->ip = sprintf("%u", ip2long($ip));

$login_attempt->save();
}

chức năng chuyển hướng($url)(
header("Vị trí: $url");
lối ra;
}
Các hàm rate_limit và rate_limit_tick cho phép chúng tôi giới hạn số lần thử ủy quyền trong một khoảng thời gian nhất định. Các nỗ lực ủy quyền được ghi lại trong cơ sở dữ liệu reg_login_attempt. Các hàm này được kích hoạt khi biểu mẫu đăng nhập được xác minh, như bạn có thể thấy trong đoạn mã sau.

Mã bên dưới được lấy từ index.php và chịu trách nhiệm xác thực biểu mẫu đăng nhập. Nó trả về một phản hồi JSON được điều khiển bởi mã jQuery mà chúng ta đã thấy trong assets/js/script.js.

chỉ mục.php

If(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))(

// Xuất ra tiêu đề JSON

Header("Loại nội dung: ứng dụng/json");

// Địa chỉ email có hợp lệ không?

If(!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))(
ném ngoại lệ mới ("Vui lòng nhập email hợp lệ.");
}

// Điều này sẽ đưa ra một ngoại lệ nếu người đó ở trên
// giới hạn số lần đăng nhập được phép (xem hàm.php để biết thêm):
rate_limit($_SERVER["REMOTE_ADDR"]);

// Ghi lại lần đăng nhập này
rate_limit_tick($_SERVER["REMOTE_ADDR"], $_POST["email"]);

// Gửi tin nhắn cho người dùng

$tin nhắn = "";
$email = $_POST["email"];
$subject = "Liên kết đăng nhập của bạn";

If(!User::exists($email))(
$subject = "Cảm ơn bạn đã đăng ký!";
$message = "Cảm ơn bạn đã đăng ký tại trang web của chúng tôi!\n\n";
}

// Cố gắng đăng nhập hoặc đăng ký người đó
$user = Người dùng::loginOrRegister($_POST["email"]);

$message.= "Bạn có thể đăng nhập từ URL này:\n";
$message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

$message.= "Liên kết sẽ tự động hết hạn sau 10 phút.";

$result = send_email($fromEmail, $_POST["email"], $subject, $message);

Nếu(!$kết quả)(
ném ngoại lệ mới("Đã xảy ra lỗi khi gửi email của bạn. Vui lòng thử lại.");
}

Die(json_encode(mảng(
"message" => "Cảm ơn bạn! Chúng tôi đã gửi một liên kết tới hộp thư đến của bạn. Hãy kiểm tra cả thư mục thư rác của bạn."
)));
}
}
bắt(Ngoại lệ $e)(

Die(json_encode(mảng(
"lỗi"=>1,
"tin nhắn" => $e->getMessage()
)));
}
Sau khi ủy quyền hoặc đăng ký thành công, đoạn mã trên sẽ gửi email đến người có liên kết để ủy quyền. Mã thông báo được cung cấp dưới dạng biến $_GET "tkn" do URL được tạo.

chỉ mục.php

If(isset($_GET["tkn"]))(

// Đây có phải là mã thông báo đăng nhập hợp lệ không?
$user = Người dùng::findByToken($_GET["tkn"]);

// Đúng! Đăng nhập người dùng và chuyển hướng đến trang được bảo vệ.

$người dùng->đăng nhập();
redirect("protected.php");
}

// Mã không hợp lệ. Chuyển hướng trở lại hình thức đăng nhập.
redirect("index.php");
}
Chạy $user->login() sẽ tạo các biến phiên cần thiết, cho phép người dùng duy trì trạng thái đăng nhập trong những lần đăng nhập tiếp theo.

Việc đăng xuất khỏi hệ thống được thực hiện theo cách tương tự:

Index.php

If(isset($_GET["đăng xuất"]))(

$user = Người dùng mới();

If($user->loggedIn())(
$người dùng->đăng xuất();
}

Chuyển hướng("index.php");
}
Ở cuối mã, chúng tôi chuyển hướng người dùng đến index.php một lần nữa, do đó tham số ?logout=1 trong URL bị loại bỏ.

Tệp index.php của chúng tôi cũng sẽ cần được bảo vệ - chúng tôi không muốn người dùng đã đăng nhập nhìn thấy biểu mẫu. Để làm điều này, chúng tôi sử dụng phương thức $user->loggedIn():

Index.php

$user = Người dùng mới();

if($user->loggedIn())(
redirect("protected.php");
}
Cuối cùng, hãy xem cách bạn có thể bảo vệ trang web của mình và làm cho trang đó chỉ có thể truy cập được sau khi được ủy quyền:

được bảo vệ.php

// Để bảo vệ bất kỳ trang php nào trên trang web của bạn, hãy bao gồm main.php
// và tạo một đối tượng User mới. Nó đơn giản mà!

require_once "includes/main.php";

$user = Người dùng mới();

if(!$user->loggedIn())(
redirect("index.php");
}
Sau bước kiểm tra này, bạn có thể chắc chắn rằng người dùng đã đăng nhập thành công. Bạn cũng sẽ có quyền truy cập vào dữ liệu được lưu trữ trong cơ sở dữ liệu dưới dạng thuộc tính của đối tượng $user. Để hiển thị email của người dùng và thứ hạng của họ, hãy sử dụng mã sau:

Echo "Email của bạn: ".$user->email;
echo "Thứ hạng của bạn: ".$user->rank();
Ở đây Rank() là phương thức vì cột thứ hạng trong cơ sở dữ liệu thường chứa các số (0 cho người dùng thông thường và 1 cho quản trị viên) và chúng ta cần chuyển đổi tất cả những thứ này thành tên thứ hạng, được triển khai bằng phương thức này. Để chuyển đổi người dùng chuẩn thành quản trị viên, chỉ cần chỉnh sửa mục nhập của người dùng trong phpmyadmin (hoặc bất kỳ chương trình cơ sở dữ liệu nào khác). Với tư cách là quản trị viên, người dùng sẽ không được cấp bất kỳ khả năng đặc biệt nào. Bản thân bạn có quyền lựa chọn những quyền nào để cấp cho quản trị viên.

Sẵn sàng!

Với điều này, hệ thống đăng ký đơn giản của chúng tôi đã sẵn sàng! Bạn có thể sử dụng nó trên trang PHP hiện có hoặc hiện đại hóa nó để phù hợp với yêu cầu của riêng bạn.