การกำหนด ตัวแปร cookie ด้วย php ตอนที่ 1

เขียนเมื่อ 10 ปีก่อน โดย Ninenik Narkdee
php cookie php cookie

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ php cookie php cookie

ดูแล้ว 16,688 ครั้ง




ตัวแปร cookie เป็นข้อมูลที่เซิร์ฟเวอร์ส่งไปยังเบราว์เซอร์และเก็บไว้ใน
เครื่องของผู้ใช้ในรูปแบบของข้อมูลที่เก็บอยู่ในรูปแบบของคู่ค่า (key-value pairs) 
ซึ่งเรียกว่า "คุกกี้" (cookie) ซึ่งมีหน้าที่ใช้เก็บข้อมูลเพื่อเอาไว้ใช้ในการระบุผู้ใช้ 
หรือเพื่อเก็บสถานะของการเยี่ยมชมเว็บไซต์ เช่น ข้อมูลการเข้าสู่ระบบ การกดปุ่ม 
"จำฉันไว้ในระบบ" หรือการตั้งค่าบุคคลส่วนบุคคลอื่น ๆ
 
ตัวแปร cookie ประกอบด้วยชื่อ (key) และค่า (value) โดยมีโครงสร้างเป็นคู่ค่าใน
รูปแบบของ "ชื่อ=ค่า" (name=value) เช่น:
 
user_id=12345
session_token=abcde12345
 
ซึ่งในตัวอย่างนี้ "user_id" และ "session_token" เป็นชื่อของคุกกี้
และ "12345" และ "abcde12345" เป็นค่าของคุกกี้ตามลำดับ
 
คุกกี้มักถูกใช้ในการเก็บข้อมูลที่ใช้สำหรับการตรวจสอบตัวตนของผู้ใช้หรือ
การเก็บข้อมูลการเยี่ยมชมเว็บไซต์ เช่น การเก็บข้อมูลการเข้าสู่ระบบ 
การตั้งค่าของผู้ใช้ และข้อมูลอื่น ๆ ที่เกี่ยวข้องกับประสบการณ์การใช้งาน
ของผู้ใช้ในเว็บไซต์นั้น ๆ ต่อไป
 

การกำหนดค่าตัวแปร COOKIE

รูปแบบของคำสั่ง php สำหรับกำหนดค่าให้กับตัวแปร cookie จะอยู่ในรูปแบบ
ดังต่อไปนี้คือ
 
สำหรับรูปแบบที่รองรับ php เวอร์ชั่น น้อยว่า 7.3
 

setcookie(
    string $name,
    string $value = "",
    int $expires_or_options = 0,
    string $path = "",
    string $domain = "",
    bool $secure = false,
    bool $httponly = false
): bool

 
 
สำหรับ php เวอร์ชั่น 7.3 ขึ้นไป
 
setcookie(string $name, string $value = "", array $options = []): bool
เนื้อหาต่อไปนี้จะแนะนำสำหรับเวอร์ชั่น 7.3 ขึ้นไป
แต่ก่อนอื่นขออธิบายสำหรับ php ที่ต่ำกว่า 7.3  ก็จะสามารถใชัรูปแบบเดิมดังนี้ได้
 
setcookie(
    string $name, // กำหนดชื่อ
    string $value = "", // กำหนดค่า
    int $expires_or_options = 0, // กำหนดวันหมดอายุ
    string $path = "", // กำหนดพาทธ์
    string $domain = "", // กำหนดโดเมน
    bool $secure = false, // กำหนดใช้งานเฉพาะ https หรือไม่
    bool $httponly = false // ใช้เฉพาะเรียกผ่านโปรโทคอล HTTP เท่านั้น
): bool
 
หลักๆ ค่าที่เราต้องกำหนด จะมีแค่ ชื่อ ค่า และก็วันหมดอายุ
ตัวอย่างชื่อ my_cookie มีค่าเป็น 'myname' หมดอายุ ในอีก 1 วันข้างหน้านับจากวันที่
สร้างตัวแปรนี้ (*สมมติวันนี้วันที่ 2024-04-24 12:00:00)
ก็จะได้เป็น
 
setcookie('my_cookie','myname',time()+60*60*24); 
// หมดอายุในวันที่ 2024-04-25 12:00:00
 
การกำหนดวันหมดอายุ ก็คือ ใช้ timestamp ของเวลาปัจจุบัน บวกจำนวนวินาทีที่ต้องการ
เพิ่ม เช่น ถ้าเพิ่ม 1 วัน ก็คือ 60*60*24 แบบนี้เป็นตัว เราสามารถกำหนดวันหมดอายุ โดยระบุ
วันที่ต้องการได้ แล้วใช้คำสั่ง strtotime() แปลงค่าวันที่นั้นให้เป็นเวลา timestamp มาใช้งาน
เช่น 
 
setcookie('my_cookie','myname', strtotime("2024-04-25 12:00:00")); 
// หมดอายุในวันที่ 2024-04-25 12:00:00
 
อย่างไรก็ตามเมื่อเวลาและวันที่หมดอายุถูกบันทึก หากเราตรวจสอบค่าตัวแปรผ่าน บราวเซอร์
เราจะเห็นว่าเวลาที่แสดงจะเป็นเวลาใน UTC (Coordinated Universal Time) ถ้าในไทย
ซึ่งเร็วกว่า 7 ชั่วโมงเวลาที่บันทึกก็จะเป็น 2024-04-25 05:00:00 เวลาที่แสดงตรงนี้เราไม่ต้อง
สนใจ เพราะเป็นส่วนของตัวโปรแกรมทำงาน กล่าวคือ เวลาจริงที่หมดอายุก็จะยังเป็น 12:00:00
เพราะเมื่อถูกใช้งาน จะมีการแปลงให้กลับมาเป็นเวลาของเครื่องนั้นๆ กล่าวโดยสรุปคือ บันทึกในระบบ
เป็นแบบเวลา UTC แต่แสดงหรือเรียกใช้งานตามเวลา  Local Time Zone 
 
ในการตั้งค่า cookie จะกำหนดไว้ส่วนบนของไฟล์ 
ในตัวอย่างข้างต้น แค่กำหนด เพียง 3 ค่าเราก็สามารถใช้งานได้แล้ว โดยไม่ต้องกำหนดค่าอื่นๆ
เพิ่มเติม แต่ในความเป็นจริง และเพื่อความเหมาะสม กับการใช้งานเราอาจจะต้องกำหนดค่าอื่นๆ
เพิ่มเติมเข้าไป 
 

สมมติเรากำหนดแค่ 3 ค่าข้างต้น จะเกิดอะไรขึ้น

 
1. ถ้าไม่กำหนด  path ตัวแปร cookie จะใช้ได้เฉพาะในโฟลเดอร์ที่ถูกสร้าง และ โฟลเดอร์
ย่อยด้านใน ดังนั้น ถ้าเราไม่ได้สร้างที่ root ของเว็บไซต์ ก็อาจจะมีปัญหาการเรียกใช้งานไม่ได้
จากโฟลเดอร์อื่น เป็นตัน
2. ถ้าไม่กำหนด domain โดยทั่วไปจะถูกกำหนดให้เป็นค่าตามโดเมนหรือสับโดเมนที่ใช้งานอยู่
ในขณะนั้น เช่น ถ้าเรียกผ่าน https://ninenik.com กับ https://www.ninenik.com
ค่าโดเมนของสองค่า ก็จะไม่เหมือนกัน ทำให้มีการสร้างตัวแปรชื่อซ้ำกันแต่อยู่คนละโดเมน ไม่
สามารถใช้ร่วมกันได้
3. ปัจจุบัน server ส่วนใหญ่ต้องรองรับ https แล้วดังนั้น ปัจจุบันจำเป้นต้องกำหนดให้ใช้งาน
เฉพาะ https หรือให้ค่า secure เป็น true ซึ่งถ้าไม่กำหนดค่าเริ่มต้นจะเป็น false
4. สำหรับการกำหนด httponly ค่านี้เราไม่ต้องกำหนดก็ได้ เพราะ ถ้ากำหนด เราจะไม่สามารถ
เรียกใช้งานผ่าน javascript ได้ อย่างไรก็ดีค่านี้ขึ้นกับความต้องการของเราว่าจะให้สามารถใช้
งานผ่าน javascirpt ได้หรือไม่
 
ดังนั้นเรามาดูเงื่อนไขความต้องการ และการกำหนด cookie ว่าจะสามารถใช้แบบไหนได้บ้าง
1. ถ้าเราต้องการใช้ตัวแปร cookie นั้นในโดเมนและสับโดเมนทั้งหมด
 
setcookie('my_cookie','myname',time()+60*60*24,'/','.ninenik.com',true);
// ให้กำหนดชื่อโดเมนแบบมีจุดด้านหน้า
 
2. ไม่ต้องการให้สามารถเรียกใช้งานผ่าน javascript ได้
 
setcookie('my_cookie','myname',time()+60*60*24,'/','.ninenik.com',true,true);
// กำหนดค่า httponly เป็น true
 
3. รองรับการใช้งานการกำหนด SameSite ในคุกกี้ (cookie) ซึ่งเป็นการควบคุมการส่งตัวแปร
cookie ไปใช้งานยังเว็บไซต์อื่นแบบ ที่มีคำขอแบบ cross-origin (โดยไม่ได้มาจากเว็บไซต์เดียวกัน)
ทั้งนี้เพื่อควบคุมในเรื่องของความปลอดภัย ส่วนนี้ เราต้องใช้การกำหนดรูปแบบของ php เวอร์ชั่น
ตั้งแต่ 7.3 ขึ้นไป สามารถกำหนดได้ดังนี้
 
$expired_time = time()+(60*60*24);
$options = [
	"expires" => $expired_time,
	"path" => "/",
	"domain" => ".ninenik.com",
	"secure" => true,
	"httponly" => true,	
	"samesite" => "Strict",
];
setcookie('my_cookie','myname', $options);
 
โดยค่า samesite จะกำหนดได้ด้วยกัน 3 ค่าคือ None, Lax และ Strict
โดยค่า Strict จะเป็นค่าที่กำหนดในกรณีต้องการป้องกันสูงสุด และไม่มีการเรียกใช้งาน
cookie จากที่ใดๆ นอกจากในเว็บไซต์เราเท่านั้น  ในขณะค่า Lax จะอนุญาตให้สามารถ
ใช้งานได้เฉพาะกรณีที่เป็นกดลิ้งค์ไปยังเว็บไซต์อื่นแล้วส่งค่า cookie ไปได้ แต่ไม่สามารถ
ใช้ javascript จัดการได้ และสุดท้ายค่า None คือให้สามารถรองรับการใช้งานข้ามเว็บไซต์
ได้ แต่ต้องกำหนดค่า secure เป็นค่า true ด้วยเสมอถึงจะสามารถใช้งานได้ เพื่อให้ข้อมูล
ที่ส่งไปต้องส่งผ่าน https เท่านั้น
 
 

การล้างค่าตัวแปร COOKIE

สำหรับการล้างคือตัวแปร cookie เมื่อไม่ต้องการใช้งานแล้ว ใช้รูปแบบเดียวกับการสร้างหรือ
กำหนดตัวแปร cookie เพียงแค่เรา เปลี่ยนแค่ เวลาให้เป็นค่า น้อยกว่าเวลาปัจจุบัน ตัวอย่างเช่น
 
$expired_time = time()-3600; // ให้ใช้ค่าลบ 1 ชั่วโมง เพื่อให้มั่นใจว่าตัวแปร cookie ถูกลบ
$options = [
	"expires" => $expired_time,
	"path" => "/",
	"domain" => ".ninenik.com",
	"secure" => true,
	"httponly" => true,	
	"samesite" => "Strict",
];
setcookie('my_cookie','myname', $options);
 
ถ้าเรากำหนดค่า 0 หรือค่าที่น้อยๆ ตัวแปร cookie จะมีสถานะเป็น session คือตัวแปรจะยังคง
อยู่ยังไม่ถูกลบจนกว่าจะปิดบราวเซอร์ ดังนั้นเพื่อให้ตัวแปรถูกลบทันที ให้เราใช้ค่า -3600 ซึ่งมีค่า
เท่ากับ ลบ 3600 วินาที หรือลบ 1 ชั่วโมง ตัวแปร cookie ก็จะถูกล้างค่าไปทันที
 
หวังว่าเนื้อหานี้จะเป็นประโยชน์สำหรับการนำไปประยุกต์ใช้งานต่อไป


   เพิ่มเติมเนื้อหา ครั้งที่ 1 วันที่ 25-04-2024


ป้องกันการสร้างค่าตัวแปร cookie ที่มีเครื่องหมายพิเศษ

 
ป้องกันการสร้างค่าตัวแปร cookie ที่มีเครื่องหมายพิเศษหรืออักขระพิเศษ เช่น
อาจจะมี single qoute หรือ double qoute แบบนี้เป็นต้น ค่าของข้อมูลอาจจะ
มีการเปลี่ยนแปลงได้ ดังนั้น ในกรณีกำหนดค่าโดยส่งค่ามาแบบ POST สามารถเพิ่ม
ส่วนนี้เข้าไปได้ 
 
$expired_time = time()+(60*60*24);
$options = [
    "expires" => $expired_time,
    "path" => "/",
    "domain" => ".ninenik.com",
    "secure" => true,
    "httponly" => true,  
    "samesite" => "Strict",
];
setcookie('my_cookie',stripslashes(urldecode($_POST['mycookie'])), $options);


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ



อ่านต่อที่บทความ









เนื้อหาที่เกี่ยวข้อง









URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ