Tạo ủy quyền php mysql phức tạp. Xây dựng một hệ thống đăng ký cực kỳ đơn giản bằng PHP và MySQL

Xin chào! Bây giờ chúng tôi sẽ cố gắng triển khai đăng ký đơn giản nhất trên trang web bằng PHP + MySQL. Để thực hiện việc này, Apache phải được cài đặt trên máy tính của bạn. Nguyên tắc làm việc của tập lệnh của chúng tôi được hiển thị dưới đây.

1. Hãy bắt đầu bằng cách tạo bảng người dùng trong cơ sở dữ liệu. Nó sẽ chứa dữ liệu người dùng (đăng nhập và mật khẩu). Hãy truy cập phpmyadmin (nếu bạn đang tạo cơ sở dữ liệu trên PC của mình http://localhost/phpmyadmin/). Tạo một bảng người dùng, nó sẽ có 3 trường.

Tôi tạo nó trong cơ sở dữ liệu mysql, bạn có thể tạo nó trong cơ sở dữ liệu khác. Tiếp theo, thiết lập các giá trị như trong hình:

2. Cần có kết nối với bảng này. Hãy tạo một tập tin bd.php. Nội dung của nó:

$db = mysql_connect("máy chủ MySQL của bạn","đăng nhập vào máy chủ này","mật khẩu cho máy chủ này");
mysql_select_db ("tên cơ sở dữ liệu mà chúng tôi đang kết nối", $db);
?>

Trong trường hợp của tôi nó trông như thế này:

$db = mysql_connect("localhost","user","1234");
mysql_select_db("mysql",$db);
?>

Cứu bd.php.
Tuyệt vời! Chúng tôi có một bảng trong cơ sở dữ liệu và kết nối với nó. Bây giờ bạn có thể bắt đầu tạo một trang mà người dùng sẽ để lại dữ liệu của họ.

3. Tạo một file reg.php có nội dung (tất cả các bình luận bên trong):



Sự đăng ký


Sự đăng ký
















4. Tạo một tập tin, sẽ nhập dữ liệu vào cơ sở dữ liệu và lưu người dùng. save_user.php(bình luận bên trong):



{
}
// nếu thông tin đăng nhập và mật khẩu được nhập thì chúng tôi sẽ xử lý chúng để thẻ và tập lệnh không hoạt động, bạn không bao giờ biết mọi người có thể nhập gì


// loại bỏ khoảng trắng thừa
$đăng nhập = cắt($đăng nhập);
$password = cắt($password);
// kết nối với cơ sở dữ liệu
// kiểm tra sự tồn tại của người dùng có cùng thông tin đăng nhập
$result = mysql_query("CHỌN id TỪ người dùng Ở ĐÂU login="$login"",$db);
if (!empty($myrow["id"])) (
exit("Xin lỗi, thông tin đăng nhập bạn nhập đã được đăng ký. Vui lòng nhập thông tin đăng nhập khác.");
}
// nếu không đúng thì lưu dữ liệu
$result2 = mysql_query("XÁC NHẬN VÀO người dùng (đăng nhập,mật khẩu) GIÁ TRỊ("$login","$password")");
// Kiểm tra xem có lỗi không
nếu ($result2=="TRUE")
{
echo "Bạn đã đăng ký thành công! Bây giờ bạn có thể vào trang web. Trang chủ";
}
khác(
echo "Lỗi! Bạn chưa đăng ký.";
}
?>

5. Bây giờ người dùng của chúng tôi có thể đăng ký! Tiếp theo, bạn cần tạo một “cánh cửa” cho những người dùng đã đăng ký để vào trang web. chỉ mục.php(bình luận bên trong):

// toàn bộ quy trình hoạt động theo phiên. Đó là nơi dữ liệu của người dùng được lưu trữ khi anh ta ở trên trang web. Điều rất quan trọng là khởi chạy chúng ngay từ đầu trang!!!
session_start();
?>


Trang chủ


Trang chủ











Đăng ký



// Kiểm tra xem biến đăng nhập và id người dùng có trống không
if (trống($_SESSION["đăng nhập"]) hoặc trống($_SESSION["id"]))
{
// Nếu trống thì chúng ta không hiển thị link
echo "Bạn đang đăng nhập với tư cách là khách
Liên kết này chỉ có sẵn cho người dùng đã đăng ký";
}
khác
{

Trong tập tin chỉ mục.php Chúng tôi sẽ hiển thị một liên kết chỉ mở cho người dùng đã đăng ký. Đây là toàn bộ mục đích của tập lệnh - để hạn chế quyền truy cập vào bất kỳ dữ liệu nào.

6. Vẫn còn một tệp xác minh thông tin đăng nhập và mật khẩu đã nhập. testreg.php (bình luận bên trong):

session_start();// toàn bộ quy trình hoạt động trên các phiên. Đó là nơi dữ liệu của người dùng được lưu trữ khi anh ta ở trên trang web. Điều rất quan trọng là khởi chạy chúng ngay từ đầu trang!!!
if (isset($_POST["login"])) ( $login = $_POST["login"]; if ($login == "") ( unset($login);) ) //nhập thông tin đăng nhập được nhập bởi người dùng vào biến $login, nếu nó trống thì hủy biến
if (isset($_POST["password"])) ( $password=$_POST["password"]; if ($password =="") ( unset($password);) )
//đặt mật khẩu do người dùng nhập vào biến $password, nếu trống thì hủy biến
if (empty($login) hoặc trống($password)) // nếu người dùng chưa nhập thông tin đăng nhập hoặc mật khẩu thì chúng tôi sẽ báo lỗi và dừng tập lệnh
{
exit("Bạn chưa nhập đầy đủ thông tin, quay lại điền đầy đủ thông tin!");
}
// nếu thông tin đăng nhập và mật khẩu được nhập thì chúng tôi sẽ xử lý chúng để thẻ và tập lệnh không hoạt động, bạn không bao giờ biết mọi người có thể nhập gì
$đăng nhập = Striplashes($đăng nhập);
$login = htmlspecialchars($đăng nhập);
$password = Striplashes($password);
$password = htmlspecialchars($password);
// loại bỏ khoảng trắng thừa
$đăng nhập = cắt($đăng nhập);
$password = cắt($password);
// kết nối với cơ sở dữ liệu
include("bd.php");// file bd.php phải nằm trong cùng thư mục với tất cả các file khác, nếu không thì chỉ cần thay đổi đường dẫn

$result = mysql_query("SELECT * FROM user WHERE login="$login"",$db); // lấy từ cơ sở dữ liệu tất cả dữ liệu về người dùng với thông tin đăng nhập đã nhập
$myrow = mysql_fetch_array($result);
if (trống($myrow["mật khẩu"]))
{
// nếu người dùng có thông tin đăng nhập đã nhập không tồn tại
}
khác(
// nếu tồn tại thì kiểm tra mật khẩu
if ($myrow["password"]==$password) (
// nếu mật khẩu trùng khớp thì chúng tôi sẽ khởi chạy một phiên cho người dùng! Bạn có thể chúc mừng anh ấy, anh ấy đã vào được!
$_SESSION["đăng nhập"]=$myrow["đăng nhập"];
$_SESSION["id"]=$myrow["id"];//dữ liệu này được sử dụng rất thường xuyên, vì vậy người dùng đã đăng nhập sẽ “mang theo bên mình”
echo "Bạn đã vào trang thành công! Trang chủ";
}
khác(
// nếu mật khẩu không khớp

Thoát ("Xin lỗi, thông tin đăng nhập hoặc mật khẩu bạn nhập không chính xác.");
}
}
?>

Được rồi, mọi chuyện đã kết thúc rồi! Bài học có thể nhàm chán nhưng rất hữu ích. Ở đây chỉ có ý tưởng đăng ký được hiển thị, sau đó bạn có thể cải thiện nó: thêm bảo vệ, thiết kế, trường dữ liệu, tải hình đại diện, đăng xuất khỏi tài khoản (để thực hiện việc này, chỉ cần hủy các biến khỏi phiên bằng chức năng bỏ đặt) và như thế. Chúc may mắn!

Tôi đã kiểm tra mọi thứ, nó hoạt động bình thường!

Từ tác giả: Sớm hay muộn, mọi nhà phát triển web đều phải đối mặt với nhiệm vụ hạn chế quyền truy cập vào một trang/trang hoặc thư mục nhất định. Đây có thể chỉ đơn giản là một trang bí mật trên trang web, phần quản trị của trang web hoặc bất kỳ phần nào khác mà chúng tôi muốn hạn chế quyền truy cập và chỉ cung cấp mật khẩu. Tất nhiên, để làm được điều này, bạn có thể sử dụng các công cụ máy chủ. Tôi nghĩ rằng bất kỳ dịch vụ lưu trữ hiện đại nào cũng có chức năng bảo vệ bằng mật khẩu cho một thư mục, nơi bạn có thể tạo người dùng, gán mật khẩu cho người đó và sau khi bảo vệ thư mục bằng mật khẩu, quyền truy cập vào thư mục đã đóng sẽ chỉ được cung cấp sau khi nhập đúng đăng nhập và mật khẩu. Nhưng đôi khi bạn muốn tự mình viết một cái gì đó, một cái gì đó nhanh chóng, đơn giản nhưng đồng thời đáng tin cậy...

Trong bài học này, chúng ta sẽ cố gắng viết hệ thống ủy quyền đơn giản của riêng mình. Chúng tôi sẽ có một trang bí mật - giả sử đó sẽ là trang quản trị viên mà chúng tôi sẽ chỉ cấp quyền truy cập cho người dùng được ủy quyền. Hệ thống ủy quyền của chúng tôi sẽ dựa trên cơ chế phiên. Trước khi tiếp tục bài học này, tôi khuyên bạn nên làm quen với một trong những bài học trước đây của tôi, trong đó chúng ta đặc biệt xem xét công việc của các buổi học -.

Tóm lại, tất cả công việc với phiên có thể được chia thành 3 giai đoạn:

Khai mạc phiên họp. Trên tất cả các trang ngụ ý hoạt động với phiên, phiên phải được bắt đầu bằng hàm session_start().

Đăng ký các biến phiên.

Hủy đăng ký các biến phiên bằng hàm unset() và đóng phiên bằng hàm session_destroy().

Bước 1

Vì vậy, đối với công việc của mình, chúng tôi sẽ tạo 3 tệp - Trang chủ (index.php), Danh bạ (contact.php) và Bảng quản trị (admin.php). Xin lưu ý rằng phần mở rộng tệp mà chúng tôi sẽ hạn chế quyền truy cập phải là .php. Như bạn đã đoán, chúng tôi sẽ hạn chế quyền truy cập vào tệp admin.php. Mã cho tất cả các tệp là đơn giản nhất - nó là một loại menu nằm trong một dòng có các liên kết đến các trang khác và bên dưới là văn bản riêng lẻ của từng trang để chúng ta có thể phân biệt chúng với nhau. Ví dụ: đây là mã cho trang chỉ mục:

Trang chủ | Liên hệ | Quản trị viên


Đây là trang chính

Các trang còn lại, như tôi đã nói, chỉ khác ở phần văn bản sau thẻ dòng. Tôi không tạo các trang chính thức bằng thẻ meta, vì nhiệm vụ của chúng tôi chỉ là hạn chế quyền truy cập vào một trang nhất định.

Bước 2

Hiện tại, chúng tôi có thể tự do điều hướng tất cả các trang, bao gồm cả trang quản trị. Làm thế nào chúng ta có thể hạn chế quyền truy cập vào nó? Thuật toán sẽ như thế nào? Chúng tôi sẽ làm như sau: ngay từ đầu trang, chúng tôi sẽ kiểm tra xem nhãn chúng tôi cần có trong phiên hay nói một cách đơn giản hơn là liệu một biến phiên nhất định có tồn tại hay không (chúng tôi cũng có thể kiểm tra xem giá trị của biến phiên có tồn tại hay không). bằng một giá trị nhất định). Nếu không có biến đó, thì người dùng yêu cầu trang này không được ủy quyền, điều đó có nghĩa là chúng tôi sẽ chuyển hướng anh ta đến trang ủy quyền, nơi anh ta sẽ được yêu cầu điền vào biểu mẫu có tên và mật khẩu. Thuật toán cực kỳ đơn giản - hãy thực hiện nó. Đi tới tệp admin.php, mở cấu trúc PHP ở trên cùng và viết mã sau:

session_start();

if (! $_SESSION [ "quản trị viên" ] ) (

header("Vị trí: enter.php");

lối ra ;

Bây giờ chúng ta hãy đọc mã này. Đầu tiên, chúng ta đã mở một phiên, như bạn còn nhớ - đây là điều kiện tiên quyết khi làm việc với các phiên. Tiếp theo, chúng tôi tạo một điều kiện đơn giản có thể đọc như sau: “nếu phần tử quản trị viên không tồn tại trong mảng $_SESSION, chúng tôi sẽ thực thi khối hành động được đặt trong dấu ngoặc toán tử”. Và trong khối mã, sử dụng hàm header(), chúng tôi chuyển hướng người dùng đến trang enter.php (đây là trang ủy quyền). Sau hàm header(), chúng ta phải hoàn thành việc thực thi tập lệnh bằng hàm exit(). Nếu điều kiện không được đáp ứng, tức là sẽ có phần tử quản trị viên trong mảng $_SESSION, điều này có nghĩa là người dùng đã được ủy quyền thành công và chúng tôi sẽ bỏ qua khối hành động trong dấu ngoặc toán tử, tức là sẽ không có chuyển hướng nào xảy ra, và chúng tôi hiển thị trang được yêu cầu.

Bước 3

Bây giờ chúng ta cần tạo một trang đăng nhập - enter.php. Để thực hiện việc này, hãy sao chép mã, chẳng hạn như của trang contact.php, tạo một tệp mới và dán mã đã sao chép vào đó. Lưu tệp dưới tên enter.php. Bây giờ trên trang này, chúng tôi sẽ viết một biểu mẫu đơn giản để nhập thông tin đăng nhập và mật khẩu của bạn:

Trang chủ | Liên hệ | Quản trị viên


Đây là trang đăng nhập.
Tên tài khoản:
Mật khẩu:

< p > < a href = "index.php" >trang chủ< / a > | < a href = "contact.php" >Liên lạc< / a > | < a href = "admin.php" >Quản trị viên< / a > < / p >

< hr / >

< br / >

< form method = "post" >

Tên tài khoản:< input type = "text" name = "user" / > < br / >

Mật khẩu:< input type = "password" name = "pass" / > < br / >

< input type = "submit" name = "submit" value = "Để vào" / >

< / form >

Mọi thứ đều đơn giản ở đây. Biểu mẫu có 2 trường: trường đăng nhập (chúng tôi đặt tên là “người dùng”) và trường mật khẩu (có tên là “pass”). Chúng tôi cũng đã tạo một nút (tên là “gửi”), khi nhấp vào, dữ liệu từ biểu mẫu sẽ được gửi. Dữ liệu được gửi bằng phương thức đăng - chúng tôi đã chỉ định điều này trong thuộc tính phương thức của thẻ biểu mẫu - và sẽ được xử lý trên cùng một trang. Bây giờ chúng ta có thể thử truy cập trang quản trị. Nếu mọi thứ được thực hiện mà không có lỗi, chúng tôi sẽ không thể đạt được điều đó mà luôn kết thúc trên trang ủy quyền.

Tuyệt vời!

Bước 4

Tiếp theo, chúng ta cần viết một trình xử lý trên trang có biểu mẫu sẽ nhận dữ liệu từ biểu mẫu và so sánh xem thông tin đăng nhập và mật khẩu từ biểu mẫu có khớp với thông tin mà chúng ta có hay không. Để thực hiện việc này, hãy mở cấu trúc PHP ở đầu trang đăng nhập và bắt đầu viết mã. Đầu tiên, chúng ta phải mở một phiên - sau cùng, đây là nơi chúng ta sẽ tạo nhãn trong phiên nếu chúng ta nhận được thông tin đăng nhập và mật khẩu chính xác. Trên cùng trang này, chúng tôi sẽ lưu trữ thông tin đăng nhập và mật khẩu của quản trị viên. Thông thường dữ liệu này được lưu trữ trong cơ sở dữ liệu (DB), nhưng chúng ta sẽ chỉ có 1 người dùng (quản trị viên) và do đó việc lưu trữ dữ liệu của anh ta để đăng nhập vào DB là không hoàn toàn hợp lý. Nếu có nhiều hơn một người dùng, ví dụ: chúng tôi đang viết một dự án có đăng ký, thì tất nhiên, trong trường hợp này sẽ khó thực hiện nếu không có cơ sở dữ liệu.

Vì vậy, thông tin đăng nhập của chúng tôi sẽ là “quản trị viên” và chúng tôi sẽ lưu trữ nó trong biến $admin. Mật khẩu sẽ là “mypass” và nó sẽ được lưu trong biến $pass. Nhưng việc lưu trữ mật khẩu ở dạng văn bản rõ ràng không được chấp nhận - điều này trái với nguyên tắc bảo mật. Chúng tôi sẽ lưu trữ mật khẩu ở dạng mã hóa và hàm md5() sẽ giúp chúng tôi mã hóa nó. Hàm này mã hóa một chuỗi bằng thuật toán đặc biệt và đầu ra là một chuỗi gồm 32 ký tự (được gọi là hàm băm). Nếu chúng ta mã hóa chuỗi “mypass” (điều này có thể được thực hiện, ví dụ: trong tệp contact.php):

echo md5 ("mypass" );

thì đầu ra sẽ là dòng “a029d0df84eb5549c641e04a9ef389e5” - đây sẽ là mật khẩu được mã hóa của chúng tôi. Hiện tại, mã trang đăng nhập sẽ như thế này:

Trang chủ | Liên hệ | Quản trị viên


Đây là trang đăng nhập.
Tên tài khoản:
Mật khẩu:

session_start();

$admin = "quản trị viên" ;

$ vượt qua = "a029d0df84eb5549c641e04a9ef389e5";

< p > < a href = "index.php" >trang chủ< / a > | < a href = "contact.php" >Liên lạc< / a > | < a href = "admin.php" >Quản trị viên< / a > < / p >

< hr / >

< br / >

< form method = "post" >

Tên tài khoản:< input type = "text" name = "user" / > < br / >

Mật khẩu:< input type = "password" name = "pass" / > < br / >

< input type = "submit" name = "submit" value = "Để vào" / >

< / form >

Bước 5

Bây giờ hãy kiểm tra những gì chúng tôi nhận được từ biểu mẫu với những gì chúng tôi có trong các biến đăng nhập và mật khẩu. Chúng tôi sẽ thực hiện việc này có điều kiện - chỉ khi nhấn nút biểu mẫu. Làm thế nào chúng ta có thể kiểm tra điều này? Nút này có tên (“gửi”) và chúng tôi truyền dữ liệu bằng phương thức đăng. Theo đó, chúng ta có thể chỉ cần kiểm tra xem phần tử gửi có tồn tại trong mảng $_POST hay không. Nếu có, nút đã được nhấn và chúng tôi sẽ thực hiện các hành động để xác minh dữ liệu đã gửi, nếu không chúng tôi sẽ không làm gì cả. Sau khi khai báo thông tin đăng nhập và mật khẩu, chúng ta viết điều kiện:

if($_POST["submit"])( if($admin == $_POST["user"] AND $pass == md5($_POST["pass"]))( $_SESSION["admin"] = $ admin; header("Vị trí: admin.php");

Đăng nhập hoặc mật khẩu không đúng!

"; }

nếu ($_POST["gửi"]) (

if ($ quản trị viên == $_POST [ "người dùng"] VÀ $ pass == md5 ( $ _POST [ "pass" ] ) ) (

$_SESSION["admin"] = $admin;

lối ra ;

) tiếng vang khác "

Đăng nhập hoặc mật khẩu không đúng!

" ;

Chúng tôi đã đưa ra điều kiện kiểm tra gấp đôi thông tin đăng nhập và mật khẩu. Điều này được thực hiện bằng cách sử dụng toán tử logic AND (nó cũng có thể được viết theo cách này - “&&”). Điều kiện có thể được đọc như sau: “nếu (biến $admin bằng phần tử người dùng trong mảng $_POST VÀ biến $pass bằng hàm băm của phần tử pass trong mảng $_POST) thì (chúng tôi thực hiện khối hành động) nếu không chúng tôi sẽ hiển thị dòng chữ 'Đăng nhập hoặc mật khẩu không chính xác!'

Nếu cặp mật khẩu đăng nhập khớp thì chúng tôi đăng ký biến phiên $_SESSION["admin"] và chuyển hướng người dùng đến trang quản trị - admin.php.
Bây giờ chúng ta hãy thử kiểm tra những gì chúng ta đã tạo. Nếu chúng tôi cố tình nhập thông tin đăng nhập và mật khẩu sai, chúng tôi sẽ nhận được thông báo cảnh báo rằng “Thông tin đăng nhập hoặc mật khẩu không chính xác!” Bây giờ chúng ta hãy thử nhập thông tin đăng nhập chính xác. Nếu chúng tôi không mắc lỗi ở đâu, thì sau khi nhấp vào nút “Đăng nhập”, chúng tôi sẽ thấy mình trên trang quản trị.

Bước 6

Bây giờ tất cả những gì còn lại cần làm là thêm một số chi tiết nhỏ. Ví dụ: hiện tại chúng tôi đã được ủy quyền trong hệ thống, nhưng nếu nhập địa chỉ của trang ủy quyền vào thanh địa chỉ, chúng tôi sẽ dễ dàng truy cập vào đó và xem biểu mẫu ủy quyền. Điều này sẽ không xảy ra - chỉ người dùng trái phép mới thấy được biểu mẫu. Làm thế nào chúng ta có thể khắc phục điều này? Hãy nhớ rằng trên trang admin.php, chúng tôi đã kiểm tra xem nhãn có trong phiên hay không. Nếu nó không có ở đó, chúng tôi đã chuyển hướng người dùng đến trang ủy quyền. Ở đây chúng ta có thể làm điều tương tự, chỉ có điều ngược lại. Tức là chúng tôi cũng kiểm tra xem nhãn có trong phiên hay không. Chỉ bây giờ chúng tôi sẽ chuyển người dùng sang trang quản trị nếu có nhãn như vậy. Về nguyên tắc, điều này là hợp lý. Nếu có nhãn thì người dùng đã được ủy quyền và chúng tôi có thể chuyển người dùng đó sang trang quản trị. Trên trang enter.php sau khi phiên bắt đầu, hãy thêm đoạn mã sau:

if($_SESSION["admin"])( header("Location: admin.php"); exit; )

nếu ($_SESSION["quản trị viên"]) (

tiêu đề ("Vị trí: admin.php" );

lối ra ;

Bây giờ, nếu người dùng được ủy quyền cố gắng nhập tên của trang ủy quyền vào thanh địa chỉ, anh ta sẽ được chuyển hướng đến trang quản trị. Người dùng trái phép sẽ có thể tự do truy cập trang ủy quyền.

Bước 7

Điểm tiếp theo mà chúng tôi cần cung cấp là việc triển khai đăng xuất của người dùng được ủy quyền, tức là giả sử quản trị viên đã hoàn thành công việc của mình và cần đăng xuất để không ai khác có thể làm việc bằng tài khoản của mình. Để thực hiện việc này, hãy thêm liên kết “Thoát” vào trang admin.php. Liên kết sẽ dẫn đến cùng một trang, chỉ có thông số chúng ta cần mới được thêm vào đó. Tham số được thêm bằng dấu chấm hỏi:

Lối ra

< a href = "admin.php?do=logout" >Lối ra< / a >

Liên kết này có thể được đặt ở nơi chúng ta cần - Tôi sẽ đặt nó sau văn bản trang. Về tham số, nó sẽ được truyền bằng phương thức GET (hãy nhớ rằng chúng ta đã truyền dữ liệu từ biểu mẫu bằng tham số thứ hai - POST). Khi sử dụng phương pháp này, dữ liệu sẽ được thêm vào địa chỉ trên thanh địa chỉ và được phân tách khỏi địa chỉ chỉ bằng dấu chấm hỏi. Chúng tôi truyền một tham số - do - và đồng thời gán cho nó giá trị "đăng xuất". Làm cách nào chúng tôi có thể ủy quyền cho người dùng bây giờ? Rất đơn giản - giai đoạn thứ hai và thứ ba sẽ giúp ích cho chúng ta khi làm việc với các phiên. Khi tải trang, chúng ta có thể kiểm tra giá trị của phần tử do từ mảng $_GET. Nếu nó bằng chuỗi “đăng xuất”, chúng tôi sẽ chỉ hủy đăng ký biến phiên $_SESSION["admin"] và hủy phiên. Theo đó, sẽ không có nhãn trong phiên sau đó và trong khối tiếp theo, nơi chúng tôi kiểm tra sự hiện diện của nhãn, người dùng sẽ được chuyển hướng đến trang ủy quyền. Nó đơn giản.

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 tôi 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 bản ghi mới trong bảng lần đă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.

Hướng dẫn

Hãy tổ chức cách dễ nhất để bảo vệ các trang khỏi những người truy cập trái phép. Người mang thông tin về việc liệu khách truy cập sẽ có mặt hay không. Phiên tương tự như cookie trong trình duyệt, điểm khác biệt duy nhất là chúng không được tạo bởi chúng tôi mà trên máy chủ. Và chúng được sử dụng cho mục đích tương tự như cookie - để lưu trữ nhiều thông tin khác nhau về chúng tôi khi chúng tôi truy cập trang của một trang web. Khi chúng tôi đóng trình duyệt, máy chủ sẽ hủy phiên này và lần đăng nhập tiếp theo, nó sẽ tạo một phiên mới. Chúng tôi sử dụng cơ chế máy chủ này để ghi lại trong phiên xem người dùng đã được cấp quyền hay chưa. Bằng cách đọc thông tin này, khi khách truy cập yêu cầu một trang, tập lệnh PHP sẽ mở quyền truy cập vào các trang được bảo vệ bằng mật khẩu hoặc nhắc bạn nhập thông tin đăng nhập và mật khẩu.

Bước 1: Tạo trang để nhập thông tin đăng nhập và . Mã HTML của biểu mẫu ủy quyền ở dạng đơn giản nhất có thể trông như thế này:

Đăng nhập:

Mật khẩu:


Ở đây (ở đầu tệp), chúng tôi sẽ thêm một mã PHP để kiểm tra tính chính xác của tên người dùng và mật khẩu mà khách truy cập đã nhập. Lúc đầu chúng tôi viết:
session_start();
Lệnh này bắt đầu một phiên mới nếu phiên này chưa được tạo cho khách truy cập này.
Sau đó, chúng tôi sẽ kiểm tra xem phiên có biến được gọi là "userName" hay không - nó sẽ lưu tên nếu khách truy cập đã được ủy quyền. Nếu có một biến như vậy, chúng tôi sẽ chuyển hướng khách truy cập đến trang chính (index.php) và hoàn tất việc thực thi tập lệnh php này:
if($_SESSION["userName"])(

}
Tất cả các mã khác sẽ chỉ được thực thi nếu người dùng chưa nhập đúng thông tin đăng nhập và mật khẩu. Hãy để chúng tôi chỉ ra thông tin đăng nhập và mật khẩu nào được coi là chính xác:
$validName = "Tôi là của tôi!";


Sau đó chúng ta sẽ kiểm tra xem các giá trị được gửi từ biểu mẫu có chính xác hay không. Vì chúng ta đã chỉ định phương thức truyền dữ liệu POST trong biểu mẫu nên chúng phải được đọc từ biến siêu toàn cầu $_POST:

Header("Vị trí: index.php");

}
Ở đây mã trong dấu ngoặc nhọn () sẽ được thực thi với giá trị đăng nhập và mật khẩu chính xác. Trong dòng $_SESSION["userName"] = $validName; Chúng tôi viết một biến trong phiên có tên "userName" chứa thông tin đăng nhập của người dùng được ủy quyền hiện tại. Đây sẽ là dấu hiệu cho thấy anh ta có quyền truy cập ở mọi nơi miễn là phiên hiện tại của anh ta hợp lệ.
Và trong trường hợp dữ liệu nhập vào biểu mẫu không chính xác, chúng ta sẽ thêm thông báo tương ứng:
tiếng vang khác "
Đăng nhập hoặc mật khẩu không đúng!
";
Tất cả mã cần được lưu trong tệp có tên login.php sẽ trông như thế này:

session_start();
if($_SESSION["userName"])(

Header("Vị trí: index.php");

}
$validName = "Tôi là của tôi!";

$validPass = "mật khẩu bí mật";
if($_POST["userName"] == $validName && $_POST["userPass"] == $validPass) (

$_SESSION["userName"] = $validName;

Header("Vị trí: index.php");

tiếng vang khác "
Đăng nhập hoặc mật khẩu không đúng!
";

Đăng nhập:

Mật khẩu:

Bước 2: Tạo khối ủy quyền - một tệp riêng biệt sẽ được kết nối với từng trang cần bảo vệ bằng mật khẩu. Tệp này sẽ chỉ chứa mã PHP, vì vậy phần mở rộng của nó sẽ là “php” và chúng tôi sẽ đặt tên theo truyền thống cho các tệp đó - “auth”, tức là “auth.php”. Và ở đây nữa, ngay sau thẻ mở đầusession_start();
Chúng ta có thể đọc tất cả các biến được lưu trữ trong phiên từ mảng siêu toàn cầu $_SESSION. Chúng tôi cần kiểm tra giá trị của biến "userName" - nếu khách truy cập chưa đăng nhập thì nó sẽ không có trong mảng và chúng tôi sẽ chuyển hướng anh ta đến trang để nhập thông tin đăng nhập và mật khẩu của anh ta:
if(!$_SESSION["ủy quyền"])(

Header("Vị trí: login.php");

session_start();
if(!$_SESSION["admin"])(

Header("Vị trí: enter.php");

Nếu bạn cần làm cho một trong các phần của trang web của mình có thể truy cập được đối với một nhóm người có giới hạn nhưng không xác định, cách dễ nhất để thực hiện việc này là đăng ký và ủy quyền cho người dùng. Có nhiều cách để phân quyền cho người dùng. Bạn có thể sử dụng cả công cụ máy chủ web và công cụ ngôn ngữ lập trình. Chúng ta sẽ nói về trường hợp phiên PHP được sử dụng.

Trước tiên, hãy thảo luận về tất cả các bước chúng ta sẽ thực hiện tiếp theo. Chúng ta thậm chí cần gì? Chúng tôi cần một tập lệnh sẽ đăng ký người dùng, ủy quyền cho người dùng, chuyển hướng người dùng đến một nơi nào đó sau khi ủy quyền. Chúng tôi cũng sẽ cần tạo một trang được bảo vệ khỏi sự truy cập của những người dùng trái phép. Để đăng ký và ủy quyền, chúng tôi sẽ cần tạo các biểu mẫu HTML. Chúng tôi sẽ lưu trữ thông tin về người dùng đã đăng ký trong cơ sở dữ liệu. Điều này có nghĩa là chúng ta vẫn cần một tập lệnh để kết nối với DBMS. Tất cả công việc của chúng tôi sẽ được thực hiện bởi các chức năng mà chúng tôi tự viết. Chúng tôi sẽ lưu các chức năng này trong một tập tin riêng biệt.

Vì vậy, chúng tôi cần các tập tin sau:

  • kết nối với DBMS;
  • chức năng tùy chỉnh;
  • ủy quyền;
  • sự đăng ký;
  • trang được bảo vệ;
  • kịch bản tắt máy của người dùng;
  • một tập lệnh kiểm tra trạng thái ủy quyền của người dùng;
  • biểu định kiểu cho thiết kế đơn giản nhất cho các trang của chúng tôi.

Tất cả điều này sẽ vô nghĩa nếu bạn không có bảng tương ứng trong cơ sở dữ liệu. Khởi chạy công cụ quản lý DBMS của bạn (PhpMyAdmin hoặc dòng lệnh, tùy theo cách nào thuận tiện hơn) và chạy truy vấn sau trong đó:

TẠO BẢNG `users` (`id` int(11) NOT NULL AUTO_INCREMENT, `login` char(16) NOT NULL, `password` char(40) NOT NULL, `reg_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (` id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Tôi sẽ đặt tên cho các tệp tập lệnh của mình như thế này (tất cả chúng sẽ nằm trong một thư mục):

  • cơ sở dữ liệu.php;
  • hàm.php;
  • đăng nhập.php;
  • đăng ký.php;
  • chỉ mục.php;
  • đăng xuất.php;
  • checkAuth.php;
  • phong cách.css.

Tôi chắc chắn rằng mục đích của mỗi người trong số họ đều rõ ràng đối với bạn. Hãy bắt đầu với tập lệnh kết nối tới DBMS. Bạn đã nhìn thấy nó rồi. Chỉ cần lưu mã cho tập lệnh này vào một tệp có tên là cơ sở dữ liệu.php. Chúng ta sẽ khai báo các hàm tùy chỉnh trong tệp tin.php. Tất cả điều này sẽ hoạt động như thế nào? Người dùng trái phép cố gắng truy cập vào tài liệu được bảo vệ index.php, hệ thống sẽ kiểm tra xem người dùng có được ủy quyền hay không, nếu người dùng không được ủy quyền, anh ta sẽ được chuyển hướng đến trang ủy quyền. Trên trang đăng nhập, người dùng sẽ thấy một biểu mẫu ủy quyền. Hãy làm nó.

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

đăng ký.

Bây giờ biểu mẫu của chúng ta cần được cung cấp một số biểu mẫu. Đồng thời, chúng ta sẽ xác định quy tắc cho các phần tử khác. Sắp tới tôi sẽ trình bày đầy đủ nội dung của style sheet.

/* file style.css */ .row ( lề-bottom:10px; width:220px; ) .row nhãn ( display:block; font-weight:bold; ) .row input.text ( font-size:1.2em; đệm:2px 5px; ) .to_reg ( font-size:0.9em; ) .instruction ( font-size:0.8em; color:#aaaaaa; Margin-left:2px; con trỏ:mặc định; ) .error ( color:red; lề trái:3px )

Nếu mọi thứ được thực hiện chính xác, bạn sẽ có thông tin sau trong trình duyệt của mình:

Tất nhiên, chúng tôi chưa có một người dùng nào đã đăng ký và để đăng nhập, bạn cần phải đăng ký. Hãy làm một mẫu đăng ký.

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

" />

Bạn có thể nhận thấy rằng có các biến PHP trong mã HTML. Chúng là nội dung thuộc tính của trường văn bản của biểu mẫu, nội dung của các thùng chứa được thiết kế để hiển thị lỗi. Nhưng chúng tôi chưa khởi tạo các biến này. Hãy làm điều đó.

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

" />
Tên người dùng chỉ có thể chứa các ký tự Latin, số và ký hiệu "_", "-", ".". Tên người dùng không được ngắn hơn 4 ký tự và không dài hơn 16 ký tự
Trong mật khẩu của bạn, bạn chỉ có thể sử dụng các ký tự Latin, số và ký hiệu "_", "!", "(", ")". Mật khẩu không được ngắn hơn 6 ký tự và không dài hơn 16 ký tự
Lặp lại mật khẩu đã nhập trước đó

Không có tham số nào được chỉ định trong thuộc tính hành động của thẻ biểu mẫu. Trong trường hợp này, khi gửi dữ liệu biểu mẫu, nó sẽ được xử lý theo cùng một tập lệnh mà nó được gửi. Điều này có nghĩa là chúng ta cần viết mã xử lý dữ liệu biểu mẫu. Nhưng trước tiên hãy thảo luận về thuật toán xử lý chúng.

Chúng tôi cần các trường đăng nhập và mật khẩu không được để trống. Sau đó, bạn cần kiểm tra thông tin đăng nhập để tuân thủ các yêu cầu. Mật khẩu cũng phải đáp ứng các yêu cầu được mô tả và mật khẩu được chỉ định lại phải khớp với mật khẩu đó và ngoài ra, chúng phải giống nhau. Nếu bất kỳ điều kiện nào trong số này không được đáp ứng thì việc xử lý dữ liệu biểu mẫu phải dừng lại, một cảnh báo thích hợp phải được ghi vào mảng thông báo lỗi và nó phải được hiển thị cho người dùng. Để thuận tiện cho người dùng, chúng tôi sẽ lưu thông tin đăng nhập anh ấy đã nhập (nếu anh ấy chỉ định nó) bằng cách ghi giá trị của nó vào mảng $fields.

Nếu mọi thứ đều ổn, trong cửa sổ trình duyệt của bạn, khi bạn truy cập tài liệu register.php, bạn sẽ thấy một cái gì đó như thế này:

Bây giờ, giả sử người dùng đã nhấp vào nút đăng ký và không điền vào các trường biểu mẫu. Theo thuật toán của chúng tôi, thông tin đăng nhập và mật khẩu không được để trống. Nếu điều kiện này không được đáp ứng, việc đăng ký là không thể. Chúng tôi lưu ý rằng việc xử lý dữ liệu biểu mẫu diễn ra trong kịch bản hiện tại. Điều này có nghĩa là chúng ta cần thay đổi mã của nó bằng cách thêm các kiểm tra thích hợp. Hãy thảo luận ngay về việc kiểm tra sau đây. Nếu bạn đã nhập cả thông tin đăng nhập và mật khẩu, bạn cần kiểm tra xem chúng có tuân thủ các yêu cầu đã chỉ định hay không. Để xác minh thông tin đăng nhập và mật khẩu, chúng tôi sẽ tạo các hàm tùy chỉnh trong tệp tin.php.

/** * Hàm.php * Tệp có chức năng tùy chỉnh */ // Kết nối tệp có tham số kết nối với DBMS require_once("database.php"); // Kiểm tra hàm tên người dùng checkLogin($str) ( // Khởi tạo một biến có thể có thông báo lỗi $error = ""; // Nếu thiếu dòng đăng nhập, trả về thông báo lỗi if(!$str) ( $error = " Bạn chưa nhập tên người dùng"; return $error; ) /** * Kiểm tra tên người dùng bằng biểu thức thông thường * Thông tin đăng nhập không được ngắn hơn 4, không dài hơn 16 ký tự * Nó phải chứa các ký tự của bảng chữ cái Latinh, số, * nó có thể chứa các ký tự "_", "-", "." */ $pattern = "/^[-_.a-z\d](4,16)$/i"; ($pattern, $str) ; // Nếu kiểm tra không thành công, trả về thông báo lỗi if(!$result) ( $error = "Các ký tự không hợp lệ trong tên người dùng hoặc tên người dùng quá ngắn (dài)"; return $error; ) // Nếu mọi thứ đều ổn, trả về giá trị true return true; ) // Kiểm tra hàm mật khẩu của người dùng checkPassword($str) ( // Khởi tạo một biến có thể có thông báo lỗi $error = ""; // Nếu có không có dòng đăng nhập, trả về thông báo lỗi if(!$ str) ( $error = "Bạn chưa nhập mật khẩu"; trả về lỗi $; ) /** * Kiểm tra mật khẩu người dùng bằng biểu thức thông thường * Mật khẩu không được ngắn hơn 6, không dài quá 16 ký tự * Phải chứa các ký tự Latin, số, * có thể chứa các ký tự "_", "!", " (", ")" */ $pattern = "/^[_!)(.a-z\d](6,16)$/i"; $result = preg_match($pattern, $str); // Nếu kiểm tra không thành công, trả về thông báo lỗi if(!$result) ( $error = "Ký tự không hợp lệ trong mật khẩu của người dùng hoặc mật khẩu quá ngắn (dài)"; return $error; ) // Nếu mọi thứ đều ổn, return giá trị true trả về true; )

Bây giờ chúng ta cần sửa đổi tệp register.php để kích hoạt các chức năng mà chúng ta đã khai báo. Chúng tôi sẽ thêm một điều kiện vào tập lệnh để kiểm tra xem nút đăng ký có được nhấn hay không. Trong điều kiện này, quá trình kiểm tra thông tin đăng nhập và mật khẩu sẽ được thực hiện. Nếu bất kỳ bước kiểm tra nào không thành công, chúng tôi sẽ hiển thị lại biểu mẫu và hiển thị thông báo lỗi. Nếu không có lỗi, chúng tôi đăng ký người dùng, chúng tôi không hiển thị biểu mẫu đăng ký nữa, chúng tôi thông báo cho người dùng về việc đăng ký thành công và sử dụng hàm header(), chúng tôi chuyển hướng anh ấy đến biểu mẫu ủy quyền.

Bạn đã đăng ký thành công vào hệ thống. Bây giờ bạn sẽ được chuyển hướng đến trang đăng nhập. Nếu điều này không xảy ra, hãy truy cập nó bằng liên kết trực tiếp.

"; header("Refresh: 5; URL = login.php"); ) // Nếu không, hãy thông báo cho người dùng về lỗi else ( $errors["full_error"] = $reg; ) ) ) ?> Đăng ký người dùng
" />
Tên người dùng chỉ có thể chứa các ký tự Latin, số và ký hiệu "_", "-", ".". Tên người dùng không được ngắn hơn 4 ký tự và không dài hơn 16 ký tự
Trong mật khẩu của bạn, bạn chỉ có thể sử dụng các ký tự Latin, số và ký hiệu "_", "!", "(", ")". Mật khẩu không được ngắn hơn 6 ký tự và không dài hơn 16 ký tự
Lặp lại mật khẩu đã nhập trước đó

Bạn hẳn đã nhận thấy một chức năng mới khác trong tập lệnh - register() . Nhưng chúng tôi vẫn chưa công bố điều đó. Hãy làm điều đó.

// Chức năng đăng ký người dùng đăng ký chức năng($login, $password) ( // Khởi tạo một biến có thể có thông báo lỗi $error = ""; // Nếu không có dòng đăng nhập, trả về thông báo lỗi if(!$login) ( $ error = "Không chỉ định đăng nhập"; return $error; ) elseif(!$password) ( $error = "Không chỉ định mật khẩu"; return $error; ) // Kiểm tra xem người dùng đã đăng ký chưa // Kết nối với DBMS connect() ; // Viết một chuỗi truy vấn $sql = "SELECT `id` FROM `users` WHERE `login`="" . $login . """ // Tạo một truy vấn tới cơ sở dữ liệu $query = mysql_query( $sql) hoặc die( ""); // Xem số lượng người dùng đăng nhập lần này, nếu có ít nhất một, // trả về thông báo lỗi if(mysql_num_rows($query) > 0) ( $error = " Người dùng có thông tin đăng nhập được chỉ định đã được đăng ký"; return $ error; ) // Nếu không có người dùng nào như vậy, hãy đăng ký nó // Viết chuỗi truy vấn $sql = "INSERT INTO `users` (`id`,`login` ,`password`) GIÁ TRỊ (NULL, "" . $login . " ","" . $ mật khẩu. "")"; // Thực hiện truy vấn tới cơ sở dữ liệu $query = mysql_query($sql) hoặc die("

Không thể thêm người dùng: " . mysql_error() . ". Đã xảy ra lỗi ở dòng " . __LINE__ . "

"); // Đừng quên ngắt kết nối khỏi DBMS mysql_close(); // Trả về giá trị true, cho biết đăng ký người dùng thành công return true; )

Nếu mọi thứ đều ổn, người dùng của bạn sẽ được đăng ký. Bạn có thể kiểm tra biểu mẫu. Hãy thử đăng ký người dùng với cùng thông tin đăng nhập. Sau khi đăng ký thành công, người dùng sẽ được chuyển hướng đến biểu mẫu ủy quyền. Trước đây, chúng tôi chỉ tạo đánh dấu để hiển thị biểu mẫu này. Vì không có tham số nào được chỉ định trong thuộc tính hành động của nó nên dữ liệu được gửi bởi biểu mẫu sẽ được xử lý trong cùng một tập lệnh. Điều này có nghĩa là chúng ta cần viết mã để xử lý và thêm nó vào tài liệu login.php.

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

;">

Nếu bạn chưa đăng ký trong hệ thống, hãy đăng ký.

Bạn có thể nhận thấy rằng trong tập lệnh ủy quyền hiện tại chúng ta có một hàm lạ khác - ủy quyền() . Chức năng này phải ủy quyền cho người dùng bằng cách trước tiên kiểm tra xem người dùng đã đăng ký có cùng thông tin đăng nhập và mật khẩu có tồn tại trong cơ sở dữ liệu hay không. Nếu không tìm thấy người dùng như vậy, việc ủy ​​quyền sẽ bị hủy bỏ và thông báo lỗi sẽ được hiển thị. Nếu kiểm tra thành công, hàm ủy quyền () sẽ khởi chạy một phiên và ghi các giá trị đăng nhập và mật khẩu của người dùng vào đó, thông báo cho tập lệnh rằng ủy quyền thành công và tập lệnh sẽ chuyển hướng người dùng đến trang tài nguyên được bảo vệ.

/** * Chức năng phân quyền người dùng. * Việc ủy ​​quyền người dùng sẽ được thực hiện * sử dụng các phiên PHP. */ function ủy quyền($login, $password) ( // Khởi tạo một biến có thể có thông báo lỗi $error = ""; // Nếu không có dòng đăng nhập, trả về thông báo lỗi if(!$login) ( $error = " Đăng nhập không được chỉ định"; return $error; ) elseif(!$password) ( $error = "Mật khẩu không được chỉ định"; return $error; ) // Kiểm tra xem người dùng đã đăng ký chưa // Kết nối với DBMS connect( ); // Chúng ta cần kiểm tra xem người dùng đó có nằm trong số những người đã đăng ký hay không // Soạn chuỗi truy vấn $sql = "SELECT `id` FROM `users` WHERE `login`="".$login."" AND ` pass`="".$password ."""; // Thực hiện truy vấn $query = mysql_query($sql) hoặc die("

Không thể thực hiện truy vấn: " . mysql_error() . ". Đã xảy ra lỗi ở dòng " . __LINE__ . "

"); // Nếu không có người dùng nào có dữ liệu đó, hãy trả về thông báo lỗi if(mysql_num_rows($query) == 0) ( $error = "Người dùng có dữ liệu được chỉ định chưa được đăng ký"; return $error; ) // Nếu người dùng tồn tại, hãy bắt đầu phiên session_start(); // Và ghi thông tin đăng nhập và mật khẩu của người dùng vào đó // Để làm điều này, chúng tôi sử dụng mảng superglobal $_SESSION $_SESSION["login"] = $login[; "password"] = $password; / Đừng quên đóng kết nối với cơ sở dữ liệu mysql_close(); // Trả về true để cho biết ủy quyền người dùng thành công return true )

Khi người dùng truy cập vào một trang được bảo vệ, bạn nên kiểm tra tính chính xác của dữ liệu ủy quyền của người đó. Để làm điều này, chúng ta cần một chức năng tùy chỉnh khác. Hãy gọi nó là checkAuth() . Nhiệm vụ của nó sẽ là xác minh dữ liệu ủy quyền của người dùng với dữ liệu được lưu trữ trong cơ sở dữ liệu của chúng tôi. Nếu dữ liệu không khớp, người dùng sẽ được chuyển hướng đến trang đăng nhập.

Hàm checkAuth($login, $password) ( // Nếu không có thông tin đăng nhập hoặc mật khẩu, return false if(!$login || !$password) return false; // Kiểm tra xem người dùng đó đã được đăng ký chưa // Kết nối với DBMS connect(); // Soạn chuỗi truy vấn $sql = "SELECT `id` FROM `users` WHERE `login`="".$login."" VÀ `password`="".$password."" // Thực hiện truy vấn $ query = mysql_query($sql) hoặc die("

Không thể thực hiện truy vấn: " . mysql_error() . ". Đã xảy ra lỗi ở dòng " . __LINE__ . "

"); // Nếu không có người dùng nào có dữ liệu như vậy, return false; if(mysql_num_rows($query) == 0) ( return false; ) // Đừng quên đóng kết nối tới cơ sở dữ liệu mysql_close(); // Ngược lại trả về true trả về true)

Bây giờ người dùng đã đến trang được bảo vệ, chúng ta phải gọi hàm để kiểm tra dữ liệu ủy quyền. Chúng tôi sẽ đặt tập lệnh gọi và xác minh trong một tệp checkAuth.php riêng biệt và kết nối nó với những trang sẽ bị đóng đối với quyền truy cập công cộng.

/** * Tập lệnh kiểm tra ủy quyền người dùng */ // Bắt đầu một phiên mà từ đó chúng tôi sẽ trích xuất thông tin đăng nhập và mật khẩu // của người dùng được ủy quyền session_start(); // Kết nối một file với các hàm tùy chỉnh require_once("functions.php"); /** * Để xác định xem người dùng có được ủy quyền hay không, chúng tôi cần * kiểm tra xem các bản ghi có tồn tại trong cơ sở dữ liệu về thông tin đăng nhập * và mật khẩu của người đó hay không. Để thực hiện việc này, chúng tôi sẽ sử dụng chức năng tùy chỉnh * để kiểm tra tính chính xác của dữ liệu người dùng đã đăng nhập. * Nếu hàm này trả về sai thì không có ủy quyền. * Nếu không có ủy quyền, chúng tôi chỉ cần chuyển hướng * người dùng đến trang ủy quyền. */ // Nếu phiên chứa cả dữ liệu đăng nhập và mật khẩu, // hãy kiểm tra chúng if(isset($_SESSION["login"]) && $_SESSION["login"] && isset($_SESSION["password" ]) && $_SESSION["password"]) ( // Nếu việc kiểm tra dữ liệu hiện tại không thành công if(!checkAuth($_SESSION["login"], $_SESSION["password"])) ( // Chuyển hướng người dùng đến tiêu đề trang đăng nhập( "location: login.php"); // Dừng thực thi tập lệnh exit ) ) // Nếu không có dữ liệu về thông tin đăng nhập hoặc mật khẩu của người dùng, // chúng tôi cho rằng không có ủy quyền, hãy chuyển hướng người dùng // đến ủy quyền page else ( header("location: login.php"); // Dừng thực thi lệnh thoát;

Bây giờ hãy tạo mã cho trang bảo mật của chúng ta. Nó sẽ khá đơn giản.

Phân quyền và đăng ký người dùng

Ủy quyền thành công.

Bạn đã truy cập một trang an toàn. Bạn có thể đăng xuất.

Như bạn có thể thấy, trong tài liệu được bảo vệ, chúng tôi chỉ bao gồm một tệp - checkAuth.php. Tất cả các tệp khác được kết nối trong các tập lệnh khác. Do đó, mã của chúng tôi trông không rườm rà. Chúng tôi đã tổ chức đăng ký và ủy quyền cho người dùng. Bây giờ bạn cần cho phép người dùng đăng xuất. Để thực hiện việc này, chúng ta sẽ tạo một tập lệnh trong tệp logout.php.

/** * Kịch bản đăng xuất của người dùng. Vì người dùng * đăng nhập qua các phiên nên thông tin đăng nhập và mật khẩu của họ được lưu trữ * trong mảng siêu toàn cầu $_SESSION. Để * đăng xuất khỏi hệ thống, chỉ cần hủy các giá trị * của mảng $_SESSION["login"] và $_SESSION["password"], sau đó chúng tôi * chuyển hướng người dùng đến trang đăng nhập */ // Be chắc chắn bắt đầu phiên session_start(); unset($_SESSION["đăng nhập"]); unset($_SESSION["password"]); header("vị trí: login.php");

Kịch bản đăng ký, ủy quyền và xác minh người dùng đã sẵn sàng. Bạn có thể sử dụng cho chính mình, bổ sung, thay đổi cho phù hợp với nhu cầu của mình. Nếu bạn có bất kỳ câu hỏi nào, bạn có thể hỏi họ trong phần bình luận. Bạn có thể tải xuống tất cả các tệp được thảo luận ở đây, được đóng gói thành một kho lưu trữ.

tái bút Tôi biết rằng viết mã hướng đối tượng sẽ tốt hơn, tôi biết rằng việc truyền và lưu trữ mật khẩu ở dạng văn bản rõ ràng là không đáng, thông tin nhập vào cơ sở dữ liệu phải được kiểm tra trước. Tôi biết. Tôi sẽ không nói về điều này ở đây.