การสร้างโปรแกรมประยุกต์เว็บ > ระบบการรับรองของ PHP และ MySQL
การสร้างระบบรับรองเอง
การรับรองผู้ใช้ (User Authentication) เป็นภาระหน้าที่ปกติ ดังนั้นมีสิ่งอำนวยความสะดวกการรับรองที่มากับ HTTP สคริปต์หรือแม่ข่ายเว็บสามารถขอการรับรองจาก browser โดย browser ตอบสนองสำหรับการแสดงไดอะล็อกเพื่อรับสารสนเทศจากผู้ใช้
ถึงแม้ว่า แม่ข่ายเว็บขอรายละเอียดการรับรองใหม่สำหรับทุกคำขอจากผู้ใช้ browser ไม่จำเป็นต้องขอรายละเอียดผู้ใช้สำหรับทุกเพจ โดยทั่วไป browser เก็บรายละเอียดเหล่านี้เท่าที่ browser เปิดและส่งใหม่อย่างอัตโนมัติไปยังแม่ข่ายเว็บตามความต้องการปราศจากการติดต่อกับผู้ใช้
ส่วนการทำงานนี้ของ HTTP เรียกว่าการรับรองพื้นฐาน (Basic Authentication) โดยสามารถสลับไปใช้ของ PHP หรือใช้กลไกที่มากับแม่ข่ายเว็บ
การรับรองพื้นฐานป้องกันชื่อ realm และต้องการผู้ใช้ให้ชื่อผู้ใช้และรหัสผ่าน เนื่องจาก realm เป็นชื่อดังนั้นจึงมี realm มากกว่าหนึ่งที่สามารถอยู่บนแม่ข่ายเดียวกัน ไฟล์หรือไดเรคทอรีต่างกันบนแม่ข่ายเดียวกัน สามารถเป็นส่วนของ realm ต่างกัน ซึ่งแต่ละชุดได้รับการป้องกันโดยชุดของชื่อและรหัสผ่านต่างกัน ชื่อ realm ยอมให้จัดกลุ่มหลายไดเรคทอรีบนโฮสต์หรือโฮสต์เสมือนเป็น realm และป้องกันทั้งหมดด้วย 1 รหัสผ่าน
การรับรองพื้นฐานใน PHP
สคริปต์ PHP ข้ามแพล็ตฟอร์มได้ แต่การใช้การรับรองพื้นฐานขึ้นกับตัวแปร environment ที่ตั้งค่าโดยแม่ข่าย สำหรับสคริปต์การรับรองของ HTTP ที่เรียกใช้บน Apache ที่ใช้ PHP เป็นโมดูล Apache หรือ IIS ที่ใช้ PHP เป็นโมดูล ISAPI ดังนั้นต้องสืบค้นประเภทแม่ข่าย สคริปต์ในรายการคำสั่ง 2.2.5 จะเรียกใช้ได้ทั้ง 2 แม่ข่าย
รายการคำสั่ง 2.2.5 สคริปต์ auth.php เข้าสู่การรับรองพื้นฐาน PHP
<?php
// if using IIS, it is need to set $PHP_AUTH_USER and $PHP_AUTH_PW
if (substr($SERVER_SOFTWARE, 0, 9) == "Microsoft" &&
!isset($PHP_AUTH_USER) &&
!isset($PHP_AUTH_PW) &&
substr($HTTP_AUTHORIZATION, 0, 6) == "Basic "
)
{
list($PHP_AUTH_USER, $PHP_AUTH_PW) =
explode(":", base64_decode(substr($HTTP_AUTHORIZATION, 6)));
}
// if using database query, replace this statement.
if ($PHP_AUTH_USER != "user" || $PHP_AUTH_PW != "pass")
{
header('WWW-Authenticate: Basic realm="Realm-Name"');
if (substr($SERVER_SOFTWARE, 0, 9) == "Microsoft")
header("Status: 401 Unauthorized");
else
header("HTTP/1.0 401 Unauthorized");
echo <<<EOSTR
<h1>ไม่ถูกต้อง</h1>
ท่านไม่สามารถเข้าถึงทรัพยากรภายในได้
<br/>
EOSTR;
}
else
{
// if correct user
echo <<<EOSTR
<h1>ถูกต้อง</h1>
ขอแสดงความยินดีที่สามารถมองเห็นเพจนี้<br/>
ท่านผ่านการรับรอง HTTP<br/>
EOSTR;
}
?>
|
ผู้ใช้จะมองอินเตอร์เฟซที่ต่างจากรายการคำสั่งก่อน โดยไม่ได้ให้ฟอร์ม HTML สำหรับสารสนเทศเข้าระบบ browser จะให้ไดอะล็อก ตามภาพ 2.2.5 เป็นไดอะล็อกของ Internet Explorer
ภาพ 2.2.5 ไดอะล๊อกเมื่อใช้การรับรอง HTTP
ในรายการคำสั่งก่อนหน้านี้สามารถรวมคำสั่งนี้ในเพจที่ต้องการป้องกันได้
การรับรองพื้นฐานกับไฟล์ .htaccess ของ Apache
ผลลัพธ์เหมือนกับสคริปต์ก่อนหน้านี้สามารถทำได้โดยปราศจากการเขียนสคริปต์ PHP
แม่ข่าย Apache เก็บโมดูลการรับรองหลายโมดูลที่สามารถใช้ตัดสินความถูกต้องของข้อมูลป้อนเข้าโดยผู้ใช้ การใช้ง่ายที่สุดคือ mod_auth ซึ่งเปรียบเทียบคู่ชื่อและรหัสผ่านกับบรรทัดในไฟล์ข้อความบนแม่ข่าย
ในการรับผลลัพธ์เหมือนกับสคริปต์ก่อนต้องสร้างไฟล์ HTML 2 ไฟล์ ไฟล์หนึ่งสำหรับเก็บข้อมูลและอีกไฟล์เป็นเพจปฏิเสธ ตัวอย่าง accept.html เก็บข้อมูล และ denied.html เป็นเพจปฏิเสธ
รายการคำสั่ง 2.2.6 ไฟล์ .htaccess สำหรับการสร้างคอนฟิกกับ Apache
ErrorDocument 401 /chapter15/denied.html
AuthUserFile /home/book/.htpass
AuthGroupFile /dev/null
AuthName "Realm-Name"
AuthType Basic
require valid-user |
รายการคำสั่ง 2.2.6 คือ ไฟล์ .htaccess เพื่อเปิดการรับรองพื้นฐานในไดเรคทอรี การตั้งค่าหลายค่าได้รับการทำในไฟล์ .htaccess แต่ 6 บรรทัดในตัวอย่างนี้สัมพันธ์กับการรับรอง บรรทัดแรก
EnrorDocument 401 /chapter15/denied.html
คำสั่ง Error Document สามารถใช้ให้เพจของตัวเองสำหรับความผิดพลาด HTTP อื่น
ErrorDocument error_number URL
สำหรับเพจควบคุมความผิดพลาด 401 มีความสำคัญคือ URL ที่ให้
AuthUserFile /home/book/.htpass
บอก Apache ถึงที่ค้นหาไฟล์เก็บรหัสผ่านของผู้ใช้ ตามปกติชื่อว่า .htpass แต่สามารถให้ชื่อตามต้องการ
การระบุเฉพาะผู้ใช้ที่ถูกต้องผู้อยู่กลุ่มการเข้าถึงทรัพยากรจึงไม่มีการเลือก บรรทัดนี้ คือ
AuthGroupFile/dev/null
ตั้งค่า AuthGeoupFile ชี้ไปที่ /dev/null ไฟล์พิเศษบนระบบ UNIX ที่ประกันว่าเป็นค่าว่าง
การรับรอง HTTP เหมือนกับ PHP คือ ต้องตั้งชื่อ realm ดังนี้
AuthName "Realm Name"
เนื่องจากวิธีการรับรองมีหลายวิธีดังนั้นต้องระบุวิธีการรับรองที่ใช้ ในตัวอย่างนี้ใช้การรับรองแบบ Basic
AuthType Basic
การระบุว่าผู้ใดได้รับอนุญาตให้เข้าถึง โดยสามารถระบุผู้ใช้ กลุ่มเฉพาะหรืออื่นๆ เพื่อยอมให้เข้าถึง
Require valid user
การรับรองพื้นฐานด้วย IIS
IIS สนับสนุนการรับรอง HTTP เหมือน Apache โดย Apache ใช้วิธี UNIX และควบคุมการแก้ไขไฟล์ข้อความและ IIS ตั้งค่าด้วยการเลือกตัวเลือกในไดอะล็อก
ใน Windows 2000 และต่อมา การเปลี่ยนคอนฟิกของ Internet Information Server 5 (IIS5) ใช้ Internet Service Manager ส่วนการทำงานนี้หาได้โดยเลือก Administrative tools ใน Control Panel
Internet Services Manager ดูเหมือนภาพ 2.2.6 โครงสร้างควบคุมบนด้านซ้ายแสดงชื่อเครื่องแม่ข่าย windows และกำลังเรียกใช้บริการอยู่ บริการหนึ่งที่สนใจในเว็บ ภายในเว็บนี้มีไดเรคทอรีชื่อ personal ภายในไดเรคทอรีคือไฟล์ชื่อ accept.html
ภาพ 2.2.6 การตั้งค่าคอนฟิกไดเรคทอรี personal บน IIS
การเพิ่มการรับรองพื้นฐานกับไดเรคทอรี personal คลิกเมาส์ปุ่มขวาและเลือก properties จากเมนู
ไดอะล็อก Properties ยอมให้ทำการเปลี่ยนการตั้งค่าสำหรับไดเรคทอรีนี้ 2 แท็บที่สนใจคือ Directory Security และ Custom Errors ตัวเลือกหนึ่งบนแท็บ Directory Security คือ Authentication Control และ Anonymous Access คลิกปุ่ม Edit นี้จะแสดงไดอะล็อก
ภายในไดอะล็อกนี้ สามารถยกเลิกการเข้าถึงแบบปิดบังชื่อ และเปิดการรับรองพื้นฐาน ด้วยการตั้งค่าตามการแสดงในภาพ 2.2.6 เฉพาะบุคคลผู้ให้ชื่อและรหัสผ่านถูกต้องสามารถดูไฟล์ต่างๆ ในไดเรคทอรีนี้
ในการคัดลอกพฤติกรรมของตัวอย่างก่อน จะต้องให้เพจบอกกับผู้ใช้ถึงรายละเอียดการรับรองไม่ถูกต้องปิดไดอะล็อกวิธีการรับรองจะยอมให้เลือกแท็บ Custom Errors
แท็บ Custom Errors ตามภาพ 2.2.7 ความผิดพลาดที่เกี่ยวข้องด้วยข่าวสารความผิดพลาด ที่นี่มีการเก็บไฟล์ปฏิเสธเดียวกันที่ใช้ก่อนหน้านี้ คือ denied.html ตามรายการคำสั่ง 2.2.6 IIS มีความสามารถให้ข่าวสารความผิดพลาดพิเศษมากกว่า Apache เพื่อให้เหตุผลถึงสาเหตุการเกิดขึ้นของรหัสความผิดพลาด HTTP สำหรับความผิดพลาด 401 ซึ่งแสดงการรับรองล้มเหลว IIS ให้ได้ 5 เหตุผล และให้ข่าวสารของแต่ละความผิดพลาดแต่เลือกเพียง 2 เหตุผลที่กำลังเกิดขึ้นในตัวอย่างนี้ด้วยเพจปฏิเสธ
ภาพ 2.2.7 การคอนฟิกไฟล์ปฏิเสธ
|