เซสชัน PHP และคุกกี้ PHP พร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

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

  • 🍪 คุกกี้คืออะไร: คุกกี้เป็นไฟล์ขนาดเล็ก ไม่เกิน 4KB ที่เซิร์ฟเวอร์จัดเก็บไว้ในเครื่องไคลเอนต์ และจะถูกส่งกลับมาพร้อมกับการร้องขอครั้งต่อๆ ไป
  • 🗄️ การอบรมแต่ละครั้งมีอะไรบ้าง: เซสชันจะจัดเก็บข้อมูลบนเซิร์ฟเวอร์ภายใต้รหัสประจำตัวที่ไม่ซ้ำกัน ซึ่งเก็บไว้ในอาร์เรย์ $_SESSION และอ้างอิงโดยคุกกี้เซสชัน
  • 🆚 ความแตกต่างที่สำคัญ: คุกกี้จะจัดเก็บอยู่บนเครื่องไคลเอนต์และเหมาะสำหรับข้อมูลขนาดเล็กที่ไม่ละเอียดอ่อน ในขณะที่เซสชันจะจัดเก็บอยู่บนเครื่องเซิร์ฟเวอร์และเก็บข้อมูลขนาดใหญ่หรือข้อมูลส่วนตัว
  • 🛠️ การสร้างคุกกี้: ฟังก์ชัน setcookie() จะกำหนดชื่อ ค่า และตัวเลือกเพิ่มเติม เช่น วันหมดอายุ เส้นทาง โดเมน ความปลอดภัย และแฟล็ก httponly ก่อนที่จะแสดงผล HTML ใดๆ
  • 📝 การสร้างเซสชัน: session_start() จะเริ่มต้นเซสชัน จากนั้นคุณจะอ่านและเขียนค่าผ่านอาร์เรย์ซูเปอร์โกลบอล $_SESSION
  • 🗑️ การทำความสะอาด: ยกเลิกคุกกี้โดยการตั้งเวลาในอดีต สิ้นสุดเซสชันด้วย session_destroy() หรือล้างค่าหนึ่งค่าด้วย unset()
  • 🤖 AI ช่วยเหลือ: เครื่องมือ AI สามารถนำไปใช้ในการจัดการเซสชันอย่างปลอดภัย และตรวจจับจุดอ่อนของคุกกี้หรือเซสชันในโค้ด PHP ที่มีอยู่ได้

คุกกี้และเซสชันของ PHP

คุกกี้คืออะไร?

คุกกี้เป็นไฟล์ขนาดเล็กที่มีขนาดสูงสุด 4KB ซึ่งเว็บเซิร์ฟเวอร์จะจัดเก็บไว้ในคอมพิวเตอร์ของลูกค้า

เมื่อตั้งค่าคุกกี้แล้ว คำขอเพจทั้งหมดที่ตามมาจะส่งคืนชื่อและค่าคุกกี้

คุกกี้สามารถอ่านได้จากโดเมนที่ออกคุกกี้นั้นเท่านั้น ตัวอย่างเช่น คุกกี้ที่ตั้งค่าโดยใช้โดเมน www.guru99.com ไม่สามารถอ่านได้จากโดเมนอื่น อาชีพ.guru99.com.

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

คุกกี้ที่สร้างโดยผู้ใช้สามารถมองเห็นได้เพียงพวกเขาเท่านั้น ผู้ใช้รายอื่นไม่สามารถมองเห็นคุณค่าของมันได้

เว็บเบราว์เซอร์ส่วนใหญ่มีตัวเลือกในการปิดใช้งานคุกกี้ คุกกี้จากบุคคลที่สาม หรือทั้งสองอย่าง

หากเป็นเช่นนั้น PHP จะตอบกลับโดยการส่งโทเค็นคุกกี้ไปใน URL.

แผนภาพด้านล่างแสดงวิธีการทำงานของคุกกี้

คุกกี้คืออะไร

ที่นี่

1) ผู้ใช้ร้องขอหน้าเว็บที่จัดเก็บคุกกี้

2) เซิร์ฟเวอร์ตั้งค่าคุกกี้บนคอมพิวเตอร์ของผู้ใช้

3) คำขอหน้าอื่นจากผู้ใช้จะส่งคืนชื่อคุกกี้และค่า

เพราะเหตุใดและเมื่อใดจึงควรใช้คุกกี้?

  • HTTP เป็นโปรโตคอลที่ไม่มีสถานะ (stateless) คุกกี้ช่วยให้เราสามารถ... track คือการแสดงสถานะของแอปพลิเคชันโดยใช้ไฟล์ขนาดเล็กที่จัดเก็บไว้ในคอมพิวเตอร์ของผู้ใช้ ตำแหน่งที่จัดเก็บคุกกี้จะขึ้นอยู่กับเบราว์เซอร์ โดยปกติ Internet Explorer จะจัดเก็บไว้ในโฟลเดอร์ไฟล์อินเทอร์เน็ตชั่วคราว (Temporary Internet Files)
  • การปรับแต่งประสบการณ์การใช้งานของผู้ใช้ – ทำได้โดยการอนุญาตให้ผู้ใช้เลือกการตั้งค่าที่ต้องการ การร้องขอหน้าเว็บที่ตามมาจะได้รับการปรับแต่งตามการตั้งค่าที่กำหนดไว้ในคุกกี้
  • Tracking หน้าเว็บที่ผู้ใช้เข้าชม

การสร้างคุกกี้

ต่อไปนี้เราจะมาดูไวยากรณ์พื้นฐานที่ใช้ในการสร้างคุกกี้กัน

<?php

setcookie(cookie_name, cookie_value, [expiry_time], [cookie_path], [domain], [secure], [httponly]);

?>

ที่นี่

  • “เซ็ตคุกกี้” คือ ฟังก์ชั่น PHP ใช้ในการสร้างคุกกี้
  • “cookie_name” คือชื่อของคุกกี้ที่เซิร์ฟเวอร์จะใช้ในการดึงค่าจากตัวแปรอาร์เรย์ $_COOKIE ค่านี้เป็นสิ่งที่จำเป็น
  • "cookie_value" คือค่าของคุกกี้ และเป็นค่าที่จำเป็นต้องระบุ
  • "[expiry_time]" เป็นตัวเลือกเสริม สามารถใช้เพื่อกำหนดเวลาหมดอายุของคุกกี้ เช่น 1 ชั่วโมง โดยกำหนดเวลาด้วยฟังก์ชัน time() ของ PHP บวกหรือลบจำนวนวินาทีที่มากกว่า 0 เช่น time() + 3600 สำหรับ 1 ชั่วโมง
  • “[cookie_path]” เป็นทางเลือก; สามารถใช้เพื่อกำหนดเส้นทางคุกกี้บนเซิร์ฟเวอร์ เครื่องหมายทับ “/” หมายความว่าคุกกี้จะพร้อมใช้งานบนทั้งโดเมน ไดเรกทอรีย่อยจำกัดการเข้าถึงคุกกี้ในโดเมนย่อย
  • “[โดเมน]” เป็นตัวเลือกเสริม สามารถใช้เพื่อกำหนดลำดับชั้นการเข้าถึงคุกกี้ได้ เช่น www.cookiedomain.com หมายถึงโดเมนทั้งหมดในขณะที่ www.sub.cookiedomain.com จำกัดการเข้าถึงคุกกี้ www.sub.cookiedomain.com และโดเมนย่อยของมัน
  • “[secure]” เป็นตัวเลือกเสริม ค่าเริ่มต้นคือ false ใช้เพื่อกำหนดว่าคุกกี้จะถูกส่งผ่าน HTTPS หากตั้งค่าเป็น true หรือผ่าน HTTP หากตั้งค่าเป็น false
  • “[httponly]” เป็นตัวเลือกเสริม หากตั้งค่าเป็น true ภาษาเขียนสคริปต์ฝั่งไคลเอ็นต์ เช่น Javaต้นฉบับ ไม่สามารถเข้าถึงคุกกี้ได้

หมายเหตุ ฟังก์ชัน setcookie ของ PHP ต้องถูกเรียกใช้งานก่อนแท็กเปิดของ HTML

ต่อไปนี้เราจะมาดูตัวอย่างที่ใช้คุกกี้กัน

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

โค้ดด้านล่างแสดงการใช้งานตัวอย่างข้างต้น “cookies.php”

<?php
setcookie("user_name", "Guru99", time()+ 60,'/'); // expires after 60 seconds
echo 'the cookie has been set for 60 seconds';
?>

Output:

the cookie has been set for 60 seconds

กำลังดึงค่าคุกกี้

สร้างไฟล์อีกไฟล์ชื่อ “cookies_read.php” พร้อมด้วยโค้ดต่อไปนี้

<?php
print_r($_COOKIE); // output the contents of the cookie array variable
?>

Output:

Array ( [PHPSESSID] => h5onbf7pctbr0t68adugdp2611 [user_name] => Guru99 )

หมายเหตุ: $_COOKIE เป็นตัวแปรซูเปอร์โกลบอลในตัวของ PHP มันเก็บชื่อและค่าของคุกกี้ทั้งหมดที่ถูกตั้งค่าไว้

จำนวนและขนาดของคุกกี้ถูกจำกัดโดยเบราว์เซอร์ โดยทั่วไปจะอยู่ที่ประมาณ 50 คุกกี้ต่อโดเมน และ 4KB ต่อคุกกี้

กำลังทดสอบแอปพลิเคชันของเรา สมมติว่าคุณได้บันทึกไฟล์ PHP ของคุณไว้ในโฟลเดอร์ phptuts แล้ว

  • ขั้นตอนที่ 1 – เปิดเว็บเบราว์เซอร์ของคุณและป้อนที่อยู่ต่อไปนี้ URL http://localhost/phptuts/cookies_read.php

กำลังดึงค่าคุกกี้

หมายเหตุ: แสดงเฉพาะอาร์เรย์ว่างเท่านั้น

  • ขั้นตอนที่ 2 – เข้าไปที่ URL http://localhost/phptuts/cookies.php

กำลังดึงค่าคุกกี้

  • ขั้นตอนที่ 3 – สลับกลับไปที่แท็บแรก จากนั้นคลิกปุ่มรีเฟรช

กำลังดึงค่าคุกกี้

รอสักครู่ แล้วคลิกปุ่มรีเฟรชอีกครั้ง คุณได้ผลลัพธ์อะไรบ้าง?

ลบคุกกี้

  • หากคุณต้องการทำลายคุกกี้ก่อนเวลาหมดอายุ คุณจะต้องตั้งเวลาหมดอายุเป็นเวลาที่ผ่านไปแล้ว
  • สร้างไฟล์ใหม่ชื่อ cookie_destroy.php โดยใส่โค้ดต่อไปนี้ลงไป
<?php

setcookie("user_name", "Guru99", time() - 360,'/');

?>
  • ทำซ้ำขั้นตอนที่ 1 ถึง 3 จากส่วนด้านบนเกี่ยวกับการดึงค่าคุกกี้
  • เปิด URL http://localhost/phptuts/cookie_destroy.php
  • เปลี่ยนไปที่ URL http://localhost/phptuts/cookies_read.phpมันแสดงผลลัพธ์อะไรบ้าง?

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

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

เหตุใดจึงควรใช้เซสชันและเมื่อใด

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

การสร้างเซสชัน

ในการสร้างเซสชัน คุณต้องเรียกใช้ฟังก์ชัน `session_start` ของ PHP ก่อน จากนั้นจึงเก็บค่าของคุณไว้ในตัวแปรอาร์เรย์ `$_SESSION`

สมมติว่าเราต้องการทราบจำนวนครั้งที่หน้าเว็บถูกโหลด เราสามารถใช้เซสชันเพื่อทำเช่นนั้นได้

โค้ดด้านล่างแสดงวิธีการสร้างและเรียกใช้ค่าจากเซสชัน

<?php

session_start(); // start the session

if(isset($_SESSION['page_count']))
{
$_SESSION['page_count'] += 1;
}
else
{
$_SESSION['page_count'] = 1;
}
echo 'You are visitor number ' . $_SESSION['page_count'];

?>

Output:

You are visitor number 1

การทำลายตัวแปรเซสชัน

ฟังก์ชัน session_destroy() ใช้สำหรับทำลายเซสชัน PHP ทั้งหมด

หากคุณต้องการลบรายการเซสชันเพียงรายการเดียว คุณจะใช้ฟังก์ชัน unset()

รหัสด้านล่างแสดงวิธีการใช้ทั้งสองวิธี

<?php

session_destroy(); // destroy entire session

?>
<?php

unset($_SESSION['product']); // destroy product session item

?>

คำสั่ง session_destroy จะลบข้อมูลเซสชันทั้งหมด รวมถึงคุกกี้ที่เกี่ยวข้องกับเซสชันนั้นด้วย

คำสั่ง `unset` จะปลดปล่อยเฉพาะตัวแปรเซสชันแต่ละรายการเท่านั้น ข้อมูลอื่นๆ ยังคงอยู่เหมือนเดิม

คำถามที่พบบ่อย

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

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

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

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

ใช่แล้ว AI สามารถสแกนหาแฟล็ก HttpOnly หรือ Secure ที่หายไป ความเสี่ยงจากการโจมตีแบบ Session Fixation การจัดเก็บข้อมูลที่ละเอียดอ่อนในคุกกี้ และการไม่สร้าง ID ใหม่หลังจากล็อกอิน จากนั้นจะแนะนำโค้ดที่แก้ไขแล้วให้

สรุปโพสต์นี้ด้วย: