โปรดทราบว่าโครงการนี้ไม่ได้รับการบำรุงรักษาอีกต่อไป
โปรเจ็กต์นี้เริ่มต้นจากการมอบหมายงานง่ายๆ ในโรงเรียนสำหรับหลักสูตร PHP บางหลักสูตรที่ฉันเข้าร่วม จากนั้นฉันก็ต้องการระบบประเภทนี้สำหรับบางเว็บไซต์ที่ฉันกำลังสร้างและตัดสินใจที่จะเริ่มขยาย คำเตือน: โครงการนี้มี/จะมีความคิดเห็นมากเกินไป ซึ่งหมายความว่าฉันจะเพิ่มฟีเจอร์ที่ฉันพบว่ามีประโยชน์หรือน่าสนใจพอที่จะพัฒนาเท่านั้น
password_hash()
ของ PHP เพื่อแฮชและเกลือรหัสผ่าน ชื่อผู้ใช้จะถูกบันทึกเป็นข้อความธรรมดาPASSWORD_DEFAULT
ซึ่งในขณะที่เขียนใช้ BCRYPTAKA 'ทำไมจึงมีไฟล์จำนวนมาก?'
แผงผู้ดูแลระบบจะอยู่ที่นี่ เช่นเดียวกับเว็บแอปพลิเคชันอื่นๆ (เช่น WordPress) คุณสามารถเข้าถึงแผงผู้ดูแลระบบได้อย่างง่ายดายโดยพิมพ์ [host]/admin
โฟลเดอร์นี้ประกอบด้วยไฟล์สองไฟล์ที่ใช้ในการตั้งค่าตัวเลือกการกำหนดค่าบางอย่าง ข้อมูลเพิ่มเติมด้านล่าง
เป็นเพียงสารพัด CSS สำหรับ UI
ตัวติดตั้งอัตโนมัติอยู่ที่นี่
โฟลเดอร์นี้มีไฟล์ .js ทั้งหมดที่จำเป็นสำหรับส่วนต่อประสานผู้ใช้ในการทำงาน
โฟลเดอร์นี้รวมถึงกระดูกสันหลังของระบบ มีไฟล์ .php สำหรับเชื่อมต่อกับฐานข้อมูล ล็อกอินเข้าออก ลงทะเบียน/สร้างบัญชีใหม่ และแก้ไขบัญชีที่มีอยู่ นอกจากนี้ยังมี scripts.js ที่มีสารพัด JavaScript ทั่วไปสำหรับอินเทอร์เฟซผู้ใช้ คุณต้องแทรกข้อมูลฐานข้อมูลของคุณไปที่ credentials.php ตรวจสอบส่วนการตั้งค่าด้านล่างเพื่อรับความช่วยเหลือ
คุณควรอ่านสิ่งนี้ก่อนที่จะใช้สิ่งนี้ มันเป็นเพียงใบอนุญาต MIT ปกติเท่านั้น
ไฟล์นี้.
นี่คือหน้าการจัดการบัญชี ผู้ใช้สามารถเปลี่ยนชื่อผู้ใช้และรหัสผ่านได้ที่นี่
ไฟล์นี้อยู่ที่นี่เพื่อการสาธิตเท่านั้น ผู้ใช้สามารถเข้าถึงหน้านี้ได้เฉพาะเมื่อเข้าสู่ระบบแล้วเท่านั้น มิฉะนั้น พวกเขาจะถูกเปลี่ยนเส้นทางไปยังหน้าเข้าสู่ระบบ
ฉันใช้เวลาในการสร้างแบบฟอร์มเข้าสู่ระบบอย่างง่ายด้วย Bootstrap อย่าลังเลที่จะปรับเปลี่ยนให้เหมาะกับความต้องการของคุณ
ฉันใช้เวลาในการสร้างแบบฟอร์มลงทะเบียนง่ายๆ ด้วย Bootstrap อย่าลังเลที่จะปรับเปลี่ยนให้เหมาะกับความต้องการของคุณ
โปรแกรมติดตั้งอัตโนมัติใช้เพื่อลบตัวเองออกหลังจากการติดตั้งเสร็จสมบูรณ์
นี่คือรายการคำศัพท์ภาษาอังกฤษที่ใช้บ่อยที่สุด มันถูกใช้โดยผู้แนะนำชื่อผู้ใช้ คุณสามารถแทนที่รายการด้วยไฟล์ .txt ของคุณเองได้ ทุกคำในรายการจะต้องตามด้วยการขึ้นบรรทัดใหม่
โปรดทราบว่าตัวเลือกการกำหนดค่าอาจมีการเปลี่ยนแปลง กลับมาตรวจสอบบ่อยๆ
หากคุณตรวจสอบโฟลเดอร์ /config คุณจะสังเกตเห็นว่ามีไฟล์ที่แตกต่างกันสองไฟล์ ให้อะไร? ไฟล์การกำหนดค่าหลักคือ config.php รวมถึงการตั้งค่าที่บังคับใช้ในระดับเซิร์ฟเวอร์ คุณควรจะแก้ไขไฟล์นี้เป็นหลัก
หากคุณใช้อินเทอร์เฟซผู้ใช้ส่วนหน้าที่ฉันให้มาด้วย คุณสามารถ/ต้องแก้ไข config.js ที่นั่น คุณสามารถจัดการลักษณะของสิ่งต่าง ๆ สำหรับผู้ใช้ทั่วไปได้ โปรดจำไว้ว่าการตั้งค่าเหล่านี้เป็นการตั้งค่าฝั่งไคลเอ็นต์เท่านั้น และ ไม่ได้ บังคับใช้ในทางใดทางหนึ่ง ดังนั้นผู้ใช้จึงสามารถแก้ไขได้
ชื่อตัวเลือก | คำอธิบาย | ค่าเริ่มต้น | ค่าที่รองรับ |
---|---|---|---|
$disableUserSelfRegistration | ป้องกันไม่ให้ผู้ใช้ลงทะเบียน | เท็จ | บูลีน |
$usernameMinLength | ชื่อผู้ใช้ที่สั้นที่สุดที่อนุญาต | 3 | 1 -> |
$usernameMaxLength | ชื่อผู้ใช้ที่อนุญาตนานที่สุด | 30 | 1 -> |
$passwordMinLength | ความยาวขั้นต่ำของรหัสผ่าน | 8 | 1 -> |
$usernameRegExp | ชื่อผู้ใช้ทั้งหมดจะต้องตรงกับนิพจน์ทั่วไปนี้ | regExp ใด ๆ | |
$passwordRegExp | รหัสผ่านทั้งหมดจะต้องตรงกับนิพจน์ทั่วไปนี้ | regExp ใด ๆ | |
$ใหม่ระดับการเข้าถึงบัญชี | มีประโยชน์สำหรับการสร้างบัญชีผู้ดูแลระบบบัญชีแรกของคุณ | "ผู้ใช้" | "ผู้ใช้", "ผู้ดูแลระบบ" |
$debugMode | ช่วยให้คุณสามารถปิดการใช้งานการเชื่อมต่อ dabase (สำหรับการดีบักเท่านั้น) | "เลขที่" | "เลขที่" |
$debugAdminUsername | อนุญาตให้คุณเข้าสู่ระบบขณะอยู่ในโหมดแก้ไขข้อบกพร่อง | "ผู้ดูแลระบบ" | สตริงใดก็ได้ |
$debugAdminPassword | อนุญาตให้คุณเข้าสู่ระบบขณะอยู่ในโหมดแก้ไขข้อบกพร่อง | - | สตริงใดก็ได้ |
$debugSkipInstall | นี่มีวัตถุประสงค์เพื่อการแก้ไขข้อบกพร่องเท่านั้น | เท็จ | เท็จ |
$หมดเวลา | เวลาที่ไม่มีการใช้งาน (เป็นวินาที) ที่จำเป็นในการออกจากระบบผู้ใช้ | 900 | จำนวนเต็มใดๆ |
$adminPanelTimeout | เวลาที่ไม่มีกิจกรรมที่จำเป็นในการออกจากระบบผู้ใช้ออกจากแผงผู้ดูแลระบบ | 450 | จำนวนเต็มใดๆ |
$errorMessages | แสดงข้อความแสดงข้อผิดพลาดโดยละเอียดเพิ่มเติม อาจทำให้ข้อมูลที่ละเอียดอ่อนรั่วไหล! | ค่าเริ่มต้น | "ค่าเริ่มต้น", "รายละเอียด" |
$allowUsernameChange | หากผู้ใช้สามารถเปลี่ยนชื่อผู้ใช้ของตนได้ | จริง | บูลีน |
$forceHTTPS | เปลี่ยนเส้นทางการเชื่อมต่อที่ไม่ใช่ HTTPS ทั้งหมดไปยัง HTTPS และส่ง HSTS | เท็จ | บูลีน |
ในปี 2019 การไม่ใช้ HTTPS เมื่อจัดการกับข้อมูลที่ละเอียดอ่อนใดๆ (เช่น รหัสผ่าน) ถือเป็นความเสี่ยงด้านความปลอดภัยอย่างมาก ด้วยเหตุนี้จึงขอแนะนำอย่างยิ่งให้ใช้เฉพาะโซลูชันโฮสติ้งที่รองรับเท่านั้น และเปลี่ยนตัวเลือกนี้ให้เป็นจริง ทุกวันนี้ คุณสามารถรับใบรับรอง SSL ได้ฟรีจาก Let's Encrypt ดังนั้นจึงไม่มีเหตุผลที่จะไม่ใช้มัน อย่างไรก็ตาม ในบางสภาพแวดล้อม (กำหนดค่าไม่ถูกต้อง) SERVER["HTTPS"] superglobal ไม่ได้ถูกกำหนดไว้ แม้ว่าจะใช้ HTTPS จริงก็ตาม นั่นส่งผลให้เกิดการเปลี่ยนเส้นทางอย่างไม่มีที่สิ้นสุด ฉันเองก็ได้เรียนรู้ว่าวิธีที่ยาก
ชื่อตัวเลือก | คำอธิบาย | ค่าเริ่มต้น | ค่าที่รองรับ |
---|---|---|---|
ปิดการใช้งาน UserSelfRegistration | ปิดการใช้งานองค์ประกอบ UI ใด ๆ ที่เกี่ยวข้องกับการลงทะเบียน | เท็จ | จริงเท็จ |
ชื่อผู้ใช้MinLength | ชื่อผู้ใช้ที่สั้นที่สุดที่ UI ยอมรับ | 3 | 1 -> |
ชื่อผู้ใช้MaxLength | ชื่อผู้ใช้ที่ยาวที่สุดที่ UI ยอมรับ | 30 | 1 -> |
รหัสผ่านMinLength | รหัสผ่านที่สั้นที่สุดที่ UI ยอมรับ | 8 | 1 -> |
ชื่อผู้ใช้กฎ | สตริงนี้จะแสดงขึ้นหากชื่อผู้ใช้ไม่ตรงกับ regExp | สตริงใดก็ได้ | |
รหัสผ่านกฎ | สตริงนี้จะแสดงขึ้นหากรหัสผ่านไม่ตรงกับ regExp | สตริงใดก็ได้ | |
เปิดใช้งานข้อเสนอแนะชื่อผู้ใช้ | ช่วยให้คุณสามารถปิดการใช้งานหรือเปิดใช้งานข้อเสนอแนะชื่อผู้ใช้ | จริง | บูลีน |
อนุญาตให้เปลี่ยนชื่อผู้ใช้ | ผู้ใช้สามารถเปลี่ยนชื่อผู้ใช้ได้หรือไม่ (เฉพาะ UI) | จริง | บูลีน |
เปิดใช้งานข้อความเข้าสู่ระบบ | แสดงข้อความใด ๆ ในหน้าเข้าสู่ระบบ | เท็จ | บูลีน |
ข้อความเข้าสู่ระบบ | กำหนดข้อความที่จะแสดงเมื่อเปิดใช้งานLoginMessage เป็นจริง | - | สตริงใดก็ได้ |
ตามที่ระบุไว้ข้างต้น คุณจะต้องมีฐานข้อมูล MySQL ฐานข้อมูลไม่ต้องการพื้นที่มากนัก (เว้นแต่คุณจะมีผู้ใช้จำนวนมาก) และ MySQl เวอร์ชันล่าสุดควรใช้งานได้ คุณสามารถตั้งค่าฐานข้อมูลและสร้างบัญชีผู้ดูแลระบบด้วยตนเอง หรือคุณสามารถใช้โปรแกรมติดตั้งอัตโนมัติของฉันก็ได้
ในระหว่างขั้นตอนแรกของการติดตั้ง โปรแกรมติดตั้งจำเป็นต้องเขียนไฟล์ลงในไดรฟ์ของโฮสต์ของคุณ หากคุณไม่มีสิทธิ์ที่เหมาะสม คุณต้องทำการติดตั้งด้วยตนเอง ดูคำแนะนำด้านล่าง
users
ตารางด้วยห้าคอลัมน์: username
, password
, accessLevel
, lastLogin
และ rememberMeToken
ใช้ชนิดข้อมูลสตริงเช่น CHAR โดยส่วนตัวแล้วฉันชอบใช้ VARCHAR สำหรับ lastLogin
ฉันขอแนะนำ INT(11) ฉันจะเพิ่มฟิลด์รหัสที่เพิ่มขึ้นอัตโนมัติเป็นคีย์หลักด้วย แต่นั่นไม่จำเป็นอย่างเคร่งครัดหากคุณใช้ VARCHAR หรือประเภทข้อมูลอื่นที่มีความยาวสตริงสูงสุดแตกต่างกัน ตารางด้านล่างจะมีประโยชน์
สนาม | ความยาวที่ต้องการ (ขั้นต่ำ) |
---|---|
ชื่อผู้ใช้ | เหมือนกับ $usernameMaxLength ใน config.php |
รหัสผ่าน | ฉันแนะนำให้ใช้ 255 เพื่อความปลอดภัย (เนื่องจากวิธีการเข้ารหัสเริ่มต้นของ PHP อาจมีการเปลี่ยนแปลง) |
ระดับการเข้าถึง | 5 |
เข้าสู่ระบบครั้งล่าสุด | 11 |
จำ MeToken | 255 |
ไม่ต้องกังวล บางสิ่งเช่นนี้ควรช่วยคุณได้:
CREATE TABLE IF NOT EXISTS users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR ( 64 ) NOT NULL UNIQUE,
password VARCHAR ( 255 ) NOT NULL ,
accessLevel VARCHAR ( 10 ) NOT NULL ,
lastLogin INT ( 11 ),
rememberMeToken VARCHAR ( 255 )
);
หลังจากตั้งค่าฐานข้อมูลแล้ว คุณจะต้องสร้างบัญชีผู้ดูแลระบบบัญชีแรก มีสองวิธีในการทำเช่นนั้น:
admin
ระบบ และรหัสผ่านที่สร้างแบบสุ่ม (หากคุณทำตามตัวอย่าง SQL ของฉันด้านบนและตั้งค่าข้อจำกัด UNIQUE ให้กับฟิลด์ชื่อผู้ใช้ บัญชีจะไม่ถูกสร้างขึ้นหากมีอยู่แล้ว คุณจะไม่ได้รับข้อความแสดงข้อผิดพลาด) หลังจากที่คุณสร้างบัญชีผู้ดูแลระบบแล้ว คุณต้องลบออก (หรือเปลี่ยนชื่อ) โฟลเดอร์ /install สุดท้าย เข้าสู่ระบบบัญชีที่สร้างขึ้นใหม่และเปลี่ยนรหัสผ่านโดยใช้หน้าการจัดการบัญชีหรือ
$newAccountAccessLevel
ใน config/config.php เป็น "admin" ได้ชั่วคราว จากนั้นสร้างบัญชีใหม่โดยใช้แบบฟอร์มการลงทะเบียนปกติ คุณต้องลบโฟลเดอร์ /install ออกจึงจะสามารถเข้าถึงหน้าเข้าสู่ระบบได้ อย่าลืมเปลี่ยนค่ากลับเป็น "ผู้ใช้" ในภายหลังสำคัญ! ฉันขอเตือนคุณอีกครั้งว่าคุณ ต้อง ลบโฟลเดอร์ /install ก่อนที่จะใช้ในสภาพแวดล้อมการผลิตจริง มิฉะนั้นใครก็ตามสามารถเห็นข้อมูลรับรองฐานข้อมูลของคุณได้!
หลังจากการตั้งค่า คุณสามารถสร้างบัญชีใหม่ (ผู้ดูแลระบบหรือปกติ) โดยใช้แผงผู้ดูแลระบบ
ซึ่งหมายความว่าโปรแกรมติดตั้งสังเกตเห็นว่าฟังก์ชัน random_bytes(int)
ไม่มีอยู่หรือทำงานได้อย่างถูกต้อง หากคุณใช้ PHP เวอร์ชันเก่ากว่า 7.0 คุณต้องใช้ไลบรารีบุคคลที่สามที่ใช้ฟังก์ชันนั้น สำหรับ PHP 5.x ฉันขอแนะนำอันนี้
ค่าเริ่มต้นของ MySQL คือ 3306
สิ่งนี้จะเกิดขึ้นเมื่อวิซาร์ดไม่สามารถลบตัวเองออกได้ ซึ่งมักเกิดจากการอนุญาตที่จำกัดบนโฮสต์ แก้ไขปัญหาโดยการลบโฟลเดอร์ /install ด้วยตนเอง
ตรวจสอบเคล็ดลับการแก้ปัญหาในคำถามที่พบบ่อยทั่วไปด้านล่าง
แผงผู้ดูแลระบบยังอยู่ในช่วงเริ่มต้นของการพัฒนา หลายๆอย่างอาจจะพัง
ที่จะเพิ่มมากขึ้นในอนาคต
/admin
อ่าน config.php อย่างละเอียดยิ่งขึ้น
นั่นหมายความว่า PDOException
เกิดขึ้นขณะพยายามเชื่อมต่อกับฐานข้อมูล คุณสามารถเปิดข้อความแสดงข้อผิดพลาดโดยละเอียดเพิ่มเติมได้ใน /config/config.php สาเหตุที่พบบ่อยที่สุดคือ:
PDO_MYSQL
ไม่พร้อมใช้งานหรือกำหนดค่าอย่างถูกต้องPDO_MYSQL
ไม่ มันไม่ใช่ และมันนานเกินไปแล้ว ฉันรู้ ฉันวางแผนที่จะไปถึงที่นั่นเร็วๆ นี้™ อัปเดต: ตอนนี้ใช้งานได้แล้ว โปรดทราบว่าจะจดจำการเข้าสู่ระบบเป็นเวลา 30 วันเท่านั้น (ด้วยเหตุผลด้านความปลอดภัย)
ใช่ ฉันรู้ว่าการใช้งานในลักษณะนี้มักจะเปิดช่องโหว่ด้านความปลอดภัยใหม่ๆ อยู่เสมอ อย่างไรก็ตาม ฉันไม่ได้บังคับให้ผู้ใช้ใช้มันหรืออะไรก็ตาม หากผู้ใช้ไม่เลือกช่องทำเครื่องหมาย ระบบจะไม่สร้างโทเค็นการเข้าถึง จึงไม่มีความเสี่ยงด้านความปลอดภัยสำหรับผู้ใช้รายนั้น
random_bytes()
ที่ปลอดภัยแบบเข้ารหัส โทเค็นนั้นจะถูกบันทึกลงในฐานข้อมูลและส่งคุกกี้สองตัวไปยังเบราว์เซอร์ ค่าของคุกกี้แรกคือชื่อผู้ใช้ของผู้ใช้ในรูปแบบข้อความธรรมดา คุกกี้ชิ้นที่สองมีความสำคัญมากกว่ามาก ค่าของมันคือโทเค็นที่สร้างขึ้นปัญหาหลักคือหาก "คนเลว" สามารถเข้าถึงโทเค็นของผู้ใช้ได้ พวกเขาก็สามารถสร้างคุกกี้และเข้าสู่ระบบในฐานะผู้ใช้นั้นได้อย่างง่ายดาย มีสองวิธีที่คนร้ายจะเข้าถึงโทเค็นของผู้ใช้ได้: โดยวิธีใดวิธีหนึ่ง (เช่น การแทรก SQL) รับมันจากฐานข้อมูล หรือโดยการขโมยคุกกี้ และ/หรือมูลค่าของมันจากผู้ใช้
ฉันคิดว่ามันเป็นความเสี่ยงด้านความปลอดภัย เนื่องจากบางคนมีแนวโน้มที่จะใช้รหัสผ่านที่ง่ายเกินไปหรือรหัสผ่านเดียวกัน อย่างไรก็ตาม ฉันอาจอนุญาตสิ่งนี้ในเวอร์ชันต่อๆ ไปผ่านตัวเลือกการกำหนดค่า