เมื่อผู้ใช้ออกแบบและบำรุงรักษาไซต์ พวกเขามักจะจำเป็นต้องจำกัดการเข้าถึงไฟล์หรือข้อมูลสำคัญบางอย่าง โดยปกติแล้ว เราสามารถใช้กลไกการตรวจสอบสิทธิ์ผู้ใช้ตามโปรโตคอล HTTP ที่สร้างไว้ในเว็บเซิร์ฟเวอร์ เมื่อผู้เยี่ยมชมเรียกดูเพจที่มีการป้องกัน เบราว์เซอร์ไคลเอนต์จะปรากฏขึ้นหน้าต่างโต้ตอบเพื่อขอให้ผู้ใช้ป้อนชื่อผู้ใช้และรหัสผ่านเพื่อตรวจสอบตัวตนของผู้ใช้ เพื่อพิจารณาว่าผู้ใช้มีสิทธิ์เข้าถึงเพจหรือไม่ มีการใช้สองวิธีเพื่อแสดงหลักการดำเนินการ
1. ใช้ส่วนหัว HTTP เพื่อใช้
ส่วนหัว ส่วนหัวคือสตริงที่เซิร์ฟเวอร์ส่งก่อนที่จะส่งข้อมูล HTML ไปยังเบราว์เซอร์โดยใช้โปรโตคอล HTTP HTTP ใช้โมเดลการท้าทาย/การตอบกลับเพื่อตรวจสอบสิทธิ์ผู้ใช้ที่พยายามเข้าสู่พื้นที่ที่มีการป้องกันด้วยรหัสผ่าน โดยเฉพาะอย่างยิ่ง เมื่อผู้ใช้ส่งคำขอไปยังเซิร์ฟเวอร์เว็บเพื่อเข้าถึงพื้นที่ที่ได้รับการป้องกันเป็นครั้งแรก กระบวนการท้าทายจะเริ่มต้นขึ้น และเซิร์ฟเวอร์จะส่งคืนส่วนหัว 401 พิเศษ ซึ่งบ่งชี้ว่าข้อมูลประจำตัวของผู้ใช้ยังไม่ได้รับการตรวจสอบ หลังจากตรวจพบการตอบสนองข้างต้น เบราว์เซอร์ไคลเอ็นต์จะแสดงกล่องโต้ตอบขึ้นมาโดยอัตโนมัติเพื่อขอให้ผู้ใช้ป้อนชื่อผู้ใช้และรหัสผ่าน หลังจากที่ผู้ใช้ป้อนข้อมูลเสร็จแล้วและคลิกตกลง ข้อมูลการระบุตัวตนจะถูกส่งไปยังเซิร์ฟเวอร์เพื่อตรวจสอบ หากชื่อผู้ใช้และรหัสผ่านที่ผู้ใช้ป้อนนั้นถูกต้อง เว็บเซิร์ฟเวอร์จะอนุญาตให้ผู้ใช้เข้าสู่พื้นที่ที่ได้รับการป้องกันและรักษาความถูกต้องของข้อมูลระบุตัวตนตลอดกระบวนการเข้าถึง ในทางตรงกันข้าม หากชื่อผู้ใช้หรือรหัสผ่านที่ผู้ใช้ป้อนไม่สามารถตรวจสอบได้ เบราว์เซอร์ไคลเอนต์จะแสดงหน้าต่างป้อนข้อมูลอย่างต่อเนื่องเพื่อขอให้ผู้ใช้ลองป้อนข้อมูลที่ถูกต้องอีกครั้ง กระบวนการทั้งหมดจะดำเนินต่อไปจนกว่าผู้ใช้จะระบุตำแหน่งข้อมูลที่ถูกต้อง คุณยังสามารถกำหนดจำนวนครั้งสูงสุดที่ผู้ใช้จะได้รับอนุญาตให้ทำได้ เมื่อเกินขีดจำกัด คำขอเข้าถึงของผู้ใช้จะถูกปฏิเสธโดยอัตโนมัติ
ในสคริปต์ PHP ให้ใช้ฟังก์ชัน header() เพื่อส่งส่วนหัว HTTP ไปยังเบราว์เซอร์ของไคลเอนต์โดยตรง เพื่อให้หน้าต่างป้อนชื่อผู้ใช้และรหัสผ่านจะปรากฏขึ้นบนไคลเอนต์โดยอัตโนมัติเพื่อใช้ฟังก์ชันการตรวจสอบตัวตนของเรา ใน PHP ข้อมูลที่ผู้ใช้ไคลเอนต์ป้อนจะถูกบันทึกโดยอัตโนมัติในตัวแปรส่วนกลางสามตัวแปร $PHP_AUTH_USER, $PHP_AUTH_PW และ $PHP_AUTH_TYPE หลังจากที่ถูกส่งไปยังเซิร์ฟเวอร์ การใช้ตัวแปรทั้งสามนี้ทำให้เราสามารถตรวจสอบตัวตนของผู้ใช้ตามข้อมูลบัญชีผู้ใช้ที่จัดเก็บไว้ในไฟล์ข้อมูลหรือฐานข้อมูลได้
อย่างไรก็ตาม ผู้ใช้จำเป็นต้องได้รับการเตือนว่า $PHP_AUTH_USER และ $PHP_AUTH_PW สามารถใช้ได้เฉพาะใน PHP ที่ติดตั้งเป็นโมดูลเท่านั้น และตัวแปรทั้งสามตัว $PHP_AUTH_TYPE หากผู้ใช้ใช้ PHP ในโหมด CGI ฟังก์ชันการตรวจสอบจะไม่สามารถใช้งานได้ วิธีการติดตั้งโมดูลของ PHP แนบอยู่ที่ส่วนท้ายของส่วนนี้
ด้านล่างเราใช้ฐานข้อมูล Mysql เพื่อเก็บข้อมูลประจำตัวของผู้ใช้ เราจำเป็นต้องแยกชื่อผู้ใช้และรหัสผ่านของแต่ละบัญชีออกจากฐานข้อมูลเพื่อเปรียบเทียบกับตัวแปร $PHP_AUTH_USER และ $PHP_AUTH_PW เพื่อกำหนดความถูกต้องของผู้ใช้
ขั้นแรก ให้สร้างฐานข้อมูลใน MySql เพื่อเก็บข้อมูลผู้ใช้
ชื่อฐานข้อมูลคือ XinXiKu และชื่อตารางคือผู้ใช้ โดยมีคำจำกัดความของตารางดังนี้
สร้างผู้ใช้ตาราง (
ID INT (4) ไม่เป็นโมฆะ AUTO_INCREMENT
ชื่อ VARCHAR (8) ไม่เป็นโมฆะ
รหัสผ่าน CHAR (8) ไม่เป็นโมฆะ
คีย์หลัก (ID)
)
คำอธิบาย:
1. ID คือหมายเลขซีเรียลซึ่งไม่เป็นศูนย์และจะเพิ่มขึ้นโดยอัตโนมัติ
2. ชื่อคือชื่อผู้ใช้และต้องไม่เว้นว่าง
3. รหัสผ่านคือรหัสผ่านผู้ใช้และต้องไม่เว้นว่างไว้
ต่อไปนี้คือการเข้าสู่ระบบไฟล์การตรวจสอบผู้ใช้ php
// ตรวจสอบว่าชื่อผู้ใช้ถูกตั้งค่าหรือไม่
ถ้า(!isset($PHP_AUTH_USER)) {
header("WWW-Authenticate:Basic realm="ฟังก์ชันการตรวจสอบสิทธิ์"");
header("HTTP/1.0 401 ไม่ได้รับอนุญาต");
echo "การตรวจสอบสิทธิ์ล้มเหลว คุณไม่ได้รับอนุญาตให้แชร์ทรัพยากรเครือข่าย!";
ออก();
-
/*เชื่อมต่อกับฐานข้อมูล*/
$db=mysql_connect("localhost", "root", "");
//เลือกฐานข้อมูล
mysql_select_db("XinXiKu",$db);
//ตรวจสอบว่ามีผู้ใช้อยู่หรือไม่
$result=mysql_query("SELECT * FROM user โดยที่ name='$PHP_AUTH_USER' และรหัสผ่าน='$PHP_AUTH_PW'",$db);
ถ้า ($myrow = mysql_fetch_row($result)) {
//ต่อไปนี้เป็นการดำเนินการที่เกี่ยวข้องหลังจากการรับรองความถูกต้องสำเร็จ
-
} อื่น {
//การตรวจสอบสิทธิ์ไม่สำเร็จ โปรดแจ้งให้ผู้ใช้กลับเข้ามาใหม่
header("WWW-Authenticate:Basic realm="ฟังก์ชันการตรวจสอบสิทธิ์"");
header("HTTP/1.0 401 ไม่ได้รับอนุญาต");
echo "การตรวจสอบสิทธิ์ล้มเหลว คุณไม่ได้รับอนุญาตให้แชร์ทรัพยากรเครือข่าย!";
ออก();
-
?>
คำอธิบายโปรแกรม:
ในโปรแกรม ให้ตรวจสอบก่อนว่าตัวแปร $PHP_AUTH_USER ได้ถูกตั้งค่าไว้หรือไม่ หากไม่ได้ตั้งค่าไว้ แสดงว่าจำเป็นต้องมีการตรวจสอบสิทธิ์ สคริปต์จะส่งส่วนหัวหมายเลขข้อผิดพลาด HTTP 401 เพื่อบอกเบราว์เซอร์ของไคลเอ็นต์ว่าจำเป็นต้องมีการตรวจสอบสิทธิ์ เบราว์เซอร์ของไคลเอ็นต์จะเปิดหน้าต่างการตรวจสอบสิทธิ์ขึ้นมา โดยแจ้งให้ผู้ใช้ป้อนชื่อผู้ใช้และ รหัสผ่าน หลังจากป้อนข้อมูลเสร็จแล้วให้เชื่อมต่อฐานข้อมูลตรวจสอบว่าชื่อผู้ใช้และรหัสผ่านถูกต้องหรือไม่หากถูกต้องให้เข้าสู่ระบบเพื่อดำเนินการที่เกี่ยวข้อง
คำอธิบายฟังก์ชัน:
1. isset(): ใช้เพื่อกำหนดว่าตัวแปรได้รับการกำหนดให้มีค่าหรือไม่ ขึ้นอยู่กับว่ามีค่าตัวแปรอยู่หรือไม่ ให้คืนค่าจริงหรือเท็จ
2. header(): ใช้เพื่อส่งส่วนหัว HTTP เฉพาะ โปรดทราบว่าเมื่อใช้ฟังก์ชัน header() อย่าลืมเรียกฟังก์ชันนั้นก่อนโค้ด HTML หรือ PHP ใดๆ ที่สร้างเอาต์พุตจริง
3. mysql_connect(): เปิดการเชื่อมต่อเซิร์ฟเวอร์ MySQL
4. mysql_db_query(): ส่งสตริงการสืบค้น (query) ไปยังฐานข้อมูล MySQL
5. mysql_fetch_row(): ส่งคืนแต่ละฟิลด์ของคอลัมน์เดียว
2. ใช้เซสชันเพื่อใช้การตรวจสอบเซิร์ฟเวอร์
สำหรับเพจที่ต้องมีการรับรองความถูกต้อง วิธีที่ดีที่สุดคือใช้การตรวจสอบเซิร์ฟเวอร์ apache อย่างไรก็ตาม อินเทอร์เฟซของการตรวจสอบเซิร์ฟเวอร์ apache นั้นไม่เป็นมิตรเพียงพอ นอกจากนี้ PHP ในโหมด CGI และ PHP ภายใต้ IIS ไม่สามารถตรวจสอบได้โดยใช้เซิร์ฟเวอร์ Apache ด้วยวิธีนี้ เราสามารถใช้เซสชันเพื่อบันทึกข้อมูลระบุตัวตนของผู้ใช้ระหว่างเพจต่างๆ เพื่อยืนยันตัวตนได้
ที่แบ็กเอนด์ เรายังใช้ฐานข้อมูล Mysql ด้านบนเพื่อจัดเก็บข้อมูลผู้ใช้
ขั้นแรกเราเขียนอินเทอร์เฟซการเข้าสู่ระบบของผู้ใช้ ชื่อไฟล์คือ login.php รหัสคือ:
________________________________________________________________
<form action="login1.php">
ชื่อผู้ใช้:<input type="text" name="name"><br>
รหัสผ่าน :<input type="text" name="pass"><br>
<input type="submit" value="Login">
</form>
____________________________________________________________
login1.php ประมวลผลแบบฟอร์มที่ส่ง รหัสจะเป็นดังนี้:
$ db=mysql_connect ("localhost", "root", "");
mysql_select_db("XinXiKu",$db);
$result=mysql_query("SELECT * FROM user โดยที่ name='$name' และรหัสผ่าน='$pass'",$db);
ถ้า ($myrow = mysql_fetch_row($result)) {
//ลงทะเบียนผู้ใช้
session_start();
session_register("ผู้ใช้");
$user=$myrow["ผู้ใช้"];
// การยืนยันตัวตนสำเร็จ ดำเนินการที่เกี่ยวข้อง
-
} อื่น {
echo "การตรวจสอบสิทธิ์ล้มเหลว คุณไม่ได้รับอนุญาตให้แชร์ทรัพยากรเครือข่าย!";
-
-
ควรสังเกตไว้ที่นี่ว่าผู้ใช้สามารถใช้ **http://domainname/next.php?user=username** ในการดำเนินการภายหลังเพื่อเลี่ยงผ่านการรับรองความถูกต้อง ดังนั้น การดำเนินการในภายหลังควรตรวจสอบก่อนว่ามีการลงทะเบียนตัวแปรหรือไม่ หากลงทะเบียนแล้ว ให้ดำเนินการที่เกี่ยวข้อง ไม่เช่นนั้นจะถือเป็นการเข้าสู่ระบบที่ผิดกฎหมาย รหัสที่เกี่ยวข้องมีดังนี้:
session_start();
ถ้า (!session_is_registered("ผู้ใช้")){
echo "การตรวจสอบสิทธิ์ล้มเหลว การเข้าสู่ระบบไม่ถูกต้อง!";
} อื่น {
// เข้าสู่ระบบสำเร็จเพื่อดำเนินการที่เกี่ยวข้อง
-
-
?>
ภาคผนวก: วิธีการติดตั้ง PHP ในโหมดโมดูล
1. ดาวน์โหลดไฟล์ก่อน: mod_php4-4.0.1-pl2. [หากคุณไม่ใช่ PHP4 ให้อัปเกรดโดยเร็วที่สุด!]
หลังจากแตกไฟล์แล้ว จะมีไฟล์อยู่สามไฟล์: mod_php4.dll, mod_php4.conf, readme.txt
2. คัดลอกไฟล์ที่เกี่ยวข้อง คัดลอก
mod_php4.dll ไปยังไดเร็กทอรีโมดูลของ
คัดลอก mod_php4.conf ไปยังไดเรกทอรีการติดตั้ง apache
คัด
ลอกไฟล์ msvcrt.dll ไปยังไดเรกทอรีการติดตั้ง apache
3. เปิดไฟล์ conf/srm.conf และเพิ่มประโยค
รวม conf/mod_php4.conf
ก่อนหน้านี้ โปรดลบคำสั่งการตั้งค่าทั้งหมดเกี่ยวกับ
โหมด CGI ใน httpd.conf ของคุณ นั่นคือส่วนที่คล้ายกับข้อความต่อไปนี้!
แอปพลิเคชัน AddType/x-httpd-php4 .php
แอปพลิเคชัน AddType/x-httpd-php4 .php3
แอปพลิเคชัน AddType/x-httpd-php4 .php4
Action application/x-httpd-php4 /php4/php.exe
หากคุณต้องการให้ PHP รองรับส่วนต่อท้ายมากขึ้น ก็ไม่มีปัญหา ไฟล์การกำหนดค่าที่กำหนด mod_php4.conf รองรับส่วนต่อท้ายสามรายการแล้ว: php, php3 และ php4 หากคุณต้องการรองรับส่วนต่อท้ายเพิ่มเติม คุณสามารถเปลี่ยนไฟล์นี้ได้ง่ายมาก
4.
ใช้ <? phpinfo(); ?> เพื่อทดสอบ คุณจะเห็นว่าค่าของ Server API คือ apache ไม่ใช่ cgi และยังมีข้อมูลเกี่ยวกับข้อมูลส่วนหัว HTTP ด้วย