สงสัยต้องสมัครสมาชิก php.ini เราสร้างระบบการลงทะเบียนที่เรียบง่ายอย่างไม่น่าเชื่อใน PHP และ MySQL

สงสัยต้องสมัครสมาชิก php.ini เราสร้างระบบการลงทะเบียนที่เรียบง่ายอย่างไม่น่าเชื่อใน PHP และ MySQL

21.11.2021

เพื่อแบ่งผู้เข้าชมเว็บไซต์ออกเป็นกลุ่มๆ ต้องติดตั้งระบบขนาดเล็กบนไซต์ การลงทะเบียน php... ดังนั้น คุณแบ่งผู้เยี่ยมชมตามเงื่อนไขออกเป็นสองกลุ่มโดยสุ่มผู้เยี่ยมชมและออกเป็นกลุ่มผู้ใช้ที่มีสิทธิพิเศษมากขึ้นซึ่งคุณให้ข้อมูลที่มีค่ามากกว่า

ในกรณีส่วนใหญ่ จะใช้ระบบการลงทะเบียนที่เรียบง่ายกว่า ซึ่งเขียนด้วย php ในไฟล์เดียว register.php.

ดังนั้น เราพูดนอกเรื่องเล็กน้อย และตอนนี้เราจะพิจารณาไฟล์การลงทะเบียนอย่างละเอียดยิ่งขึ้น

Register.php ไฟล์

เพื่อไม่ให้ใช้เวลามาก เราจะสร้างระบบที่จะรวบรวมผู้ใช้ โดยใช้ข้อมูลการติดต่อน้อยที่สุดจากพวกเขา ในกรณีนี้ เราจะใส่ทุกอย่างลงในฐานข้อมูล mysql สำหรับความเร็วสูงสุดของฐานข้อมูล เราจะสร้างตารางผู้ใช้ในรูปแบบ MyISAM และในการเข้ารหัส utf-8

บันทึก! สคริปต์ทั้งหมดต้องเขียนด้วยการเข้ารหัสเดียวกันเสมอ ไฟล์ไซต์ทั้งหมดและฐานข้อมูล MySql จะต้องอยู่ในการเข้ารหัสเดียวกัน การเข้ารหัสที่พบบ่อยที่สุดคือ UTF-8 และ Windows-1251

ทำไมคุณต้องเขียนทุกอย่างด้วยการเข้ารหัสเดียว เราจะคุยกันในภายหลัง ก่อนหน้านั้น ให้ใช้ข้อมูลนี้เป็นหลักเกณฑ์ที่เข้มงวดที่สุดสำหรับการเขียนสคริปต์ มิฉะนั้นจะมีปัญหากับการเขียนสคริปต์ในอนาคต ไม่เป็นไร แต่คุณเสียเวลามากในการค้นหาข้อผิดพลาดในสคริปต์

สคริปต์จะทำงานอย่างไร

เราต้องการทำให้ทุกอย่างง่ายขึ้นและได้ผลลัพธ์ที่รวดเร็ว ดังนั้นเราจะได้รับจากผู้ใช้เท่านั้น ล็อกอิน อีเมล และรหัสผ่าน และเพื่อป้องกันหุ่นยนต์สแปม เราจะติดตั้งแคปต์ชาขนาดเล็ก มิฉะนั้น เด็กชายจากลอนดอนบางคนจะเขียนหุ่นยนต์แยกวิเคราะห์ขนาดเล็กที่จะเติมฐานข้อมูลทั้งหมดด้วยผู้ใช้ปลอมภายในไม่กี่นาที และจะยินดีกับอัจฉริยะและการไม่ต้องรับโทษของเขา

นี่คือสคริปต์เอง ทุกอย่างถูกเขียนในไฟล์เดียว register.php:

! `; // เครื่องหมายคำถามสีแดง $ sha = $ sh. "scripts / pro /"; // พาธไปยังโฟลเดอร์หลัก $ bg = `bgcolor =" # E1FFEB "`; // สีพื้นหลังของเส้น?> ตัวอย่างสคริปต์ register.php style.css "/>

ในกรณีนี้ สคริปต์หมายถึงตัวมันเอง และเป็นแบบฟอร์มและตัวประมวลผลของข้อมูลที่ป้อนลงในแบบฟอร์ม โปรดทราบว่าไฟล์ถูกบีบอัดในไฟล์ zip และมีไฟล์การกำหนดค่า config.php ดัมพ์ฐานข้อมูลผู้ใช้ ไฟล์ที่มีตัวช่วย functions.php ไฟล์ style.css และไฟล์ register.php นอกจากนี้ยังมีไฟล์หลายไฟล์ที่รับผิดชอบการทำงานและการสร้างสัญลักษณ์แคปต์ชา

วันนี้เราจะพิจารณาการใช้ประโยชน์จากช่องโหว่ที่สำคัญ 1 วันใน CMS Joomla ยอดนิยม ซึ่งได้รับความนิยมบนอินเทอร์เน็ตเมื่อปลายเดือนตุลาคม เราจะพูดถึงจุดอ่อนกับตัวเลข CVE-2016-8869, CVE-2016-8870และ CVE-2016-9081... ทั้งสามมาจากโค้ดชิ้นเดียวที่อิดโรยอยู่ในส่วนลึกของเฟรมเวิร์กมาเป็นเวลาห้าปี รอคอยชั่วโมงที่จะหลุดพ้นและนำมาซึ่งความโกลาหล เว็บไซต์ที่ถูกแฮ็ก และน้ำตาของผู้ใช้ Joomla ที่ไร้เดียงสา มีเพียงนักพัฒนาที่กล้าหาญและกล้าหาญที่สุดเท่านั้นที่มีดวงตาสีแดงจากแสงของจอภาพและคีย์บอร์ดก็เกลื่อนไปด้วยเศษขนมปังเท่านั้นที่สามารถท้าทายวิญญาณชั่วร้ายที่บ้าคลั่งและวางหัวบนแท่นบูชาแห่งการแก้ไข

คำเตือน

ข้อมูลทั้งหมดจัดทำขึ้นเพื่อวัตถุประสงค์ในการให้ข้อมูลเท่านั้น ทั้งกองบรรณาธิการและผู้เขียนจะไม่รับผิดชอบต่ออันตรายใดๆ ที่อาจเกิดขึ้นจากเนื้อหาของบทความนี้

มันเริ่มต้นอย่างไร

เมื่อวันที่ 6 ตุลาคม 2559 Demis Palma ได้สร้างหัวข้อใน Stack Exchange ซึ่งเขาถามว่า: ทำไมในความเป็นจริงใน Joomla เวอร์ชัน 3.6 มีสองวิธีในการลงทะเบียนผู้ใช้ด้วยการลงทะเบียนชื่อเดียวกัน () อันแรกอยู่ใน UsersControllerRegistration และอันที่สองอยู่ใน UsersControllerUser Damis ต้องการทราบว่าใช้เมธอด UsersControllerUser :: register () ที่ไหนสักแห่ง หรือนี่เป็นเพียงการผิดเวลาของวิวัฒนาการที่หลงเหลือจากตรรกะแบบเก่า เขากังวลเกี่ยวกับความจริงที่ว่าแม้ว่าวิธีนี้จะไม่ได้ใช้โดยมุมมองใด ๆ แต่ก็ยังสามารถเรียกใช้ด้วยคำขอที่สร้างขึ้นได้ ซึ่งผมได้รับการตอบกลับจากนักพัฒนาภายใต้ชื่อเล่นว่า itoctopus ซึ่งยืนยันว่าปัญหามีอยู่จริง และส่งรายงานไปยังผู้พัฒนา Joomla

เหตุการณ์ต่อไปพัฒนาอย่างรวดเร็วที่สุด เมื่อวันที่ 18 ตุลาคม นักพัฒนา Joomla ยอมรับรายงานจาก Damis ซึ่งตอนนั้นได้ร่าง PoC เพื่ออนุญาตให้ลงทะเบียนผู้ใช้ เขาตีพิมพ์บันทึกย่อบนเว็บไซต์ของเขา ซึ่งเขาได้สรุปปัญหาที่เขาพบและความคิดของเขาเกี่ยวกับเรื่องนี้ ในวันเดียวกันนั้น เวอร์ชันใหม่ของ Joomla 3.6.3 ก็ได้ออกวางจำหน่าย ซึ่งยังคงมีโค้ดที่มีช่องโหว่อยู่

หลังจากนั้น Davide Tampellini จะแก้ไขจุดบกพร่องในสถานะการลงทะเบียน ไม่ใช่ของผู้ใช้ทั่วไป แต่เป็นผู้ดูแลระบบ และเมื่อวันที่ 21 ตุลาคม คดีใหม่มาถึงทีมรักษาความปลอดภัย Joomla มันกำลังพูดถึงการเพิ่มสิทธิพิเศษอยู่แล้ว ในวันเดียวกันนั้น มีประกาศบนเว็บไซต์ Joomla ว่าในวันอังคารที่ 25 ตุลาคม เวอร์ชันถัดไปที่มีหมายเลขซีเรียล 3.6.3 จะออก ซึ่งแก้ไขจุดอ่อนที่สำคัญในคอร์ของระบบ

ในวันที่ 25 ตุลาคม ทีมงาน Joomla Security Strike พบปัญหาสุดท้ายซึ่งสร้างขึ้นโดยโค้ดที่ Damis ค้นพบ จากนั้นคอมมิชชันลงวันที่ 21 ตุลาคมด้วยชื่อไม่เด่น เตรียม 3.6.4 ปล่อยเสถียร ถูกผลักไปที่สาขาหลักของที่เก็บ Joomla อย่างเป็นทางการ ซึ่งแก้ไขข้อผิดพลาดที่โชคร้าย

หลังจากการเปิดตัวครั้งนี้ ผู้ที่สนใจจำนวนมากได้เชื่อมต่อกับการประชุมของนักพัฒนา พวกเขาเริ่มที่จะไขจุดอ่อนและเตรียมการหาประโยชน์

เมื่อวันที่ 27 ตุลาคม นักวิจัย Harry Roberts อัปโหลดช่องโหว่สำเร็จรูปไปยังที่เก็บ Xiphos Research ที่สามารถอัปโหลดไฟล์ PHP ไปยังเซิร์ฟเวอร์ที่มี CMS ที่มีช่องโหว่

รายละเอียด

เสร็จแล้วกับพื้นหลัง ไปที่ส่วนที่น่าสนใจที่สุด - การวิเคราะห์ช่องโหว่ ในเวอร์ชันทดสอบ ฉันติดตั้ง Joomla 3.6.3 ดังนั้นหมายเลขบรรทัดทั้งหมดจะเกี่ยวข้องกับเวอร์ชันนี้โดยเฉพาะ และเส้นทางทั้งหมดไปยังไฟล์ที่คุณเห็นด้านล่างจะถูกระบุโดยสัมพันธ์กับรูทของ CMS ที่ติดตั้ง

ต้องขอบคุณการค้นพบของ Damis Palma ที่ทำให้เรารู้ว่ามีสองวิธีที่ทำการลงทะเบียนผู้ใช้ในระบบ อันแรกถูกใช้โดย CMS และอยู่ในไฟล์ /components/com_users/controllers/registration.php:108 อันที่สอง (อันที่เราต้องเรียก) อยู่ใน /components/com_users/controllers/user.php:293 ลองมาดูกันดีกว่า

286: / ** 287: * วิธีการลงทะเบียนผู้ใช้ 288: * 289: * @return boolean 290: * 291: * @since 1.6 292: * / 293: public function register () 294: (295: JSession :: checkToken ("post") หรือ jexit (JText :: _ ("JINVALID_TOKEN")); ... 300: // รับข้อมูลแบบฟอร์ม 301: $ data = $ this-> input-> post-> get ("ผู้ใช้", array (), "array"); .. 315: $ return = $ model-> ตรวจสอบ ($ form, $ data); 316: 317: // ตรวจสอบข้อผิดพลาด 318: if ($ return === false) 319: (... 345: / / เสร็จสิ้นการลงทะเบียน 346: $ return = $ model-> register ($ data);

ที่นี่ฉันเหลือเพียงบรรทัดที่น่าสนใจ สามารถดูเวอร์ชันเต็มของวิธีการที่เปราะบางได้ในที่เก็บ Joomla

มาดูกันว่าจะเกิดอะไรขึ้นระหว่างการลงทะเบียนผู้ใช้ปกติ: ข้อมูลใดที่ถูกส่งและวิธีประมวลผล หากเปิดใช้งานการลงทะเบียนผู้ใช้ในการตั้งค่า สามารถดูแบบฟอร์มได้ที่ http: //joomla.local/index.php/component/users/? View = การลงทะเบียน


คำขอลงทะเบียนผู้ใช้ที่ถูกกฎหมายดูเหมือนภาพหน้าจอต่อไปนี้


คอมโพเนนต์ com_users มีหน้าที่ทำงานกับผู้ใช้ ให้ความสนใจกับพารามิเตอร์งานในคำขอ อยู่ในรูปแบบ $ controller. $ method มาดูโครงสร้างไฟล์กัน

ชื่อของสคริปต์ในโฟลเดอร์ คอนโทรลเลอร์สอดคล้องกับชื่อของตัวควบคุมที่เรียกว่า เนื่องจากตอนนี้คำขอของเรามี $ controller = "registration" ไฟล์จะถูกเรียก register.phpและวิธีการลงทะเบียน ()

ข้อควรระวัง คำถาม: จะผ่านการประมวลผลการลงทะเบียนไปยังช่องโหว่ในรหัสได้อย่างไร คุณคงเดาได้อยู่แล้ว ชื่อของช่องโหว่และวิธีการจริงเหมือนกัน (ลงทะเบียน) ดังนั้นเราจำเป็นต้องเปลี่ยนชื่อของตัวควบคุมที่เรียกว่า ตัวควบคุมที่มีช่องโหว่อยู่ที่ไหน? ใช่แล้ว ในไฟล์ user.php... ปรากฎว่า $ controller = "user" นำทุกอย่างมารวมกันและรับงาน = user.register ตอนนี้คำขอลงทะเบียนได้รับการประมวลผลโดยวิธีที่เราต้องการ


สิ่งที่สองที่เราต้องทำคือส่งข้อมูลในรูปแบบที่ถูกต้อง ทุกอย่างง่ายที่นี่ การลงทะเบียนที่ถูกต้อง () คาดหวังจากเราว่าอาร์เรย์ที่เรียกว่า jform ซึ่งเราส่งข้อมูลสำหรับการลงทะเบียน - ชื่อ, เข้าสู่ระบบ, รหัสผ่าน, เมล (ดูภาพหน้าจอพร้อมคำขอ)

  • /components/com_users/controllers/registration.php: 124: // รับข้อมูลผู้ใช้ 125: $ requestData = $ this-> input-> post-> get ("jform", อาร์เรย์ (), "array");

ward ของเราได้รับข้อมูลนี้จากอาร์เรย์ที่ชื่อผู้ใช้

  • /components/com_users/controllers/user.php: 301: // รับข้อมูลแบบฟอร์ม 302: $ data = $ this-> input-> post-> get ("ผู้ใช้", อาร์เรย์ (), "อาร์เรย์");

ดังนั้นเราจึงเปลี่ยนชื่อพารามิเตอร์ทั้งหมดในคำขอจาก jfrom เป็นผู้ใช้

ขั้นตอนที่สามของเราคือการค้นหาโทเค็น CSRF ที่ถูกต้อง เนื่องจากหากไม่มีโทเค็นดังกล่าว จะไม่มีการลงทะเบียน

  • /components/com_users/controllers/user.php: 296: JSession :: checkToken ("โพสต์") หรือ jexit (JText :: _ ("JINVALID_TOKEN"));

ดูเหมือนว่าแฮช MD5 และคุณสามารถใช้มันได้ ตัวอย่างเช่น จากแบบฟอร์มการให้สิทธิ์บนไซต์ /index.php/component/users/?view=login


ตอนนี้คุณสามารถสร้างผู้ใช้ผ่านวิธีการที่ต้องการ หากทุกอย่างเป็นไปด้วยดี ขอแสดงความยินดีด้วย คุณเพิ่งใช้ช่องโหว่นี้ไป CVE-2016-8870"ขาดการตรวจสอบสิทธิ์ในการลงทะเบียนผู้ใช้ใหม่"

นี่คือลักษณะที่ปรากฏในเมธอด register () "ทำงาน" จากคอนโทรลเลอร์ UsersControllerRegistration:

  • /components/com_users/controllers/registration.php: 113: // หากปิดการลงทะเบียน - เปลี่ยนเส้นทางไปยังหน้าเข้าสู่ระบบ 114: if (JComponentHelper :: getParams ("com_users") -> get ("allowUserRegistration") == 0) 115: (116: $ this-> setRedirect (JRoute :: _ ("index.php? Option = com_users & ดู = เข้าสู่ระบบ ", เท็จ)); 117: 118: คืนค่าเท็จ 119 :)

และในผู้อ่อนแอ:

  • /components/com_users/controllers/user.php:

ใช่ ไม่มีทาง

เพื่อทำความเข้าใจปัญหาที่สองที่ร้ายแรงกว่านี้ ให้ส่งคำขอที่เราได้สร้างขึ้นและติดตามว่าดำเนินการอย่างไรในส่วนต่างๆ ของโค้ด นี่คือส่วนที่รับผิดชอบในการตรวจสอบข้อมูลที่ผู้ใช้ส่งมาในวิธีการทำงาน:

ความต่อเนื่องมีให้สำหรับผู้เข้าร่วมเท่านั้น

ตัวเลือก 1. เข้าร่วมชุมชน "ไซต์" เพื่ออ่านเนื้อหาทั้งหมดบนไซต์

การเป็นสมาชิกในชุมชนภายในระยะเวลาที่กำหนดจะทำให้คุณสามารถเข้าถึงสื่อทั้งหมดของแฮ็กเกอร์ เพิ่มส่วนลดสะสมส่วนบุคคลของคุณ และช่วยให้คุณสะสมคะแนน Xakep แบบมืออาชีพได้!

หากคุณต้องการให้ส่วนใดส่วนหนึ่งในไซต์ของคุณใช้ได้กับกลุ่มคนที่จำกัดแต่ไม่จำกัด วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการลงทะเบียนและให้สิทธิ์ผู้ใช้ มีหลายวิธีในการตรวจสอบผู้ใช้ สามารถใช้ได้ทั้งเครื่องมือเว็บเซิร์ฟเวอร์และเครื่องมือภาษาโปรแกรม เราจะพูดถึงกรณีที่ใช้เซสชัน PHP

คุณอาจต้องการเห็นวิธีการที่ทันสมัยกว่าในการสร้างรูปร่างดังกล่าว ฉันยังมีการนำเสนอที่ทันสมัยและทันสมัยอย่างสมบูรณ์ แต่คุณจะเห็นว่าแบบฟอร์มคำติชมสามารถสร้างขึ้นได้โดยใช้เทคนิคเชิงวัตถุใน PHP

อันดับแรก มาพูดถึงขั้นตอนทั้งหมดที่เราจะทำต่อไป เราต้องการอะไร เราต้องการสคริปต์ที่จะลงทะเบียนผู้ใช้ อนุญาตผู้ใช้ เปลี่ยนเส้นทางผู้ใช้ไปที่ใดที่หนึ่งหลังจากการอนุญาต เราจะต้องสร้างเพจที่จะป้องกันการเข้าถึงโดยผู้ใช้ที่ไม่ได้รับอนุญาต สำหรับการลงทะเบียนและการอนุญาต เราจะต้องสร้างแบบฟอร์ม HTML เราจะจัดเก็บข้อมูลเกี่ยวกับผู้ใช้ที่ลงทะเบียนไว้ในฐานข้อมูล ซึ่งหมายความว่าเรายังต้องการสคริปต์เพื่อเชื่อมต่อกับ DBMS งานทั้งหมดของเราจะดำเนินการตามหน้าที่ที่เราจะเขียนเอง เราจะบันทึกฟังก์ชันเหล่านี้ในไฟล์แยกต่างหาก

ดังนั้นเราต้องการไฟล์ต่อไปนี้:

  • การเชื่อมต่อกับ DBMS;
  • ฟังก์ชั่นที่กำหนดเอง;
  • การอนุญาต;
  • การลงทะเบียน;
  • หน้าป้องกัน;
  • สคริปต์การปิดระบบของผู้ใช้
  • สคริปต์ที่ตรวจสอบสถานะการให้สิทธิ์ของผู้ใช้
  • สไตล์ชีตสำหรับการออกแบบหน้าเว็บของเราที่ง่ายที่สุด

ทั้งหมดนี้จะไม่มีประโยชน์หากคุณไม่มีตารางที่สอดคล้องกันในฐานข้อมูลของคุณ เปิดเครื่องมือการจัดการ DBMS ของคุณ (PhpMyAdmin หรือบรรทัดคำสั่งแล้วแต่สะดวกกว่า) และเรียกใช้แบบสอบถามต่อไปนี้:

สร้างตาราง `users' (` id` int (11) ไม่ใช่ NULL AUTO_INCREMENT, `login` char (16) ไม่ใช่ NULL,` รหัสผ่าน `ถ่าน (40) ไม่ใช่ NULL, `reg_date` เวลาประทับไม่ใช่ NULL DEFAULT CURRENT_TIMESTAMP, คีย์หลัก (` id`)) เครื่องยนต์ = MyISAM ค่าเริ่มต้น CHARSET = utf8 AUTO_INCREMENT = 1;

ฉันจะตั้งชื่อไฟล์สคริปต์ของเราแบบนี้ (ไฟล์ทั้งหมดจะอยู่ในไดเรกทอรีเดียวกัน):

  • ฐานข้อมูล.php;
  • ฟังก์ชั่น.php;
  • เข้าสู่ระบบ.php;
  • register.php;
  • ดัชนี.php;
  • ออกจากระบบ.php;
  • checkAuth.php;
  • สไตล์.css.

ฉันแน่ใจว่าจุดประสงค์ของแต่ละคนนั้นชัดเจนสำหรับคุณ เริ่มต้นด้วยสคริปต์การเชื่อมต่อ DBMS คุณเคยเห็นมันมาก่อน เพียงบันทึกโค้ดสำหรับสคริปต์นี้ในไฟล์ชื่อ database.php เราจะประกาศฟังก์ชันที่กำหนดเองในไฟล์ functions.php ทั้งหมดนี้จะทำงานอย่างไร? ผู้ใช้ที่ไม่ได้รับอนุญาตพยายามเข้าถึงเอกสารที่ได้รับการป้องกัน index.php ระบบจะตรวจสอบว่าผู้ใช้ได้รับอนุญาตหรือไม่ หากผู้ใช้ไม่ได้รับอนุญาต เขาจะถูกเปลี่ยนเส้นทางไปยังหน้าการอนุญาต ในหน้าการให้สิทธิ์ ผู้ใช้ควรเห็นแบบฟอร์มการให้สิทธิ์ มาทำกัน

การให้สิทธิ์ผู้ใช้

ลงทะเบียน.



ตอนนี้เราต้องทำให้รูปร่างของเราดูดีขึ้น ในเวลาเดียวกัน เราจะกำหนดกฎสำหรับองค์ประกอบอื่นๆ ฉันจะให้เนื้อหาทั้งหมดของสไตล์ชีตแก่คุณ เพื่อนำหน้าตัวเอง

/ * ไฟล์ style.css * / .row (ระยะขอบล่าง: 10px; ความกว้าง: 220px;) ป้ายกำกับ .row (แสดง: บล็อก; น้ำหนักแบบอักษร: ตัวหนา;) .row input.text (ขนาดแบบอักษร: 1.2em; ช่องว่างภายใน: 2px 5px;) .to_reg (ขนาดแบบอักษร: 0.9em;) คำแนะนำ (ขนาดแบบอักษร: 0.8em สี: #aaaaaa ระยะขอบซ้าย: 2px เคอร์เซอร์: ค่าเริ่มต้น) ข้อผิดพลาด (สี: สีแดง; ระยะขอบซ้าย: 3px;)

หากทุกอย่างถูกต้อง คุณควรมีสิ่งต่อไปนี้ในเบราว์เซอร์ของคุณ:

แน่นอน เรายังไม่มีผู้ใช้ที่ลงทะเบียนเพียงคนเดียว และในการเข้าสู่ระบบ คุณต้องลงทะเบียน มาทำแบบฟอร์มลงทะเบียนกันเถอะ

การลงทะเบียนผู้ใช้

" />


คุณอาจสังเกตเห็นว่ามีตัวแปร PHP ในโค้ด HTML เป็นเนื้อหาของแอตทริบิวต์ของฟิลด์ข้อความในรูปแบบเนื้อหาของคอนเทนเนอร์สำหรับการแสดงข้อผิดพลาด แต่เรายังไม่ได้เริ่มต้นตัวแปรเหล่านี้ มาทำกัน

การลงทะเบียนผู้ใช้

" />
ชื่อผู้ใช้สามารถมีได้เฉพาะอักขระละติน ตัวเลข สัญลักษณ์ "_", "-", "." ชื่อผู้ใช้ต้องมีความยาวอย่างน้อย 4 ตัวอักษรและไม่เกิน 16 ตัวอักษร
ในรหัสผ่าน คุณสามารถใช้ได้เฉพาะอักขระละติน ตัวเลข สัญลักษณ์ "_", "!", "(", ")" รหัสผ่านต้องมีอย่างน้อย 6 ตัวอักษรและไม่เกิน 16 ตัวอักษร
ทำซ้ำรหัสผ่านที่ป้อนก่อนหน้านี้


ไม่มีพารามิเตอร์ที่ระบุในแอ็ตทริบิวต์ action ของ form tag ในกรณีนี้ เมื่อส่งข้อมูลในแบบฟอร์ม ข้อมูลนั้นจะถูกประมวลผลในสคริปต์เดียวกันกับที่ส่ง ดังนั้นเราต้องเขียนโค้ดที่ประมวลผลข้อมูลในแบบฟอร์ม แต่ก่อนอื่น เรามาพูดถึงอัลกอริทึมสำหรับการประมวลผลกันก่อน

เราต้องการช่องเข้าสู่ระบบและรหัสผ่านเพื่อไม่ให้ว่างเปล่า จากนั้นคุณต้องตรวจสอบการเข้าสู่ระบบเพื่อให้เป็นไปตามข้อกำหนด รหัสผ่านต้องเป็นไปตามข้อกำหนดที่อธิบายไว้ด้วย และรหัสผ่านที่ซ้ำต้องตรงกัน และยิ่งไปกว่านั้น รหัสผ่านต้องเหมือนกันด้วย หากไม่เป็นไปตามเงื่อนไขใดๆ เหล่านี้ ควรหยุดการประมวลผลข้อมูลในแบบฟอร์ม การแจ้งเตือนที่เกี่ยวข้องควรเขียนลงในอาร์เรย์ของข้อความแสดงข้อผิดพลาด และควรแสดงให้ผู้ใช้เห็น เพื่อความสะดวกของผู้ใช้ เราจะบันทึกการเข้าสู่ระบบที่ป้อนโดยเขา (หากเขาระบุ) โดยเขียนค่าลงในอาร์เรย์ฟิลด์ $

หากทุกอย่างเรียบร้อยดี ในหน้าต่างเบราว์เซอร์ของคุณ ที่อ้างอิงถึงเอกสาร register.php คุณควรเห็นสิ่งนี้:

ตอนนี้ สมมติว่าผู้ใช้คลิกที่ปุ่มลงทะเบียนโดยไม่ต้องกรอกข้อมูลในแบบฟอร์ม ตามอัลกอริทึมของเรา การเข้าสู่ระบบและรหัสผ่านต้องไม่ว่างเปล่า หากไม่เป็นไปตามเงื่อนไขนี้ จะไม่สามารถลงทะเบียนได้ เราพึงระลึกไว้เสมอว่าการประมวลผลข้อมูลแบบฟอร์มเกิดขึ้นในสคริปต์ปัจจุบัน ซึ่งหมายความว่าเราจำเป็นต้องเปลี่ยนรหัสโดยเพิ่มการตรวจสอบที่เหมาะสม เราจะกำหนดการตรวจสอบต่อไปนี้ทันที หากป้อนทั้งล็อกอินและรหัสผ่าน คุณต้องตรวจสอบการปฏิบัติตามข้อกำหนดที่ระบุ ในการตรวจสอบการเข้าสู่ระบบและรหัสผ่าน เราจะสร้างฟังก์ชันที่กำหนดเองในไฟล์ functions.php

/ ** * functions.php * ไฟล์ที่มีฟังก์ชั่นที่กำหนดเอง * / // รวมไฟล์ที่มีพารามิเตอร์สำหรับการเชื่อมต่อกับ DBMS require_once ("database.php"); // ตรวจสอบฟังก์ชันชื่อผู้ใช้ checkLogin ($ str) (// เริ่มต้นตัวแปรด้วยข้อความแสดงข้อผิดพลาดที่เป็นไปได้ $ error = ""; // หากไม่มีสตริงการเข้าสู่ระบบ ให้แสดงข้อความแสดงข้อผิดพลาดหาก (! $ Str) ($ error) = " คุณไม่ได้ป้อนชื่อผู้ใช้ "; return $ error;) / ** * ตรวจสอบชื่อผู้ใช้โดยใช้นิพจน์ทั่วไป * ล็อกอินต้องมีอย่างน้อย 4 ไม่เกิน 16 ตัวอักษร * ต้องมีอักขระละติน ตัวเลข * สามารถ เป็นอักขระ "_", "-", "." * / $ pattern = "/^ [-_.az\d ](4,16)$/i"; $ result = preg_match (รูปแบบ $, $ str) ; // หากการตรวจสอบล้มเหลว ให้แสดงข้อความแสดงข้อผิดพลาดหาก (! $ Result) ($ error = "อักขระไม่ถูกต้องในชื่อผู้ใช้หรือชื่อผู้ใช้สั้นเกินไป (ยาว)"; return $ error;) // หากทุกอย่างเรียบร้อย , return true return true;) // ตรวจสอบฟังก์ชันรหัสผ่านของผู้ใช้ checkPassword ($ str) (// เริ่มต้นตัวแปรด้วยข้อความแสดงข้อผิดพลาดที่เป็นไปได้ $ error = ""; // หากไม่มี สตริงที่มีการเข้าสู่ระบบปรากฏขึ้น ให้ส่งคืนข้อความแสดงข้อผิดพลาดหาก (! $ str) ($ error = "คุณไม่ได้ป้อนรหัสผ่าน"; ส่งคืนข้อผิดพลาด $; ) / ** * ตรวจสอบรหัสผ่านของผู้ใช้โดยใช้นิพจน์ทั่วไป * รหัสผ่านต้องไม่สั้นกว่า 6 ไม่เกิน 16 อักขระ * ต้องมีอักขระละติน ตัวเลข * สามารถมีอักขระ "_", "!", " ( ",") "* / $ pattern =" /^ [_!)(.az\d *(6,16)$/i "; $ result = preg_match ($ pattern, $ str); // ถ้ากาเครื่องหมายถูก ล้มเหลว ส่งคืนข้อความแสดงข้อผิดพลาดหาก (! $ result) ($ error = "อักขระไม่ถูกต้องในรหัสผ่านผู้ใช้หรือรหัสผ่านสั้นเกินไป (ยาว)"; return $ error;) // หากทุกอย่างเรียบร้อย คืนค่า true return true ; )

ตอนนี้เราต้องแก้ไขไฟล์ register.php เพื่อใช้ฟังก์ชันที่เราประกาศไว้ เราจะเพิ่มเงื่อนไขให้กับสคริปต์เพื่อตรวจสอบว่าได้คลิกปุ่มลงทะเบียนแล้ว ภายในเงื่อนไขนี้ การตรวจสอบการเข้าสู่ระบบและรหัสผ่านจะเริ่มต้นขึ้น หากการตรวจสอบใดล้มเหลว เราจะส่งแบบฟอร์มอีกครั้งและแสดงข้อความแสดงข้อผิดพลาด หากไม่มีข้อผิดพลาด เราลงทะเบียนผู้ใช้ เราจะไม่แสดงแบบฟอร์มการลงทะเบียนอีกต่อไป แจ้งให้ผู้ใช้ทราบเกี่ยวกับการลงทะเบียนที่สำเร็จ และใช้ฟังก์ชันส่วนหัว () เปลี่ยนเส้นทางไปยังแบบฟอร์มการให้สิทธิ์

คุณได้ลงทะเบียนในระบบเรียบร้อยแล้ว ตอนนี้คุณจะถูกเปลี่ยนเส้นทางไปยังหน้าเข้าสู่ระบบ หากสิ่งนี้ไม่เกิดขึ้น ให้ไปที่ลิงก์โดยตรง

"; ส่วนหัว (" รีเฟรช: 5; URL = login.php ");) // มิฉะนั้น แจ้งให้ผู้ใช้ทราบเกี่ยวกับข้อผิดพลาดอื่น ($ ข้อผิดพลาด [" full_error "] = $ reg;)))?> การลงทะเบียนผู้ใช้
" />
ชื่อผู้ใช้สามารถมีได้เฉพาะอักขระละติน ตัวเลข สัญลักษณ์ "_", "-", "." ชื่อผู้ใช้ต้องมีความยาวอย่างน้อย 4 ตัวอักษรและไม่เกิน 16 ตัวอักษร
ในรหัสผ่าน คุณสามารถใช้ได้เฉพาะอักขระละติน ตัวเลข สัญลักษณ์ "_", "!", "(", ")" รหัสผ่านต้องมีอย่างน้อย 6 ตัวอักษรและไม่เกิน 16 ตัวอักษร
ทำซ้ำรหัสผ่านที่ป้อนก่อนหน้านี้


คุณควรสังเกตเห็นฟังก์ชันใหม่อื่นในสคริปต์ - การลงทะเบียน () และเรายังไม่ได้ประกาศ มาทำกัน

// เริ่มต้นตัวแปรด้วยข้อความแสดงข้อผิดพลาดที่เป็นไปได้ $ error = ""; // หากไม่มีสตริงการเข้าสู่ระบบ ให้แสดงข้อความแสดงข้อผิดพลาดหาก (! $ เข้าสู่ระบบ) ($ error = "ไม่ได้ระบุการเข้าสู่ระบบ"; return $ error;) elseif (! $ password) ($ error = "ไม่ได้ระบุรหัสผ่าน"; return $ error;) // ตรวจสอบว่าผู้ใช้ลงทะเบียนแล้ว // เชื่อมต่อกับ DBMS connect (); // เขียนสตริงการสืบค้น $ sql = "SELECT` id` จาก `users' WHERE` login` = "" $ เข้าสู่ระบบ "" "; // สร้างแบบสอบถามไปยังฐานข้อมูล $ query = mysql_query ($ sql) หรือตาย ( ""); // ดูจำนวนผู้ใช้ที่มีการเข้าสู่ระบบนี้ หากมีอย่างน้อยหนึ่งราย // ส่งคืนข้อความแสดงข้อผิดพลาด if (mysql_num_rows ($ query)> 0) ($ error = "ผู้ใช้ที่มีการเข้าสู่ระบบที่ระบุได้รับการลงทะเบียนแล้ว"; return $ error;) // หากไม่มีผู้ใช้ดังกล่าว ให้ลงทะเบียน // เขียนสตริงการสืบค้น $ sql = "INSERT INTO` users' (`id',` เข้าสู่ระบบ `, `รหัสผ่าน`) ค่า (NULL," ". $ เข้าสู่ระบบ" "," ". $ รหัสผ่าน "") "; // สร้างแบบสอบถามไปยังฐานข้อมูล $ query = mysql_query ($ sql) หรือตาย ("

ไม่สามารถเพิ่มผู้ใช้: ". Mysql_error ()". เกิดข้อผิดพลาดที่บรรทัด ". __LINE__."

"); // อย่าลืมยกเลิกการเชื่อมต่อจาก DBMS mysql_close (); // คืนค่า true แสดงว่าการลงทะเบียนผู้ใช้สำเร็จจะคืนค่า true;)

หากทุกอย่างเรียบร้อย ผู้ใช้ของคุณจะถูกลงทะเบียน คุณสามารถทดสอบแบบฟอร์ม พยายามลงทะเบียนผู้ใช้ด้วยการเข้าสู่ระบบเดียวกัน หลังจากลงทะเบียนสำเร็จแล้ว ผู้ใช้จะถูกเปลี่ยนเส้นทางไปยังแบบฟอร์มการให้สิทธิ์ ก่อนหน้านี้ เราเพิ่งสร้างมาร์กอัปเพื่อแสดงแบบฟอร์มนี้ เนื่องจากไม่มีการระบุพารามิเตอร์ในแอ็ตทริบิวต์ action ข้อมูลที่ส่งโดยแบบฟอร์มจะถูกประมวลผลในสคริปต์เดียวกัน ดังนั้นเราต้องเขียนโค้ดสำหรับการประมวลผลและเพิ่มลงในเอกสาร login.php

การให้สิทธิ์ผู้ใช้

;">

หากคุณไม่ได้ลงทะเบียนในระบบ ให้ลงทะเบียน



คุณอาจสังเกตเห็นว่าในสคริปต์การให้สิทธิ์ เรามีฟังก์ชันอื่นที่ไม่คุ้นเคย - การอนุญาต () ฟังก์ชันนี้ควรอนุญาตผู้ใช้โดยตรวจสอบก่อนว่ามีผู้ใช้ที่ลงทะเบียนในฐานข้อมูลด้วยชื่อผู้ใช้และรหัสผ่านเดียวกันหรือไม่ หากไม่พบผู้ใช้ดังกล่าว การอนุญาตจะถูกขัดจังหวะและข้อความแสดงความล้มเหลวจะปรากฏขึ้นบนหน้าจอ หากการตรวจสอบสำเร็จ ฟังก์ชันการให้สิทธิ์ () จะเปิดเซสชันและเขียนค่าชื่อผู้ใช้และรหัสผ่าน แจ้งสคริปต์เกี่ยวกับการอนุญาตที่สำเร็จ และสคริปต์จะเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าทรัพยากรที่ได้รับการป้องกัน

/ ** * ฟังก์ชั่นการอนุญาตผู้ใช้ * การอนุญาตผู้ใช้กับเราจะดำเนินการ * โดยใช้เซสชัน PHP * / การอนุญาตฟังก์ชัน ($ เข้าสู่ระบบ, $ รหัสผ่าน) (// เริ่มต้นตัวแปรด้วยข้อความแสดงข้อผิดพลาดที่เป็นไปได้ $ error = ""; // หากไม่มีบรรทัดการเข้าสู่ระบบ ให้แสดงข้อความแสดงข้อผิดพลาดหาก (! $ login) ($ error) = " ไม่ได้ระบุการเข้าสู่ระบบ "; ส่งคืนข้อผิดพลาด $;) elseif (! $ รหัสผ่าน) ($ error =" ไม่ได้ระบุรหัสผ่าน "; return $ error;) // ตรวจสอบว่าผู้ใช้ลงทะเบียนแล้ว // เชื่อมต่อกับการเชื่อมต่อ DBMS ( ); // เราจำเป็นต้องตรวจสอบว่ามีผู้ใช้ดังกล่าวในหมู่ผู้ใช้ที่ลงทะเบียนหรือไม่ // การเขียนสตริงการสืบค้น $ sql = "SELECT` id` FROM `users' WHERE' login' = "" $ เข้าสู่ระบบ "" และ ` password` =" ". $ Password . "" "; // ดำเนินการค้นหา $ query = mysql_query ($ sql) หรือตาย ("

ไม่สามารถดำเนินการค้นหา: ". Mysql_error ()". เกิดข้อผิดพลาดที่บรรทัด ". __LINE__."

"); // หากไม่มีผู้ใช้ที่มีข้อมูลดังกล่าว ให้ส่งคืนข้อความแสดงข้อผิดพลาด if (mysql_num_rows ($ query) == 0) ($ error =" ผู้ใช้ที่มีข้อมูลที่ระบุไม่ได้รับการลงทะเบียน "; return $ error;) // หากผู้ใช้มีอยู่ ให้เริ่มเซสชัน session_start (); // และเขียนชื่อผู้ใช้และรหัสผ่านลงไป // สำหรับสิ่งนี้เราใช้ superglobal array $ _SESSION $ _SESSION ["login"] = $ login; $ _SESSION [" รหัสผ่าน"] = $ รหัสผ่าน; / / อย่าลืมปิดการเชื่อมต่อฐานข้อมูล mysql_close (); // return true สำหรับข้อความเกี่ยวกับการให้สิทธิ์ผู้ใช้ที่สำเร็จ return true;)

เมื่อผู้ใช้เข้าสู่หน้าที่มีการป้องกัน คุณควรตรวจสอบความถูกต้องของข้อมูลการอนุญาตของเขา สำหรับสิ่งนี้ เราต้องการฟังก์ชันแบบกำหนดเองอีกหนึ่งฟังก์ชัน เรียกมันว่า checkAuth () หน้าที่ของมันคือการตรวจสอบข้อมูลการอนุญาตของผู้ใช้กับข้อมูลที่จัดเก็บไว้ในฐานข้อมูลของเรา หากข้อมูลไม่ตรงกัน ระบบจะเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าการให้สิทธิ์

ฟังก์ชั่น checkAuth ($ เข้าสู่ระบบ, $ รหัสผ่าน) (// หากไม่มีชื่อผู้ใช้หรือรหัสผ่าน ให้คืนค่าเท็จ หาก (! $ เข้าสู่ระบบ ||! $ รหัสผ่าน) คืนค่าเท็จ; // ตรวจสอบว่าผู้ใช้ดังกล่าวลงทะเบียนแล้ว // เชื่อมต่อกับ DBMS connect (); // สร้างสตริงการสืบค้น $ sql = "SELECT` id` จาก `users` WHERE` login` = "" $ เข้าสู่ระบบ "" และ `password` =" ". $ รหัสผ่าน" "" ; // ดำเนินการค้นหา $ query = mysql_query ($ sql) หรือตาย ("

ไม่สามารถดำเนินการค้นหา: ". Mysql_error ()". เกิดข้อผิดพลาดที่บรรทัด ". __LINE__."

"); // หากไม่มีผู้ใช้ที่มีข้อมูลดังกล่าว ให้คืนค่าเท็จ if (mysql_num_rows ($ query) == 0) (return false;) // อย่าลืมปิดการเชื่อมต่อฐานข้อมูล mysql_close (); // มิฉะนั้น , คืนค่าจริง คืนค่าจริง ;)

เมื่อผู้ใช้อยู่ในหน้าที่ปลอดภัยแล้ว เราจำเป็นต้องเรียกใช้ฟังก์ชันตรวจสอบข้อมูลการอนุญาต เราจะทำการโทรและตรวจสอบสคริปต์ในไฟล์ checkAuth.php แยกต่างหาก และเชื่อมต่อกับเพจที่จะปิดสำหรับการเข้าถึงแบบสาธารณะ

/ ** * สคริปต์สำหรับตรวจสอบการอนุญาตผู้ใช้ * / // เริ่มเซสชันซึ่งเราจะแยกข้อมูลการเข้าสู่ระบบและรหัสผ่าน // ของผู้ใช้ที่เข้าสู่ระบบ session_start (); // รวมไฟล์ที่มีฟังก์ชั่นที่กำหนดเอง require_once ("functions.php"); / ** * เพื่อตรวจสอบว่าผู้ใช้เข้าสู่ระบบหรือไม่ เราต้อง * ตรวจสอบว่ามีบันทึกในฐานข้อมูลสำหรับการเข้าสู่ระบบ * และรหัสผ่านของเขาหรือไม่ ในการดำเนินการนี้ เราจะใช้ฟังก์ชันที่กำหนดเอง * เพื่อตรวจสอบความถูกต้องของข้อมูลผู้ใช้ที่เข้าสู่ระบบ * หากฟังก์ชันนี้คืนค่าเป็นเท็จ แสดงว่าไม่มีการอนุญาต * ในกรณีที่ไม่มีการอนุญาต เราเพียงแค่เปลี่ยนเส้นทาง * ผู้ใช้ไปยังหน้าการให้สิทธิ์ * / // หากเซสชันมีทั้งข้อมูลการเข้าสู่ระบบและรหัสผ่าน // ตรวจสอบว่า (isset ($ _ SESSION ["login"]) && $ _SESSION ["login"] && isset ($ _ SESSION ["password" ] ) && $ _SESSION ["password"]) (// หากการตรวจสอบความถูกต้องของข้อมูลที่มีอยู่ล้มเหลวหาก (! CheckAuth ($ _ SESSION ["login"], $ _SESSION ["password"])) (// เปลี่ยนเส้นทางผู้ใช้ไปที่ ส่วนหัวของหน้าการให้สิทธิ์ ("ตำแหน่ง: login.php"); // หยุดการเรียกใช้สคริปต์ออก;)) // หากไม่มีข้อมูลเกี่ยวกับการเข้าสู่ระบบหรือรหัสผ่านของผู้ใช้ // เราคิดว่าไม่มีการอนุญาต ให้เปลี่ยนเส้นทาง ผู้ใช้ // ไปยังหน้าการให้สิทธิ์อื่น ( ส่วนหัว ("ตำแหน่ง: login.php"); // ยกเลิกการออกจากสคริปต์;)

ตอนนี้ มาสร้างรหัสสำหรับหน้าที่ปลอดภัยของเรากัน มันจะค่อนข้างง่าย

การอนุญาตผู้ใช้และการลงทะเบียน

อนุมัติสำเร็จ.

คุณได้เข้าถึงหน้าที่ปลอดภัย ท่านสามารถออกจากระบบ



อย่างที่คุณเห็น ในเอกสารที่ได้รับการป้องกัน เรารวมไฟล์เพียงไฟล์เดียว - checkAuth.php ไฟล์อื่นๆ ทั้งหมดรวมอยู่ในสคริปต์อื่น ดังนั้นโค้ดของเราจึงดูไม่ยุ่งยาก เราจัดระเบียบการลงทะเบียนและการอนุญาตของผู้ใช้ ตอนนี้คุณต้องอนุญาตให้ผู้ใช้ออกจากระบบ ในการดำเนินการนี้ เราจะสร้างสคริปต์ในไฟล์ logout.php

/ ** * สคริปต์ออกจากระบบของผู้ใช้ เนื่องจากผู้ใช้ * ได้รับอนุญาตผ่านเซสชัน การเข้าสู่ระบบและรหัสผ่านของพวกเขาจึงถูกจัดเก็บ * ในอาร์เรย์ supergloban $ _SESSION หากต้องการออกจากระบบ ให้ทำลายค่า * ของอาร์เรย์ $ _SESSION ["login"] และ $ _SESSION ["password"] หลังจาก * ซึ่งเราเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าการให้สิทธิ์ * / // ตรวจสอบให้แน่ใจ เพื่อเริ่มเซสชัน session_start (); ยกเลิกการตั้งค่า ($ _ SESSION ["เข้าสู่ระบบ"]); ยกเลิกการตั้งค่า ($ _ SESSION ["รหัสผ่าน"]); ส่วนหัว ("ตำแหน่ง: login.php");

สคริปต์สำหรับการลงทะเบียน การอนุญาต และการตรวจสอบผู้ใช้พร้อมแล้ว คุณสามารถใช้ที่บ้าน เสริม เปลี่ยนให้เหมาะกับความต้องการของคุณ หากคุณมีคำถามใด ๆ คุณสามารถถามพวกเขาในความคิดเห็น คุณสามารถดาวน์โหลดไฟล์ทั้งหมดที่กล่าวถึงที่นี่ รวมอยู่ในไฟล์เก็บถาวรเดียว

ป.ล. ฉันรู้ว่าควรเขียนโค้ดเชิงวัตถุดีกว่า ฉันรู้ว่าไม่ควรส่งและจัดเก็บรหัสผ่านเป็นข้อความที่ชัดเจน ซึ่งข้อมูลที่ป้อนลงในฐานข้อมูลต้องได้รับการตรวจสอบล่วงหน้า ฉันรู้. ฉันจะไม่พูดถึงเรื่องนี้ที่นี่

สวัสดี! ตอนนี้เราจะพยายามใช้การลงทะเบียนที่ง่ายที่สุดบนไซต์โดยใช้ PHP + MySQL ในการดำเนินการนี้ ต้องติดตั้ง Apache บนคอมพิวเตอร์ของคุณ หลักการของสคริปต์ของเราแสดงไว้ด้านล่าง

1. เริ่มต้นด้วยการสร้างจานผู้ใช้ในฐานข้อมูล... จะมีข้อมูลผู้ใช้ (เข้าสู่ระบบและรหัสผ่าน) ไปที่ phpmyadmin (ถ้าคุณสร้างฐานบนพีซีของคุณ http: // localhost / phpmyadmin /). สร้างตาราง ผู้ใช้, ก็จะมี 3 ช่อง

ฉันสร้างมันในฐานข้อมูล mysql คุณสามารถสร้างมันในฐานข้อมูลอื่น ถัดไป ตั้งค่าตามภาพ:

2. จำเป็นต้องมีการเชื่อมต่อกับตารางนี้มาสร้างไฟล์กัน bd.php... เนื้อหา:

$ db = mysql_connect ("เซิร์ฟเวอร์ MySQL ของคุณ", "ลงชื่อเข้าใช้เซิร์ฟเวอร์นี้", "รหัสผ่านไปยังเซิร์ฟเวอร์นี้");
mysql_select_db ("ชื่อของฐานข้อมูลที่เรากำลังเชื่อมต่อ", $ db);
?>

ในกรณีของฉันดูเหมือนว่า:

$ db = mysql_connect ("localhost", "ผู้ใช้", "1234");
mysql_select_db ("mysql", $ db);
?>

เราประหยัด bd.php.
ดี! เรามีตารางในฐานข้อมูล การเชื่อมต่อกับมัน ตอนนี้คุณสามารถเริ่มสร้างหน้าที่ผู้ใช้จะทิ้งข้อมูลไว้

3. สร้างไฟล์ reg.php ที่มีเนื้อหา (ความคิดเห็นทั้งหมดอยู่ภายใน):



การลงทะเบียน


การลงทะเบียน


















4. สร้างไฟล์ซึ่งจะป้อนข้อมูลลงในฐานข้อมูลและบันทึกผู้ใช้ save_user.php(ความคิดเห็นภายใน):



{
}
// หากเข้าสู่ระบบและรหัสผ่าน เราจะประมวลผลเพื่อให้แท็กและสคริปต์ไม่ทำงาน คุณไม่มีทางรู้ว่าคนอื่นสามารถป้อนอะไรได้


// ลบช่องว่างพิเศษ
$ เข้าสู่ระบบ = ตัด ($ เข้าสู่ระบบ);
$ รหัสผ่าน = ตัด ($ รหัสผ่าน);
// เชื่อมต่อกับฐานข้อมูล
// ตรวจสอบการมีอยู่ของผู้ใช้ที่มีการเข้าสู่ระบบเดียวกัน
$ result = mysql_query ("เลือก id จากผู้ใช้ WHERE เข้าสู่ระบบ =" $ เข้าสู่ระบบ "", $ db);
ถ้า (! ว่างเปล่า ($ myrow ["id"])) (
exit ("ขออภัย ชื่อผู้ใช้ที่คุณป้อนถูกลงทะเบียนแล้ว กรุณาป้อนชื่อผู้ใช้อื่น");
}
//ถ้าไม่ใช่ก็บันทึกข้อมูล
$ result2 = mysql_query ("INSERT INTO ผู้ใช้ (เข้าสู่ระบบ, รหัสผ่าน) VALUES (" $ เข้าสู่ระบบ "," $ รหัสผ่าน ")");
// ตรวจสอบว่ามีข้อผิดพลาดหรือไม่
ถ้า ($ result2 == "TRUE")
{
echo "คุณได้ทำการลงทะเบียนเรียบร้อยแล้ว คุณสามารถเข้าสู่เว็บไซต์ได้ หน้าแรก";
}
อื่น (
echo "Error! คุณยังไม่ได้ลงทะเบียน";
}
?>

5. ตอนนี้ผู้ใช้ของเราสามารถลงทะเบียนได้แล้ว!ถัดไป คุณต้องสร้าง "ประตู" เพื่อเข้าสู่ไซต์สำหรับผู้ใช้ที่ลงทะเบียนแล้ว index.php(ความคิดเห็นภายใน):

// ขั้นตอนทั้งหมดทำงานในเซสชัน มันอยู่ที่ข้อมูลของผู้ใช้จะถูกเก็บไว้ในขณะที่เขาอยู่ในไซต์ มันสำคัญมากที่จะต้องเรียกใช้ที่จุดเริ่มต้นของหน้า !!!
session_start ();
?>


หน้าแรก


หน้าแรก











สมัครตอนนี้



// ตรวจสอบว่าตัวแปรล็อกอินและรหัสผู้ใช้ว่างเปล่าหรือไม่
ถ้า (ว่าง ($ _ SESSION ["login"]) หรือว่าง ($ _ SESSION ["id"]))
{
// ถ้าว่างเราจะไม่แสดงลิงค์
echo "คุณเข้าสู่ระบบในฐานะแขก
ลิงค์นี้ใช้ได้เฉพาะผู้ใช้ที่ลงทะเบียน ";
}
อื่น
{

ในไฟล์ index.phpเราจะแสดงลิงค์ที่จะเปิดให้เฉพาะผู้ใช้ที่ลงทะเบียน นี่คือจุดรวมของสคริปต์ - เพื่อจำกัดการเข้าถึงข้อมูลใดๆ

6. มีไฟล์ที่มีการตรวจสอบชื่อผู้ใช้และรหัสผ่านที่ป้อน testreg.php (ความคิดเห็นภายใน):

session_start (); // ขั้นตอนทั้งหมดทำงานบนเซสชัน มันอยู่ที่ข้อมูลของผู้ใช้จะถูกเก็บไว้ในขณะที่เขาอยู่ในไซต์ มันสำคัญมากที่จะต้องเรียกใช้ที่จุดเริ่มต้นของหน้า !!!
if (isset ($ _ POST ["login"])) ($ login = $ _POST ["login"]; if ($ login == "") (unset ($ login);)) // เข้าสู่ระบบที่ป้อน โดยผู้ใช้เข้าสู่ตัวแปร $ เข้าสู่ระบบหากว่างเปล่าเราจะทำลายตัวแปร
if (isset ($ _ POST ["password"])) ($ password = $ _ POST ["password"]; if ($ password == "") (unset ($ password);))
// ใส่รหัสผ่านที่ผู้ใช้ป้อนลงในตัวแปร $ รหัสผ่าน หากว่างเปล่าให้ทำลายตัวแปร
if (ว่างเปล่า ($ เข้าสู่ระบบ) หรือว่างเปล่า ($ รหัสผ่าน)) // หากผู้ใช้ไม่ได้เข้าสู่ระบบหรือรหัสผ่าน เราจะออกข้อผิดพลาดและหยุดสคริปต์
{
exit ("คุณไม่ได้ป้อนข้อมูลทั้งหมด ให้กลับไปกรอกข้อมูลในฟิลด์ทั้งหมด!");
}
// หากเข้าสู่ระบบและรหัสผ่าน เราจะประมวลผลเพื่อให้แท็กและสคริปต์ไม่ทำงาน คุณไม่มีทางรู้ว่าคนอื่นสามารถป้อนอะไรได้
$ เข้าสู่ระบบ = แถบสแลช ($ เข้าสู่ระบบ);
$ เข้าสู่ระบบ = htmlspecialchars ($ เข้าสู่ระบบ);
$ รหัสผ่าน = แถบสแลช ($ รหัสผ่าน);
$ รหัสผ่าน = htmlspecialchars ($ รหัสผ่าน);
// ลบช่องว่างพิเศษ
$ เข้าสู่ระบบ = ตัด ($ เข้าสู่ระบบ);
$ รหัสผ่าน = ตัด ($ รหัสผ่าน);
// เชื่อมต่อกับฐานข้อมูล
รวม ("bd.php"); // ไฟล์ bd.php ต้องอยู่ในโฟลเดอร์เดียวกับคนอื่น ๆ ถ้าไม่ใช่ ก็แค่เปลี่ยนเส้นทาง

$ ผล = mysql_query ("เลือก * จากผู้ใช้ที่เข้าสู่ระบบ =" $ เข้าสู่ระบบ "", $ db); // ดึงข้อมูลจากฐานข้อมูลทั้งหมดเกี่ยวกับผู้ใช้ด้วยการเข้าสู่ระบบที่ป้อน
$ myrow = mysql_fetch_array ($ ผล);
ถ้า (ว่างเปล่า ($ myrow ["รหัสผ่าน"]))
{
// ถ้าไม่มีผู้ใช้ที่ล็อกอินเข้าอยู่
}
อื่น (
// ถ้ามีให้ตรวจสอบรหัสผ่าน
ถ้า ($ myrow ["รหัสผ่าน"] == $ รหัสผ่าน) (
// หากรหัสผ่านตรงกัน เราจะเริ่มเซสชันสำหรับผู้ใช้! คุณสามารถแสดงความยินดีกับเขา เขาเข้ามา!
$ _SESSION ["เข้าสู่ระบบ"] = $ myrow ["เข้าสู่ระบบ"];
$ _SESSION ["id"] = $ myrow ["id"]; // ข้อมูลนี้ถูกใช้บ่อยมาก ดังนั้นผู้ใช้ที่เข้าสู่ระบบจะ "พกพาติดตัวไปด้วย"
echo "คุณเข้าสู่เว็บไซต์เรียบร้อยแล้ว! หน้าแรก";
}
อื่น (
// ถ้ารหัสผ่านไม่ตรงกัน

ออก ("ขออภัย การเข้าสู่ระบบที่คุณป้อนหรือรหัสผ่านไม่ถูกต้อง");
}
}
?>

นั่นคือทั้งหมด! บทเรียนอาจจะน่าเบื่อแต่มีประโยชน์มาก ที่นี่แสดงเฉพาะแนวคิดของการลงทะเบียนเท่านั้นจากนั้นคุณสามารถปรับปรุงได้: เพิ่มการป้องกัน, การออกแบบ, ฟิลด์ข้อมูล, อัพโหลดอวาตาร์, ออกจากระบบบัญชี (สำหรับสิ่งนี้เพียงทำลายตัวแปรจากเซสชันด้วยฟังก์ชั่น ยกเลิกการตั้งค่า) เป็นต้น ขอให้โชคดี!

ฉันตรวจสอบทุกอย่างแล้ว มันใช้งานได้ปกติ!

สุภาพสตรีและสุภาพบุรุษ,

หรือฉันควรจะพูดว่า "สุภาพบุรุษ" กับ "ผู้ชายหัวแข็ง" (ผู้ชายแกร่ง)!

นี่คือ reg.php ล่าสุดของฉัน (รหัสใหม่) ฉันได้แก้ไขโดย:

  • การลบแถบแท็กที่ล้าสมัย mysqli_escape_string
  • พารามิเตอร์อินพุตที่ถูกผูกไว้บนแบบฟอร์มการลงทะเบียนผู้ใช้
  • เพิ่มโค้ด htmlspecialcharacters บนเอาต์พุตเพื่อป้องกันการฉีด sql

ดูสิว่าโค้ดเก่าของฉันรกแค่ไหนก่อนที่โปรแกรมเมอร์จำนวนมากที่นี่และแหล่งข้อมูลอื่นๆ จะช่วยฉันได้ (ขอบคุณทุกคน!)

ตกลง รหัสใหม่ของฉันไม่มีรหัสยืนยันอีเมลและอื่น ๆ อีกมากมาย แต่ฉันจะเพิ่มมันในไม่ช้า ฉันนำมันออกมาที่นี่เพื่อทำให้รหัสใหม่ง่าย ๆ เพื่อให้คุณเข้าใจรหัสได้ง่าย เก็บเพียงพื้นฐานในการแสดงผลครั้งแรก จะเพิ่มสิ่งจำเป็นที่เหลือในการแสดงผลครั้งที่ 2
คุณสามารถให้คำแนะนำใดๆ และวิจารณ์การเข้ารหัสได้ (แต่ไม่ต้องกังวลที่จะแสดงตัวอย่างการปรับปรุงในพื้นที่ที่คุณวิพากษ์วิจารณ์) ตกลง?

รหัสเก่า:

connect_error) (die ($ conn-> connect_error);) // รายละเอียดไซต์ $ site_domain = "site-domain.com"; $ site_name = "ชื่อไซต์"; $ site_admin_email = "admin@site-domain.com"; // ดำเนินการต่อไปนี้เมื่อลงทะเบียนผู้ใช้ "คลิกปุ่มส่ง" if (isset ($ _ POST ["submit"])) (// ตรวจสอบว่าผู้ใช้กรอกฟิลด์ "Username", "Password" และ "Email" หรือไม่ ถ้าไม่ ให้แจ้งเตือนเพื่อกรอกข้อมูล if ( ! ว่างเปล่า ($ _ POST ["member_registration_username"]) &&! ว่างเปล่า ($ _ POST ["member_registration_password"]) &&! ว่างเปล่า ($ _ POST ["member_registration_email"])) ($ member_registration_username = trim (strip_tags (strtolower (mysqli_real_email") $ _POST ["member_registration_username"])))); $ member_registration_password = trim (strip_tags (md5 (mysqli_real_escape_string ($ conn, $ _ POST ["member_registration_password"])))); // ตรวจสอบชื่อผู้ใช้ที่ตรงกันในตารางผู้ใช้ $ sql = "เลือก * จากผู้ใช้โดยที่ชื่อผู้ใช้ =" ". $ Member_registration_username" ""; $ Result = mysqli_query ($ conn, $ sql); // หากชื่อผู้ใช้ตรงกันในคอลัมน์ "ชื่อผู้ใช้" ให้ทำดังต่อไปนี้ . .. if (mysqli_num_rows ($ result)! = 0) (// ให้การแจ้งเตือน "ชื่อผู้ใช้" ถูกใช้ไปแล้ว $ _SESSION ["message"] = "ชื่อผู้ใช้ $ member_registration_username ลงทะเบียนแล้ว!"; exit ();) / / ตรวจสอบสำหรับ r การจับคู่อีเมลในตารางผู้ใช้ $ sql = "เลือก * จากผู้ใช้ WHERE Emails =" ". $ member_registration_email" ""; $ ผล = mysqli_query ($ conn, $ sql); // หากมีชื่อผู้ใช้ที่ตรงกันในคอลัมน์ "ชื่อผู้ใช้" ให้ทำดังต่อไปนี้ ... if (mysqli_num_rows ($ ผล)> 0) (// แจ้งเตือน "อีเมล" ที่ได้รับไปแล้ว $ _SESSION ["message"] = "อีเมลนั้น $ member_registration_email ลงทะเบียนแล้ว!"; ออก ();) // ทิ้ง "ชื่อผู้ใช้", "อีเมล" และ "รหัสผ่าน" ใหม่ลงในตาราง "ผู้ใช้" $ sql = "INSERT INTO ผู้ใช้ (ชื่อผู้ใช้, รหัสผ่าน, อีเมล) VALUES (" ". $ member_registration_username" "," ". $ member_registration_password" "," ". $ member_registration_email." ")"; if ($ sql) (// แจ้งเตือนการดัมพ์รายละเอียดผู้ใช้ใหม่ลงใน db สำเร็จ $ _SESSION ["message"] = "การแทรกข้อมูลลงในตารางสำเร็จ!";) อื่น (// ให้การแจ้งเตือนการถ่ายโอนข้อมูลรายละเอียดผู้ใช้ใหม่ลงใน db a ล้มเหลว $ _SESSION ["message"] = "การแทรกข้อมูลลงในตารางล้มเหลว!";)) อื่น (// แจ้งเตือนให้กรอกข้อมูลทุกช่อง $ _SESSION ["message"] = "คุณต้องกรอกข้อมูลที่ป้อนทั้งหมด field! ";))?> <?php $site_name ?>หน้าลงทะเบียน

แบบฟอร์มลงทะเบียน



รหัสใหม่:

เตรียม ("INSERT INTO tbl_users (ชื่อ, รหัสผ่าน) VALUES (?,?)")) (// ผูกตัวแปรกับพารามิเตอร์เป็นสตริง $ stmt-> bind_param ("ss", $ ชื่อ, $ รหัสผ่าน); / / ดำเนินการคำสั่ง $ Stmt-> ดำเนินการ (); // ปิดคำสั่งที่เตรียมไว้ $ Stmt-> ปิด ();)) อื่น ๆ (// แจ้งเตือนให้กรอกทุกฟิลด์ Echo "คุณต้องกรอกข้อมูล ช่องป้อนข้อมูลทั้งหมด! ";))?> <?php $site_name ?>หน้าลงทะเบียน

แบบฟอร์มลงทะเบียน



เพื่อนโปรแกรมเมอร์ เมื่อดูโค้ดที่ 2 ของฉัน คุณคิดว่า:

  • มันจะดีกว่า;
  • ไม่เกะกะ;
  • เข้าใจมากขึ้น;
  • sql ฉีดฟรี

และในรหัสที่ 2 ของฉัน มีโอกาสใดที่คุณสามารถช่วยฉันแปลงคำสั่ง INSERT sql (บรรทัดที่ 45-55) เป็นสไตล์ mysqli จาก pdo ได้
ฉันได้รับรหัส pdo นั้นจาก:
wikihow.com

วิธีป้องกันการฉีด SQL ใน PHP

การฉีด SQL เป็นหนึ่งในช่องโหว่ที่พบบ่อยที่สุดในแอปพลิเคชันบนเว็บในปัจจุบัน บทความนี้จะแสดงวิธีป้องกันการฉีด SQL บนเว็บไซต์ของคุณ 100% โดยใช้ข้อความสั่งที่เตรียมไว้ใน PHP SQL Injection เป็นประเภทของ ...

เนื่องจากโค้ดส่วนใหญ่ของฉัน ในสคริปต์หลายหน้าของฉัน อยู่ใน mysqli หรือรูปแบบขั้นตอน มันจะดูแปลกถ้า 10 บรรทัดเป็นแบบ pdo หรือ oop
ใช่ ฉันรู้ว่าฉันรู้ ฉันควรทำในรูปแบบ pdo และ oop แต่ฉันยังเป็นมือใหม่และบทเรียนส่วนใหญ่เกี่ยวกับ php พื้นฐานอยู่ใน mysqli และรูปแบบขั้นตอน ดังนั้นฉันยังไม่สามารถเปลี่ยนไปใช้ pdo และ oop ได้ ขอฉัน หัดเดินก่อนแล้วค่อยกระโดดเหมือนจิงโจ้ ฉันยังเด็กอยู่ ต้องทำทีละอย่าง ไม่อย่างนั้นฉันจะสับสนและเลื่อนออกจาก php

คำถาม: ในวันที่ 1 (รหัสเก่า) ของฉัน คุณจะเห็นว่าฉันไม่ได้ใช้ echo "แต่" ข้อความเซสชัน "แทนที่จะเป็น 2 บทช่วยสอนของ youtube ที่แสดงให้เห็นว่าทำแบบนั้นโดยไม่ได้ให้คำอธิบายใดๆ ว่าทำไม ดังนั้น ฉันจึงถาม:

  1. อะไรคือความแตกต่างและประโยชน์ (ข้อดี) เช่นเดียวกับข้อเสียระหว่างเสียงสะท้อนและข้อความเซสชัน?
  2. ฉันควรใช้ตัวใดตัวหนึ่งเมื่อใด


© 2021 skypenguin.ru - เคล็ดลับในการดูแลสัตว์เลี้ยง