Cách tạo biểu mẫu ủy quyền bằng html. Xây dựng một hệ thống đăng ký cực kỳ đơn giản bằng PHP và MySQL

Chào mọi người. Vậy là chúng ta đã học được một số yếu tố để tạo hình. Đã đến lúc kết hợp kiến ​​thức của chúng ta để giải quyết một vấn đề lớn hơn. Hãy tạo biểu mẫu đơn giản nhất để ủy quyền trên trang web. Để làm điều này, chúng ta cần hai trường, chúng ta tạo và đính kèm chữ ký vào chúng.

Trường đầu tiên là thông tin đăng nhập, trường thứ hai là mật khẩu. Và với cái thứ hai thì không đơn giản như vậy. Bởi vì hiện tại nó chỉ là trường nhập văn bản.

Kết quả trên trình duyệt:

Để văn bản đã nhập trong đó được thay thế bằng dấu hoa thị, theo thông lệ đối với trường loại này, bạn cần thực hiện một hành động đơn giản. Cụ thể, để thay thế giá trị thuộc tính kiểu TRÊN mật khẩu:

Kết quả:

Nút gửi biểu mẫu

Đây nhé. Mẫu của chúng tôi gần như đã sẵn sàng. Bây giờ, để hoàn thành việc tạo biểu mẫu, bạn cần tạo một nút sẽ được sử dụng để gửi biểu mẫu. Vấn đề được giải quyết bằng cách sử dụng thẻ với loại nộp.

Nếu nút phải có một số loại dòng chữ thì việc này có thể được thực hiện bằng cách sử dụng thuộc tính giá trị. Việc gán tên cho nút hay không là tùy thuộc vào bạn; nếu bạn làm điều này, máy chủ sẽ nhận được tên này cũng như giá trị của nút.

Theo quy định, tên của nút gửi biểu mẫu là cần thiết khi biểu mẫu có nhiều nút, mỗi nút thực hiện một hành động cụ thể. Nhờ đó, máy chủ nhận được tên và giá trị của nút từ trình duyệt sẽ hiểu được người dùng đã nhấp vào nút nào và theo đó, cần phải làm gì.

Kết quả là mã cho biểu mẫu của chúng tôi sẽ như sau:

Kết quả trên trình duyệt:

Vì vậy, có một nhiệm vụ - thực hiện đăng ký trong hệ thống và khả năng ủy quyền. Làm thế nào để làm nó? Hãy bắt đầu theo thứ tự.

Đăng ký trên php

Mọi thứ đều đơn giản ở đây. Một kho dữ liệu đang được tạo ra cho người dùng. Thông thường đây là một bảng cơ sở dữ liệu. Nó bao gồm các trường như id, tên người dùng và mật khẩu. Các trường còn lại là tùy chọn. Bạn có thể thu thập e-mail của người dùng, địa chỉ của họ, IP có thể có, thời gian truy cập mạng, từ mã từ thẻ ngân hàng, câu hỏi bảo mật...

Nói chung, điều chính là cặp mật khẩu đăng nhập.

Điểm quan trọng đầu tiên— Mật khẩu người dùng không thể được lưu trữ ở dạng văn bản rõ ràng. Đó là, giống như văn bản. Điều đó là không thể bởi vì nếu người khác có quyền truy cập vào cơ sở dữ liệu, họ sẽ nhận được cơ sở dữ liệu về mật khẩu đăng nhập của người dùng, điều mà họ khó có thể thích. Và nếu bạn cho rằng nhiều người dùng có cùng thông tin đăng nhập và mật khẩu trên các dịch vụ khác nhau, điều này sẽ khiến dữ liệu cá nhân và tài chính, thư từ cá nhân và mọi thứ khác gặp rủi ro.

Mật khẩu phải được lưu dưới dạng hàm băm. Băm là một thao tác biến dữ liệu gốc thành một loại dữ liệu có độ dài đã biết. Điều này tốt vì dàn diễn viên rất độc đáo. Nghĩa là, nếu chúng ta thay đổi ít nhất một ký tự trong dữ liệu nguồn, thì đầu ra của thao tác băm sẽ trở nên hoàn toàn khác, ngoài khả năng nhận dạng. Hoạt động băm là không thể đảo ngược, nghĩa là sẽ không thể mở rộng dữ liệu gốc từ ảnh chụp nhanh này. Đây là điểm khác biệt của nó với mã hóa.

MySQL và PHP có cùng chức năng băm phổ biến và an toàn - md5. Thuật toán này lấy dữ liệu và đưa ra dấu vân tay.

Vì vậy, chúng ta nhận dữ liệu từ người dùng, kiểm tra xem nó có trống không, có chứa ký tự nào chúng ta không cần không (đừng giới hạn người dùng quá nhiều). Và bây giờ chúng tôi thực hiện một yêu cầu như thế này:

XÁC NHẬN VÀO `users` (`id`,`username`,`password`) GIÁ TRỊ("",$quoted_username,MD5($quoted_password));

Xin lưu ý rằng tôi đã đặt tên cụ thể cho các biến là $quoted_ vì trước khi chèn chúng vào truy vấn, chúng phải được thoát bằng hàm mysql_real_escape_string(). Vì hàm này được sử dụng rất thường xuyên và được viết rất dài (tôi yêu các kiến ​​trúc sư PHP), tôi khuyên bạn nên nhồi nhét nó vào shell của mình. Ví dụ như thế này:

Hàm quote($var) ( return mysql_real_escape_string($var); )

Ủy quyền trong php

Chúng tôi đã thêm một người dùng mới và bây giờ anh ấy đã được ủy quyền. Chúng tôi vẽ cho anh ta một biểu mẫu mật khẩu đăng nhập và lấy dữ liệu của anh ta. Cái gì tiếp theo? Rốt cuộc, chúng tôi đã nhận được mật khẩu ở dạng văn bản rõ ràng và trong cơ sở dữ liệu có hàm băm của mật khẩu. Tôi có phải chuyển đổi mật khẩu thành hàm băm và sau đó so sánh chúng không? Không, bạn có thể làm điều đó đơn giản hơn - chỉ bằng một yêu cầu.

CHỌN * TỪ `người dùng` Ở ĐÂU `login`=$qoted_login VÀ `password`=MD5($quoted_password);

Nếu truy vấn trả về một chuỗi thì đó sẽ là một chuỗi có dữ liệu người dùng. Nếu không thì không có người dùng nào như vậy trong bảng. Dữ liệu người dùng sẽ rất hữu ích đối với chúng tôi - thật đáng để đưa nó vào một mảng kết hợp.

Ghi nhớ người dùng

Bây giờ chúng ta cần nhớ rằng người dùng được ủy quyền và biết chính xác đó là ai. Điều đầu tiên bạn nghĩ đến là sử dụng cookie cho việc này. Thật vậy, hãy đưa thông tin đăng nhập và id của người dùng vào cookie và luôn biết ai đang yêu cầu trang vào lúc này.

Nhưng đây là một thực hành xấu. Tại sao? Bởi vì cookie là một tệp được lưu trữ trong trình duyệt của người dùng và dữ liệu từ tệp này sẽ được truyền đến máy chủ trong mọi yêu cầu. Thứ nhất, chúng được truyền dưới dạng văn bản, có nghĩa là chúng rất dễ bị chặn. Thứ hai, đây là văn bản đơn giản được gửi bởi người dùng. Vì vậy, nó có thể được viết lại theo nghĩa đen. Ví dụ: nếu chúng tôi quyết định lưu trữ tên người dùng “Vasya” trong cookie, anh ấy có thể mở phần quản lý cookie trong trình duyệt của mình, tìm cookie mong muốn và đổi nó thành “Quản trị viên”. Đó là tất cả. Bây giờ, với mỗi yêu cầu, chúng tôi sẽ nhận được một cookie, cookie này sẽ cho chúng tôi biết tên người dùng của người dùng - “Quản trị viên”.

Do đó, sẽ an toàn hơn khi lưu trữ tất cả dữ liệu trên máy chủ ở một nơi không thể truy cập được từ web. Trong một số thư mục không thể truy cập được từ trình duyệt. Tất cả dữ liệu về người dùng phải được ghi vào thư mục này và đọc từ đó mỗi khi anh ta yêu cầu tài liệu. Để tìm ra người dùng nào sở hữu tệp dữ liệu nào, bạn cần gọi tệp đó bằng một tên duy nhất và đưa tên này vào cookie của người dùng. Như vậy, người dùng sẽ không thể tìm ra tên file đối với người dùng Admin - file này được tạo ra bởi hệ thống trên máy chủ. Và điều này cho phép bạn kéo mật khẩu ở dạng văn bản rõ ràng từ tài liệu này sang tài liệu khác.

Những gì tôi mô tả là cơ chế phiên. Ví dụ, trong Perl, để sử dụng các phiên bạn cần tải các mô-đun. Và trong các phiên PHP được hỗ trợ ngay lập tức. Trên thực tế, tất cả những gì bạn cần biết là hàm session_start() và mảng $_SESSION. Đây là tất cả. Tôi sẽ kể cho bạn nghe bây giờ.

Trong mọi tập lệnh mà bạn sẽ ghi hoặc đọc từ một phiên, bạn cần trước khi bạn xuất ra bất kỳ thông tin nào gọi hàm session_start(). Điều này sẽ bắt đầu phiên. Hàm này sẽ tạo một tệp phiên nếu nó không tồn tại hoặc đọc nó nếu một cookie đặc biệt được chuyển vào tập lệnh.

Để ghi dữ liệu vào một phiên, bạn chỉ cần ghi nó vào mảng $_SESSION. Bây giờ chúng ta cần nhớ id người dùng.

$_SESSION["userid"] = $userinfo["id"];

Tất cả. Giờ đây, mỗi khi người dùng yêu cầu tập lệnh sử dụng phiên, giá trị của phần tử $_SESSION["userid"] sẽ có sẵn cho bạn.

Do đó, khi người dùng nhập thông tin đăng nhập và mật khẩu của mình, chúng tôi đã nhận được dữ liệu của anh ấy từ cơ sở dữ liệu, điều này xác nhận rằng người dùng đó có trong cơ sở dữ liệu của chúng tôi và chúng tôi sẽ nhớ anh ấy trong phiên.

Tìm hiểu xem người dùng có được ủy quyền hay không

Chà, dễ như bóc vỏ quả lê! Bây giờ bạn đã biết phiên hoạt động như thế nào, việc tìm hiểu xem người dùng có được ủy quyền hay không chỉ là vấn đề trong một dòng. Cô ấy đây rồi:

If(isset($_SESSION["userid"])) ( print "người dùng được ủy quyền"; )

Nếu id người dùng được xác định trong phiên thì anh ta đã được ủy quyền. Nhưng làm thế nào bạn có thể tìm ra đó là người dùng nào? Đăng nhập của anh ấy là gì? Ngày sinh? Từ mã cho thẻ ngân hàng? Tên thời con gái của mẹ?

Rõ ràng là - thực hiện một truy vấn tới bảng người dùng. Chúng tôi cũng có id của người dùng này.

CHỌN * TỪ `người dùng` Ở ĐÂU `id`=$quoted_userid

Cách đăng xuất người dùng và đăng xuất

Vâng, nó khá đơn giản. Nếu chúng tôi xác định xem người dùng có được ủy quyền bởi sự hiện diện của userid trong phiên hay không, thì để đăng xuất anh ta, chúng tôi cần xóa anh ta khỏi đó. Nó được thực hiện như thế này:

Unset($_SESSION["userid"]);

Bạn cũng có thể tắt phiên để chắc chắn. Điều này sẽ xóa cookie của người dùng và hủy tệp phiên trên máy chủ. Trong trường hợp này, tất cả dữ liệu sẽ bị mất khỏi nó. Nó được thực hiện như thế này:

Session_destroy();

Đó là tất cả. Nếu bạn có bất kỳ câu hỏi nào, đừng ngần ngại liên hệ với chúng tôi. Hơn nữa, bạn có thể liên hệ với tôi qua icq hoặc mail và yêu cầu trợ giúp về điều gì đó. Tôi thường không từ chối. Nếu bạn cần sự giúp đỡ nghiêm túc, tôi có thể yêu cầu một khoản thanh toán nhỏ. Ngoài ra, tôi có thể dạy bạn cách tạo trang web từ xa! Tôi là kiểu huấn luyện viên và bậc thầy :) Và nếu bạn muốn nhận miễn phí những bài học và thủ thuật như vậy, hãy đăng ký RSS trên blog của tôi.

Bài đăng này được tài trợ bởi ibooknet.ru, nơi cung cấp dịch vụ sửa chữa máy tính xách tay với giá cả hợp lý. Cá nhân tôi thì laptop của tôi vẫn ổn và tôi hy vọng mình không phải sửa nó. Tôi cũng ước như bạn.

Tất cả những người phát triển trang web sớm hay muộn đều phải đối mặt với một nhiệm vụ như ủy quyền và xác thực người dùng, được triển khai chính xác bằng ngôn ngữ lập trình và không sử dụng tiêu chuẩn giao thức http. Hôm nay chúng ta sẽ xem xét một ví dụ về cách tạo ủy quyền đơn giản bằng ngôn ngữ lập trình PHP và chúng ta sẽ lưu trữ dữ liệu người dùng trong cơ sở dữ liệu MySQL.

Phương pháp bên dưới rất đơn giản hoặc có thể coi là cơ sở để tạo ủy quyền thông thường, nhưng bạn có thể dễ dàng sử dụng nó vì nó hoạt động khá tốt và bạn cũng có thể tự mình cải thiện phương pháp này và triển khai nó trên trang web của mình.

Phương pháp này dựa trên các phiên, nhưng tôi cũng sử dụng cookie ở đây để trình duyệt ghi nhớ người dùng đã xác thực lần trước, để không phải nhập thông tin đăng nhập mỗi lần, tất nhiên, bạn có thể lưu mật khẩu trong cookie, nhưng điều này không an toàn ngay cả khi nó được mã hóa. Để kết thúc phiên, chỉ cần đóng trình duyệt và mở lại.

Tạo đối tượng trong cơ sở dữ liệu

Hãy chuyển sang thực hành. Đầu tiên, hãy tạo một bảng để lưu trữ dữ liệu người dùng trong cơ sở dữ liệu MySQL. Tôi đề nghị sử dụng cấu trúc bảng đơn giản ( Tất nhiên, bạn có thể bổ sung nó bằng thứ gì đó, cơ sở dữ liệu của tôi được gọi là test và bảng là người dùng):

TẠO BẢNG test.users(user_id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, user_login VARCHAR(30) NOT NULL, user_password VARCHAR(32) NOT NULL, PRIMARY KEY (user_id)) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

Và hãy thêm ngay một mục vào bảng này:

Chèn vào các giá trị test.users (user_login, user_password) ("mylogin","202cb962ac59075b964b07152d234b70")

Tổng cộng chúng tôi đã có:

  • Đăng nhập– mylogin;
  • Mật khẩu -;

Tất nhiên, chúng tôi sẽ lưu trữ mật khẩu ở dạng băm, vì việc lưu trữ mật khẩu ở dạng văn bản rõ ràng, nói một cách nhẹ nhàng là không an toàn. Hash mật khẩu trên của chúng ta là 123 nên khi nhập mật khẩu vào biểu mẫu sẽ nhập đúng 123 chứ không phải.

Tạo một mẫu đăng ký

Để người dùng tự đăng ký, hãy tạo một biểu mẫu, dữ liệu từ đó sẽ được gửi đến tệp xử lý đăng ký, tức là. được ghi vào cơ sở dữ liệu. Ví dụ: đây là cách đơn giản nhất:

0) ( $error = "Đã có người dùng với thông tin đăng nhập này"; ) // Nếu không, hãy thêm người dùng mới if(!isset($error)) ( $login = mysql_real_escape_string(trim(htmlspecialchars($_POST[ "login" ]))); // Xóa dấu cách và băm mật khẩu $password = md5(trim($_POST["password"])); user_password=" ".$password."""); echo "Bạn đã đăng ký thành công với thông tin đăng nhập - ".$login; exit(); ) else ( // nếu có thông tin đăng nhập như vậy thì hãy nói về nó echo $ error; ) ) // theo mặc định, dữ liệu sẽ được gửi đến cùng một tệp in<<< html

Đăng nhập
Mật khẩu
html; ?>

Nhân tiện, với phương pháp này, tốt nhất bạn nên sử dụng các chữ cái Latinh để đăng nhập ( những thứ kia. Tiếng Anh), nếu bạn muốn viết thông tin đăng nhập bằng tiếng Nga, bạn sẽ phải điều chỉnh lại mã một chút. Bạn có thể đặt tên tập tin bất cứ điều gì bạn muốn ( để kiểm tra tôi đã sử dụng reg.html).

Ghi chú! Để thử nghiệm, tôi chỉ sử dụng một tệp, tôi gọi nó là mylogin.html (mã tệp bên dưới). Bạn có thể sử dụng nó trong các tệp của mình và gọi chúng là bất cứ thứ gì bạn muốn, tôi mô tả chính quy trình ủy quyền ở đây để bạn có thể áp dụng nó ở mọi nơi. Nhân tiện, trong tất cả các tệp, bạn sẽ phải sử dụng hàm session_start(); để bạn có thể kiểm tra xem người dùng có được ủy quyền hay không. Và tất nhiên, một điều nữa là hãy ghi lại các cài đặt của bạn để kết nối với cơ sở dữ liệu.

Tạo biểu mẫu ủy quyền

"."Bạn đã đăng nhập
Những thứ kia. chúng tôi đã kiểm tra phiên và có thể mở quyền truy cập vào một số dữ liệu nhất định"; ) else ( $login = ""; //kiểm tra cookie, có thể anh ấy đã truy cập vào đây if (isset($_COOKIE["CookieMy"]))( $ login = htmlspecialchars( $_COOKIE["CookieMy"]); // in biểu mẫu đơn giản<<< html

Đăng nhập
Mật khẩu
html; ) ?>

Ghi chú! Nếu đột nhiên trình phân tích cú pháp php của bạn từ chối hoạt động, tức là. Bản thân mã php được hiển thị trên màn hình của bạn, khi đó đơn giản là bạn chưa bật tính năng xử lý PHP trong tệp html. Cài đặt được thực hiện trong tệp cấu hình máy chủ web httpd.conf (nếu apache):

Ứng dụng AddType/x-httpd-php .php .html

Trong IIS, trong cửa sổ Thêm ánh xạ mô-đun, thêm *.php vào *.html, phân tách bằng dấu phẩy. Điều này xảy ra nếu bạn thực hiện việc đó ở nhà trên máy chủ web của mình và nếu bạn thực hiện tất cả những điều này tại nhà cung cấp dịch vụ lưu trữ, thì bạn sẽ phải viết thư cho họ và yêu cầu họ thực hiện những thay đổi cần thiết.

Tôi đã nhận xét mã, vì vậy tôi nghĩ mọi thứ đều rõ ràng. Một lần nữa, tôi xin nhắc bạn rằng trong tất cả các tệp có nội dung mà bạn không muốn hiển thị cho người dùng trái phép, bạn phải viết session_start, và có lẽ chỉ có vậy thôi. Nếu bạn có thắc mắc, hãy hỏi trong phần bình luận. Chúc may mắn!

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 nó trống thì hủy biến
if (empty($login) hoặc trống($password)) // nếu người dùng không 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 của bạ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!

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 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à nó 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.