เมื่อใช้เซสชัน 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 ที่จุดเริ่มต้นของแต่ละหน้า ( เซสชั่น_เริ่มต้น()) จะต้องระบุรหัสด้านล่าง เราดึงและแสดงค่าเหล่านี้โดยใช้ตัวแปรโกลบอล $_SESSION:
"; echo "รหัสผ่าน - " . $_SESSION["รหัสผ่าน"] . ""; ?>
ผลลัพธ์: เมื่อเรารันโค้ด PHP ข้างต้นบนเซิร์ฟเวอร์ เราจะได้รับข้อความต่อไปนี้ ค่าของตัวแปรเซสชันที่เราตั้งค่าไว้ก่อนหน้านี้หลังจากสร้างเซสชัน PHP จะปรากฏขึ้น
- การอัพเดตค่าตัวแปรเซสชัน PHP: ในระหว่างเซสชัน คุณสามารถอัปเดตค่าของตัวแปรได้ ก่อนอื่นเราต้องเปิดเซสชั่น PHP ที่จุดเริ่มต้นของแต่ละหน้า ( เซสชั่น_เริ่มต้น()- ในโค้ดด้านล่างนี้เราอัพเดตค่าของตัวแปรต่างๆ “ รหัสผู้ใช้” — “new_php_user" และ " รหัสผ่าน” — “การศึกษา”.
คุณสามารถพิมพ์อาร์เรย์ของตัวแปรเซสชันและค่าของมันได้โดยใช้ฟังก์ชัน print_r($ _SESSION) ดังที่แสดงด้านล่าง:
"; 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;
?>
เคาน์เตอร์
คุณได้เปิดหน้านี้ในเซสชันเบราว์เซอร์ปัจจุบันของคุณ
=$_SESSION["count"]?>เวลา
ปิดเบราว์เซอร์ของคุณเพื่อรีเซ็ตตัวนับนี้
คลิกที่นี่เพื่ออัพเดตเพจ!
ในแต่ละช่วงการเปลี่ยนภาพ ตัวนับจะเพิ่มขึ้น 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; -
เคาน์เตอร์
=$_SESSION["count"]?>เวลาปิดเบราว์เซอร์ของคุณเพื่อรีเซ็ตตัวนับ
" target="_blank"> เปิดหน้าต่างเบราว์เซอร์ลูก
// ตัวอย่างง่ายๆ ของการใช้เซสชันโดยไม่มีคุกกี้ session_name("ทดสอบ"); session_start(); $_SESSION["นับ"] = @$_SESSION["นับ"] + 1; -
เคาน์เตอร์
คุณได้เปิดหน้านี้ในเซสชันเบราว์เซอร์ปัจจุบันของคุณ=$_SESSION["count"]?>เวลาปิดเบราว์เซอร์ของคุณเพื่อรีเซ็ตตัวนับนี้
?=SID?>">คลิกที่นี่เพื่อรีเฟรชหน้า!
เซสชันเป็นวิธีง่ายๆ ในการจัดเก็บข้อมูลสำหรับผู้ใช้แต่ละรายด้วยตัวระบุเซสชันที่ไม่ซ้ำกัน สามารถใช้เพื่อบันทึกสถานะระหว่างคำขอเพจ โดยทั่วไปรหัสเซสชันจะถูกส่งไปยังเบราว์เซอร์ผ่านคุกกี้เซสชัน และใช้เพื่อดึงข้อมูลเซสชันที่มีอยู่ การไม่มีรหัสเซสชันหรือคุกกี้เซสชันจะบอก 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 เป็นจำนวนมากและทำการร้องขอหลายรายการพร้อมกัน วิธีที่ง่ายที่สุดในการแก้ปัญหานี้คือการเรียกใช้ฟังก์ชัน