สร้างเซสชั่น PHP การป้องกัน ID เซสชันใน PHP ตัวอย่างการใช้งานเซสชัน

7.7K

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

เซสชั่น PHP คืออะไร?

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

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

เมื่อสร้างเซสชัน PHP จะต้องดำเนินการสามขั้นตอนต่อไปนี้:

  • เมื่อมีการสร้างเซสชัน PHP จะสร้างตัวระบุที่ไม่ซ้ำกัน ซึ่งเป็นสตริงสุ่มที่มีเลขฐานสิบหก 32 ตัว รหัสอายุการใช้งานเซสชัน PHP มีลักษณะดังนี้: 9c8foj87c3jj973actop1re472e8774;
  • เซิร์ฟเวอร์ส่งคุกกี้ที่เรียกว่า PHPSESSID ไปยังคอมพิวเตอร์ของผู้ใช้เพื่อจัดเก็บสตริงตัวระบุเซสชันที่ไม่ซ้ำกัน
  • เซิร์ฟเวอร์สร้างไฟล์ในไดเร็กทอรีชั่วคราวที่ระบุซึ่งมีชื่อของตัวระบุเซสชันที่ไม่ซ้ำกันพร้อมคำนำหน้า เซสชั่น_g sess_9c8foj87c3jj973actop1re472e8774.

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

ผู้ใช้สามารถสิ้นสุดเซสชันได้โดยคลิกปุ่มออกจากระบบ ซึ่งเรียกใช้ฟังก์ชัน session_destroy() เมื่อผู้ใช้ปิดเบราว์เซอร์ เซสชัน PHP จะถูกปิดโดยอัตโนมัติ มิฉะนั้นเซิร์ฟเวอร์จะยุติเซสชันหลังจากระยะเวลาที่กำหนด

ไวยากรณ์เซสชันใน PHP

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

การดำเนินการเซสชัน

เราจะดูการดำเนินการต่อไปนี้โดยใช้เซสชัน PHP รวมถึงตัวอย่างการดำเนินการเหล่านี้

  • การเริ่มต้นเซสชัน PHP และการตั้งค่าตัวแปรเซสชัน:เซสชัน PHP ใหม่เริ่มต้นโดยใช้ฟังก์ชัน session_start() เมื่อสร้างเซสชันแล้ว ตัวแปรเซสชันสามารถตั้งค่าได้โดยใช้ $_SESSION เราได้กำหนดค่าให้กับตัวแปรต่างๆ” รหัสผู้ใช้” — “php_user.php" และ " รหัสผ่าน” — “บทช่วยสอน”:

เซสชัน PHP - การสร้าง เซสชั่น PHP เริ่มต้นแล้วและตัวแปรเซสชั่นได้รับการตั้งค่าแล้ว!"; ?>

ผลลัพธ์: การรันโค้ด PHP ข้างต้นบนเซิร์ฟเวอร์จะสร้างข้อความต่อไปนี้:

  • รับค่าตัวแปรเซสชัน PHP: สามารถรับค่าของตัวแปรที่เราตั้งไว้ระหว่างการเข้าสู่ระบบ PHP ครั้งล่าสุดได้ เมื่อเราเปิดเซสชั่น PHP ที่จุดเริ่มต้นของแต่ละหน้า ( เซสชั่น_เริ่มต้น()) จะต้องระบุรหัสด้านล่าง เราดึงและแสดงค่าเหล่านี้โดยใช้ตัวแปรโกลบอล $_SESSION:

เซสชัน PHP - รับค่า
"; echo "รหัสผ่าน - " . $_SESSION["รหัสผ่าน"] . ""; ?>

ผลลัพธ์: เมื่อเรารันโค้ด PHP ข้างต้นบนเซิร์ฟเวอร์ เราจะได้รับข้อความต่อไปนี้ ค่าของตัวแปรเซสชันที่เราตั้งค่าไว้ก่อนหน้านี้หลังจากสร้างเซสชัน PHP จะปรากฏขึ้น

  • การอัพเดตค่าตัวแปรเซสชัน PHP: ในระหว่างเซสชัน คุณสามารถอัปเดตค่าของตัวแปรได้ ก่อนอื่นเราต้องเปิดเซสชั่น PHP ที่จุดเริ่มต้นของแต่ละหน้า ( เซสชั่น_เริ่มต้น()- ในโค้ดด้านล่างนี้เราอัพเดตค่าของตัวแปรต่างๆ “ รหัสผู้ใช้” — “new_php_user" และ " รหัสผ่าน” — “การศึกษา”.

คุณสามารถพิมพ์อาร์เรย์ของตัวแปรเซสชันและค่าของมันได้โดยใช้ฟังก์ชัน print_r($ _SESSION) ดังที่แสดงด้านล่าง:

เซสชัน PHP - การเปลี่ยนค่า
"; print_r($_SESSION); ?>

ผลลัพธ์: เมื่อเรารันโค้ด PHP ข้างต้นบนเซิร์ฟเวอร์ เราจะได้รับข้อความต่อไปนี้ โดยจะมีอาร์เรย์ของตัวแปรเซสชันพร้อมค่าใหม่

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

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

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

ในบทความนี้ ฉันจะพยายามสรุปวิธีการทั้งหมดที่ฉันรู้เพื่อปกป้อง ID เซสชันใน PHP

การใช้คุกกี้

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

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

เปิด Php_flag session.use_only_cookies

การใช้การเข้ารหัส

หากเว็บไซต์ของคุณต้องประมวลผลข้อมูลที่ละเอียดอ่อน เช่น หมายเลขบัตรเครดิต (สวัสดีจาก Sony) คุณควรใช้การเข้ารหัส SSL3.0 หรือ TSL1.0 เมื่อต้องการทำเช่นนี้ เมื่อตั้งค่าคุกกี้ คุณต้องระบุจริงสำหรับพารามิเตอร์ที่ปลอดภัย

หากคุณจัดเก็บรหัสผ่านเซสชันไว้ในตัวแปร $_SESSION (ยังดีกว่าถ้าใช้ sql) คุณไม่ควรจัดเก็บเป็นข้อความที่ชัดเจน

ถ้า ($_SESSION["รหัสผ่าน"] == $userpass) ( // รหัส )

รหัสข้างต้นไม่ปลอดภัยเนื่องจากรหัสผ่านถูกจัดเก็บเป็นข้อความธรรมดาในตัวแปรเซสชัน ให้ใช้การเข้ารหัส md5 แทน ดังนี้:

ถ้า ($_SESSION["md5password"] == md5($userpass)) ( // รหัส )

ตรวจสอบเบราว์เซอร์

หากต้องการบล็อกความเป็นไปได้ในการใช้เซสชันจากเบราว์เซอร์อื่น (คอมพิวเตอร์) คุณควรตรวจสอบช่องส่วนหัว HTTP ของ user-agent:

Session_start(); if (isset($_SESSION["HTTP_USER_AGENT"])) ( if ($_SESSION["HTTP_USER_AGENT"] != md5($_SERVER["HTTP_USER_AGENT"])) ( // รหัส ) ) else ( $_SESSION["HTTP_USER_AGENT" ] = md5($_SERVER["HTTP_USER_AGENT"] )

วันหมดอายุของเซสชัน

จำกัดอายุการใช้งานของเซสชัน เช่นเดียวกับอายุการใช้งานของคุกกี้ ตามค่าเริ่มต้น ระยะเวลาเซสชันคือ 1440 วินาที คุณสามารถเปลี่ยนค่านี้ผ่าน php.ini และ .htaccess ตัวอย่างสำหรับ .htaccess:

# อายุการใช้งานเซสชันเป็นวินาที
php_value session.gc_maxlifetime 3600
# อายุการใช้งานคุกกี้ในไม่กี่วินาที
php_value เซสชัน.cookie_lifetime 3600

ผูกมัดตามที่อยู่ IP

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

รวม("ip_list.php"); //$ip_white_list = array ("admin1" => "111.222.333.444", "admin2" => "555.666.777.888"); if(!empty(array_search($_SERVER["REMOTE_ADDR"],$ip_white_list))) ( header("Location: admin.php"); ) else ( echo "ACCESS DENY!"; )

หรือตามที่อยู่ IP สำหรับแต่ละคำขอ (สำหรับ IP แบบคงที่เท่านั้น):

ถ้า(isset($_SESSION["ip"]) และ $_SESSION["ip"] == $_SERVER["REMOTE_ADDR"]) ( header("Location: admin.php"); ) else ( session_unset(); $ _SESSION["ip"] = $_SERVER["REMOTE_ADDR"] )

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

เซสชันใน PHP หรือเป็นข้อมูลเกี่ยวกับผู้ใช้หรือลูกค้าที่เยี่ยมชมไซต์จะถูกบันทึกไว้เมื่อย้ายไปมาระหว่างหน้าต่างๆ ของไซต์โดยไม่ยาก บทเรียนมีความสำคัญมาก เกี่ยวข้องกับการสร้างเว็บไซต์ 95%

เซสชันใน php.ini คืออะไร

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

ตรรกะของเซสชัน

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

ตัวอย่างงาน
1. ผู้ใช้เข้าสู่ระบบและรหัสผ่านและเข้าสู่เว็บไซต์
2. ข้อมูลที่มีการเข้าสู่ระบบและรหัสผ่านจะถูกบันทึกไว้ในเซสชันของหน้าเว็บไซต์ใดหน้าหนึ่ง:

ไฟล์ ดัชนี.php

Session_start(); // แต่ละไฟล์ที่คุณต้องการใช้ข้อมูลเซสชันจะต้องมีคำสั่ง "เริ่มต้นเซสชัน" ที่จุดเริ่มต้นของโค้ด

$เข้าสู่ระบบ = "ผู้ดูแลระบบ";
$password = "ผ่าน";
$_SESSION["login"] = $login; // บันทึกตัวแปรที่มีการเข้าสู่ระบบ
$_SESSION["รหัสผ่าน"] = $รหัสผ่าน; // บันทึกตัวแปรที่มีรหัสผ่าน

3. เมื่อคุณไปที่หน้าอื่นของไซต์ ข้อมูลนี้จะพร้อมใช้งานด้วย:

ไฟล์ ตัวอย่าง.php(หรือหน้าอื่นๆ)

Echo "ข้อมูลเข้าสู่ระบบของคุณ ".$_SESSION["เข้าสู่ระบบ"]; // จะแสดง "ข้อมูลเข้าสู่ระบบของคุณคือผู้ดูแลระบบ" แม้ว่าเราจะไม่ได้บันทึกข้อมูลใดๆ ในหน้านี้ก็ตาม!
เห็นไหม ง่ายนิดเดียว!

4. หากคุณต้องการล้างข้อมูลเซสชัน สิ่งที่คุณต้องทำคือ:

ไฟล์ ตัวอย่าง.php

Session_start(); // "เริ่มเซสชัน" อีกครั้ง

ยกเลิกการตั้งค่า($_SESSION["เข้าสู่ระบบ"]); // นี่คือวิธีที่ตัวแปรไม่ได้ลงทะเบียนหรือ "ทำลาย"
echo "ข้อมูลเข้าสู่ระบบของคุณ ".$_SESSION["เข้าสู่ระบบ"]; // จะแสดง "ข้อมูลเข้าสู่ระบบของคุณ" เนื่องจากเราทำลายมันในบรรทัดสุดท้าย จึงไม่มีข้อมูล

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

การส่งผ่านค่าหรืออาร์เรย์โดยใช้เซสชัน PHP

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

เราใช้หน้าเริ่มต้นที่แน่นอนอีกครั้ง ดัชนี.php

Session_start();

$r = array("หนึ่ง", "สอง", "สาม");

$_SESSION["arr"] = $r;

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

ไฟล์ปลายทางเพจ ทดสอบ.phpที่เราเปิดอาร์เรย์

Session_start();
print_r($_SESSION["arr"]);
//จะพิมพ์.
/*
อาร์เรย์
=> หนึ่ง
=> สอง
=> สาม
*/
?>
คุณอาจต้องการทบทวนบทเรียนเรื่อง โดยทั่วไปแล้วทุกอย่างควรมีความชัดเจน

ฟังก์ชั่นอื่น ๆ สำหรับการทำงานกับเซสชัน

session_unregister (สตริง)- เซสชันลืมค่าของตัวแปรโกลบอลที่ระบุ
เซสชั่น_ทำลาย()- เซสชันถูกทำลาย (เช่น หากผู้ใช้ออกจากระบบโดยคลิกปุ่มออก)
session_set_cookie_params (อายุการใช้งาน int [, เส้นทางสตริง [, โดเมนสตริง]])- การใช้ฟังก์ชันนี้คุณสามารถกำหนดระยะเวลาที่เซสชันจะคงอยู่ได้โดยการตั้งค่า unix_timestamp ที่กำหนดเวลาที่เซสชันจะสิ้นสุดลง

รายการฟังก์ชั่นสำหรับการทำงานกับเซสชันใน php
session_cache_expire - ส่งคืนการหมดอายุของแคชปัจจุบัน
session_cache_limiter - รับและ/หรือตั้งค่าตัวจำกัดแคชปัจจุบัน
session_commit เป็นนามแฝงสำหรับ session_write_close()
session_decode - ถอดรหัสข้อมูลเซสชันจากสตริง
session_destroy - ทำลายข้อมูลทั้งหมดที่ลงทะเบียนสำหรับเซสชัน
session_encode - เข้ารหัสข้อมูลเซสชันปัจจุบันเป็นสตริง
session_get_cookie_params - รับพารามิเตอร์คุกกี้เซสชัน
session_id - รับและ/หรือตั้งค่ารหัสเซสชันปัจจุบัน
session_is_registered - กำหนดว่าตัวแปรถูกลงทะเบียนในเซสชันหรือไม่
session_module_name - รับและ/หรือตั้งค่าโมดูลเซสชันปัจจุบัน
session_name - รับและ/หรือตั้งชื่อเซสชันปัจจุบัน
session_regenerate_id - แก้ไขรหัสเซสชันปัจจุบันด้วยรหัสที่สร้างขึ้นใหม่
session_register - ลงทะเบียนตัวแปรตั้งแต่หนึ่งตัวขึ้นไปสำหรับเซสชันปัจจุบัน
session_save_path - รับและ/หรือกำหนดเส้นทางเพื่อบันทึกเซสชันปัจจุบัน
session_set_cookie_params - ตั้งค่าพารามิเตอร์คุกกี้เซสชัน
session_set_save_handler - ตั้งค่าฟังก์ชันการจัดเก็บเซสชันระดับผู้ใช้
session_start - เริ่มต้นข้อมูลเซสชัน
session_unregister - ยกเลิกการลงทะเบียนตัวแปรจากเซสชันปัจจุบัน
session_unset - เผยแพร่ตัวแปรเซสชันทั้งหมด
session_write_close - เขียนข้อมูลเซสชันและสิ้นสุดเซสชัน

ตัวอย่างงานเซสชั่น

การนับจำนวนการดูหน้าเว็บระหว่างเซสชัน ตัวอย่างงานที่ชัดเจน อย่างไรก็ตาม หลังจากปิดเบราว์เซอร์แล้ว การนับถอยหลังจะเริ่มต้นอีกครั้ง

จำนวนการเข้าชมหนึ่งหน้าภายในหนึ่งเซสชัน

// ตัวอย่างง่ายๆ ของการใช้เซสชันโดยไม่มีคุกกี้
session_name("ทดสอบ");
session_start();
$_SESSION["นับ"] = @$_SESSION["นับ"] + 1;
?>

เคาน์เตอร์


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

ขอบคุณสำหรับความสนใจของคุณ! ขอให้โชคดีในความพยายามของคุณ!

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

ดัชนี.php dothings.php

หากเราเรียกใช้สคริปต์ทั้งสองนี้ ในหน้าแรกเราจะเห็นข้อความว่า "ฉันได้รับมอบหมายให้ทำดัชนี.php" และหน้าที่สองจะว่างเปล่า

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

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

วิธีการทำงานกับเซสชั่น?

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

"คำเตือน: open(/var/state/php/sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR) ล้มเหลว: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว (2)"

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

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

Session_start();

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

Session_start(); - ... หากต้องการตั้งค่าไดเร็กทอรีที่จะบันทึกไฟล์เซสชัน ให้ใช้ฟังก์ชัน session_save_path(): session_save_path($_SERVER["DOCUMENT_ROOT"]."/session"); session_start();

หลังจากเซสชันเริ่มต้น คุณสามารถตั้งค่าตัวแปรร่วมได้

ดัชนี.php เมื่อกำหนดค่าใดๆ ให้กับฟิลด์ใดๆ ของอาร์เรย์ $_SESSION ตัวแปรที่มีชื่อเดียวกันจะถูกลงทะเบียนเป็นตัวแปรเซสชันโดยอัตโนมัติ

dothings.php

อาร์เรย์นี้มีอยู่ในทุกหน้าโดยใช้เซสชัน ตัวอย่างเช่น ลองดูที่โปรแกรม:

ทุกอย่างเรียบร้อยดี โหลดเซสชันแล้ว!

มาดูกันว่ามีอะไรบ้าง:

เมื่อเรียกใช้ไฟล์เหล่านี้ตามลำดับ สคริปต์แรก "index.php" จะให้ผลลัพธ์ดังต่อไปนี้:

ทุกอย่างเรียบร้อยดี โหลดเซสชันแล้ว! มาดูกันว่ามีอะไรบ้าง:

และ “dothings.php” ตัวที่สองคือ:

  • ฉันถูกขอให้ทำดัชนี.phpขณะนี้ตัวแปร $a พร้อมใช้งานบนทุกหน้าของไซต์ที่ระบุซึ่งเปิดใช้เซสชันแล้ว
  • คุณสมบัติและเทคนิคที่เป็นประโยชน์อื่นๆ สำหรับการทำงานกับเซสชัน:ไม่ได้ตั้งค่า($_SESSION["a"])
  • - เซสชัน "ลืม" ค่าของตัวแปรเซสชันที่ระบุ- การใช้ฟังก์ชันนี้คุณสามารถกำหนดระยะเวลาที่เซสชันจะ "คงอยู่" ได้โดยการตั้งค่า unix_timestamp ซึ่งจะกำหนดเวลา "สิ้นสุด" ของเซสชัน ตามค่าเริ่มต้น เซสชันจะ "ถ่ายทอดสด" จนกว่าไคลเอ็นต์จะปิดหน้าต่างเบราว์เซอร์
  • session_write_close()- บันทึกตัวแปรเซสชั่นและปิดมัน

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

ตัวอย่าง

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

การอนุญาตผู้ใช้

คำถามเกี่ยวกับการอนุญาตผู้ใช้โดยใช้เซสชัน PHP จะถูกถามอย่างต่อเนื่องในการประชุมการเขียนโปรแกรมเว็บ กลไกในการอนุญาตผู้ใช้ในระบบโดยใช้เซสชันค่อนข้างดีจากมุมมองด้านความปลอดภัย (ดูหัวข้อ)

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

ใส่รหัสผ่านของคุณ
เข้าสู่ระบบ:


รหัสผ่าน: authorize.php หน้า... header("ตำแหน่ง: secretplace.php");

ออก; ) ) // หากมีบางอย่างผิดปกติผู้ใช้จะได้รับ // ​​ข้อความแสดงข้อผิดพลาด-

ความปลอดภัย

คุณป้อนรหัสผ่านผิด!

  • Secretplace.php
  • สวัสดี,
  • ,คุณอยู่ในเพจลับ!!! -

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

มีโทรจันในคอมพิวเตอร์ของผู้ใช้ที่ขโมยหมายเลขเซสชัน

  • ผู้โจมตีสกัดกั้นการรับส่งข้อมูลระหว่างคอมพิวเตอร์ของผู้ใช้และเซิร์ฟเวอร์ แน่นอนว่ามีโปรโตคอล SSL ที่ปลอดภัย (เข้ารหัส) แต่ไม่ใช่ทุกคนที่ใช้มัน
  • ไฟล์ Secretplace.php เป็นความพยายามที่จะหลอกลวงโปรแกรมโดยการป้อนค่าของตัวแปร $logged_user ในแถบที่อยู่ของเบราว์เซอร์ เช่น:
    "http://www.yoursite.ru/secretplace.php? logged_user=แฮ็กเกอร์"

ดังนั้น "รู" สองอันจึงมองเห็นได้ชัดเจนในโปรแกรมของเรา อันหนึ่งมีขนาดเล็กและไม่สังเกตเห็นได้ชัดเจนเป็นพิเศษ แต่อันที่สองนั้นใหญ่มาก ซึ่งแฮกเกอร์ส่วนใหญ่เข้าไปในที่ที่พวกเขาไม่จำเป็นต้องไป

จะ “ปะ” หลุมหมายเลข 1 ได้อย่างไร?

เราจะไม่เขียนโค้ดจำนวนมากเพื่อบล็อกที่อยู่ IP ฯลฯ แต่เพียงตรวจสอบว่าคำขอมาจากที่ใด หรือค่อนข้างชัดเจนว่าคำขอนั้นมาจากหน้าใด หากเป็นหน้าใด ๆ จากไซต์ของเรา ทุกอย่างเรียบร้อยดี แต่ใน กรณีอื่น ๆ ทั้งหมดเราจะไม่ให้คุณเข้า มาปรับไฟล์ authorize.php กัน:

authorize.php V2 หน้า... header("ตำแหน่ง: secretplace.php"); หน้า... header("ตำแหน่ง: secretplace.php");


ออก;

- จะกำจัด “รู” หมายเลข 2 ได้อย่างไร?สมมติว่าคุณมีเว็บไซต์ที่ทุกคนสามารถลงทะเบียนเพื่อโพสต์ในฟอรัมได้

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

?user_status=10 - คุณมีผู้ดูแลระบบคนใหม่ในฟอรัมของคุณ! ) ) // หากมีบางอย่างผิดปกติผู้ใช้จะได้รับ // ​​ข้อความแสดงข้อผิดพลาดตามหลักการแล้ว ตัวแปรสคริปต์ใดๆ สามารถตั้งค่าผ่านแถบที่อยู่ได้โดยเพียงแค่เพิ่มเครื่องหมายคำถามและชื่อของตัวแปรพร้อมค่าของมันหลังที่อยู่แบบเต็มของสคริปต์ มาแก้ไขโค้ดของเราเพื่อหลีกเลี่ยงสิ่งนี้:

Secretplace.php V2

ตัวแปรไม่ได้ตั้งค่า($_SESSION["logged_user"]);

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

?>
// แทรก SID ลงในลิงก์โดยอัตโนมัติ ini_set("session.use_trans_sid", จริง); session_start(); - คลิกที่นี่!
คลิกที่นี่!!



// ตัวอย่างการทำงานกับเซสชัน session_start(); // หากคุณเพิ่งเยี่ยมชมไซต์ ให้รีเซ็ตตัวนับ ถ้า (!isset($_SESSION["count"])) $_SESSION["count"] = 0; //เพิ่มตัวนับในเซสชัน $_SESSION["นับ"] = $_SESSION["นับ"] + 1; -

เคาน์เตอร์

เวลา
ปิดเบราว์เซอร์ของคุณเพื่อรีเซ็ตตัวนับ
" target="_blank"> เปิดหน้าต่างเบราว์เซอร์ลูก
// ตัวอย่างง่ายๆ ของการใช้เซสชันโดยไม่มีคุกกี้ session_name("ทดสอบ"); session_start(); $_SESSION["นับ"] = @$_SESSION["นับ"] + 1; -

เคาน์เตอร์

คุณได้เปิดหน้านี้ในเซสชันเบราว์เซอร์ปัจจุบันของคุณเวลา
ปิดเบราว์เซอร์ของคุณเพื่อรีเซ็ตตัวนับนี้
?">คลิกที่นี่เพื่อรีเฟรชหน้า!

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

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

ตามค่าเริ่มต้น PHP จะใช้ตัวจัดการไฟล์ภายในเพื่อบันทึกเซสชัน ซึ่งตั้งค่าไว้ในตัวแปร session.save_handler INI

ตัวจัดการนี้จะบันทึกข้อมูลบนเซิร์ฟเวอร์ในไดเร็กทอรีที่ระบุในคำสั่งการกำหนดค่า session.save_path สามารถเริ่มเซสชันได้ด้วยตนเองโดยใช้ฟังก์ชันเซสชั่น_เริ่มต้น()

- หากตั้งค่าคำสั่ง session.auto_start เป็น 1 เซสชันจะเริ่มต้นโดยอัตโนมัติเมื่อเริ่มต้นคำขอ เซสชันมักจะยุติลงเมื่อ PHP รันสคริปต์เสร็จสิ้น แต่สามารถยุติได้ด้วยตนเองโดยใช้ฟังก์ชันนี้.

session_write_close()

คำเตือน

ความสนใจ:

ความคิดเห็น สามารถเริ่มเซสชันได้ด้วยตนเองโดยใช้ฟังก์ชันหรือทางอ้อมโดยระบุ session.auto_start เซสชันมักจะยุติลงเมื่อ PHP รันสคริปต์เสร็จสิ้น แต่สามารถยุติได้ด้วยตนเองโดยใช้ฟังก์ชันนี้.

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