PHP รับค่าคุกกี้ Setcookie - ส่งคุกกี้ การลบคุกกี้ใน PHP

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

คุกกี้

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

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

เซสชัน

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

กำลังบันทึกเซสชัน

การแก้ไขเซสชันเกิดขึ้นเมื่อผู้ใช้เชื่อมต่อกับเซสชันที่สร้างไว้แล้วและอัปโหลดข้อมูลของตนที่นั่น เมื่อเข้าสู่เซสชั่นที่กำหนดไว้แล้ว ผู้โจมตีสามารถเยี่ยมชมเซสชั่นนี้และรับข้อมูลที่ผู้ใช้ป้อน ตัวอย่างง่ายๆ คือการไปตามลิงก์ไปยังเว็บไซต์ที่มีการตั้งค่ารหัสเซสชันไว้แล้ว ตัวอย่างเช่น http://www.example.com/?PHPSESSID=1234 ขณะนี้ผู้โจมตีใช้ PHPSESSID เดียวกันเพื่อดูข้อมูลของคุณ

การแย่งชิงเซสชัน

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

การใช้เซสชันอย่างมีประสิทธิภาพ

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

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

ฟังก์ชั่นเข้าสู่ระบบ($ชื่อผู้ใช้, $รหัสผ่าน)
$sql = mysql_query("เลือก id, user_level จากผู้ใช้ WHERE รหัสผ่าน = "" . $password . "" AND ชื่อผู้ใช้ = "" . $username . "" จำกัด 1");
// หากไม่มีข้อมูลที่ตรงกัน แสดงว่าชื่อผู้ใช้และรหัสผ่านไม่ตรงกัน
ถ้า($sql === เท็จ)
{
กลับเท็จ;
}
อื่น
{
ในขณะที่($u = mysql_fetch_array($sql))
{
session_regenerate_id(จริง);
$session_id = $u;
$session_username = $ชื่อผู้ใช้;
$session_level = $u;

$_SESSION["user_id"] = $session_id;
$_SESSION["user_level"] = $session_level;
$_SESSION["user_name"] = $session_username;
$_SESSION["user_lastactive"] = เวลา();
กลับเป็นจริง;
}
}

มาวิเคราะห์โค้ดนี้กัน ระบบจะขอชื่อผู้ใช้และรหัสผ่านและตรวจสอบว่ามีผู้ใช้ที่ตรงกับเกณฑ์ทั้งสองข้อนี้หรือไม่ หากไม่มีผลลัพธ์ ระบบจะสร้างชื่อผู้ใช้/รหัสผ่านที่ไม่ถูกต้องและเกิดข้อผิดพลาด มิฉะนั้น ตัวแปรเซสชันจะถูกสร้างขึ้น: user_id, user_level, user_name และ user_lastactive ค่าเหล่านี้เต็มไปด้วยข้อมูลจากรายการ mysql

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

การเขียนฟังก์ชัน “จดจำฉัน”

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

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

account_active = จริง; // ตรวจสอบว่าผู้ใช้ต้องการให้บัญชีถูกบันทึกในคุกกี้ if($remember) ( // สร้างรหัสรับรองความถูกต้องใหม่สำหรับการเข้าสู่ระบบแต่ละครั้ง (ดังนั้นรหัสรับรองความถูกต้องเก่าไม่สามารถใช้ได้หลายครั้งในกรณี // ของการแย่งชิงคุกกี้) $cookie_auth= rand_string(10) . $username; $auth_key = session_encrypt($cookie_auth); $auth_query = mysql_query("อัปเดตผู้ใช้ SET auth_key = "" . $auth_key . "" WHERE ชื่อผู้ใช้ = "" . $username . """); setcookie("auth_key", $auth_key, time() + 60 * 60 * 24 * 7, "/", "example.com", false, true) ) // กำหนดตัวแปรให้กับเซสชัน session_regenerate_id(true); $session_id = $u; $session_username = $ชื่อผู้ใช้; $session_level = $u; $_SESSION["user_id"] = $session_id; $_SESSION["user_level"] = $session_level; $_SESSION["user_name"] = $session_username; $_SESSION["user_lastactive"] = เวลา(); กลับเป็นจริง; -

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

ฟังก์ชั่นนี้จะต้องเข้าถึงได้ในทุกหน้า มีวัตถุประสงค์เพื่อตรวจสอบคีย์อนุญาตการเข้าถึงของคุกกี้ (“auth_key”) หากคุกกี้ใช้ฟังก์ชัน isset ผู้ใช้ที่เกี่ยวข้องจะปรากฏขึ้น ย้ำอีกครั้งว่าฟังก์ชั่นนี้ต้องเข้าได้ทุกหน้า

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

คุณสมบัติอื่นๆ

= $currenttime)( // ตั้งเวลาใช้งานล่าสุดของผู้ใช้ใหม่ $_SESSION["user_lastactive"] = $currenttime; ) else ( // หากเซสชันไม่ได้ใช้งานนานเกินไป ออกจากระบบ ออกจากระบบ(); ) ) ) ) ?>

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

บทสรุปและการแย่งชิงเซสชัน

การป้องกัน Session Hijacking เป็นเรื่องยากมาก คุณอาจเคยอ่านคำแนะนำเกี่ยวกับการใช้ที่อยู่ IP ของผู้ใช้หรือกระบวนการตัวแทนผู้ใช้เพื่อสร้างแท็กระบุตัวตน อย่างไรก็ตาม สิ่งนี้ไม่มีผลกับผู้ใช้งานจริงของคุณ ที่อยู่ IP ของผู้ใช้มีการเปลี่ยนแปลงอยู่ตลอดเวลา ผู้ให้บริการอินเทอร์เน็ตรายใหญ่ เช่น AOL จะเปลี่ยนบริการทุกๆ สองสามนาที นี่จะสร้างปัญหาใหญ่ กระบวนการตัวแทนผู้ใช้ก็เปลี่ยนแปลงเช่นกัน - IE7 พบว่าตัวแทนผู้ใช้เปลี่ยนแปลงเป็นระยะ วิธีที่ดีที่สุดในการป้องกันการสกัดกั้นคือการสร้างระบบด้ามกายสิทธิ์ ระบบนี้จะส่งออกคุกกี้ในทุกหน้าที่โหลดและยังเก็บค่านี้ไว้ในรายการ mysql ของคุณด้วย ค่าคุกกี้จะถูกเปรียบเทียบกับค่าตาราง MySQL หากต่างกัน เซสชันจะไม่ถูกต้อง

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

โปรดตรวจสอบให้แน่ใจว่าค่าคุกกี้ถูกต้อง
ห้ามส่งออกรหัสผ่านเซสชันหรือตัวแปรคุกกี้

เพื่อป้องกันการแก้ไขเซสชัน ให้ใช้ตัวระบุ
session_regenerate_id

จนกว่าจะถึงบทเรียนต่อไป!

ป.ล. ฉันจะแปลความคิดเห็นในโค้ดภายใน 24 ชั่วโมง :)

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

คุกกี้ใช้ทำอะไร?

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

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

คุกกี้มาจากไหน?

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

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

นั่นคือเซิร์ฟเวอร์พูดว่า: "เฮ้ เบราว์เซอร์ สร้างรายการให้ฉันด้วยคีย์ "เข้าสู่ระบบ" และค่า "ผู้ดูแลระบบ" และอีกรายการหนึ่งที่มีคีย์ "รหัสผ่าน" และค่า "123" หลังจากนี้ เบราว์เซอร์จะเริ่มส่งข้อมูลเพิ่มเติม เช่น:

เข้าสู่ระบบ: รหัสผ่านผู้ดูแลระบบ: 123

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

เกี่ยวกับเวลาชีวิต

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

วิธีทำงานกับคุกกี้ใน PHP

ดังนั้นเราจึงมีความเข้าใจพื้นฐานเกี่ยวกับวิธีการทำงานของคุกกี้ ตอนนี้เรามาดูกันว่าคุณสามารถทำงานกับพวกมันใน PHP ได้อย่างไร

มาสร้างไฟล์ในโครงการของเราชื่อ viewCookies.php ลองใส่โค้ดต่อไปนี้ลงไป

อย่างที่คุณควรเดาไว้ตอนนี้ $_คุกกี้เป็นอีกหนึ่งอาเรย์ระดับโลกใน PHP ซึ่งคล้ายกับอาเรย์ $_GETและ $_โพสต์- เพียงแต่จะจัดเก็บคุกกี้ทั้งหมดที่เบราว์เซอร์ส่งมาโดยเป็นส่วนหนึ่งของคำขอปัจจุบัน

มาดูกันว่าสคริปต์นี้ทำงานอย่างไรโดยการเปิดเพจในเบราว์เซอร์: http://myproject.loc/viewCookies.php

ดังที่เราเห็นแล้วว่าอาร์เรย์นี้ว่างเปล่าในขณะนี้ มาเติมกัน :) ในการดำเนินการนี้เราต้องติดตั้งคุกกี้บางประเภทในเบราว์เซอร์ ใน PHP ฟังก์ชันนี้ใช้สำหรับสิ่งนี้ setcookie($ชื่อ, $value, $ttl, $path)

พารามิเตอร์ที่ผ่าน:

  • $name – ชื่อคุกกี้
  • $value – มูลค่าของมัน
  • $ttl – ตลอดชีวิต หากคุณระบุ 0 คุกกี้จะถูกติดตั้งตลอดไป (จนกว่าจะถูกลบ)
  • $path – เส้นทางในแถบที่อยู่ หากคุณระบุ "/" คุกกี้จะพร้อมใช้งานจากไดเรกทอรีทั้งหมดบนเว็บไซต์ ตัวอย่างเช่น ทั้งใน http://myproject.loc/ และ http://myproject.loc/posts/ หากคุณตั้งค่า "/posts/" คุณจะสามารถเข้าถึงคุกกี้ได้จากไดเรกทอรี http://myproject.loc/posts/ และไดเรกทอรีย่อยทั้งหมดเท่านั้น (เช่น http://myproject.loc/posts/new/) ค่าเริ่มต้นคือไดเร็กทอรีปัจจุบันที่ติดตั้งคุกกี้ หากเราต้องการให้คุกกี้ใช้งานได้ทั่วทั้งไซต์ เราจำเป็นต้องตั้งค่านี้เป็น "/"

มีพารามิเตอร์อีกหลายตัว คุณสามารถอ่านเกี่ยวกับพารามิเตอร์เหล่านี้ได้ในเอกสารอย่างเป็นทางการ

ทีนี้มาลองใช้ฟังก์ชันนี้กัน มาสร้างไฟล์ชื่อ setCookies.php แล้วเขียนโค้ดต่อไปนี้ลงไป:

หลังจากนั้นไปที่ http://myproject.loc/setCookies.php ซึ่งเราจะเห็นหน้าว่าง ดังที่เราได้กล่าวไปแล้ว ผู้ใช้จะไม่สามารถมองเห็นการทำงานกับคุกกี้ได้

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

คลิกที่รายการนี้และในหน้าต่างที่เปิดทางด้านขวาให้เลือกแท็บส่วนหัว ที่นี่ ในส่วน Response Headers เราจะเห็นส่วนหัว Set-Cookie พร้อมข้อมูลที่เราระบุ

ดังนั้นคุกกี้จึงได้รับการติดตั้งในเบราว์เซอร์เรียบร้อยแล้ว ตอนนี้ไปที่หน้าของเราที่แสดงอาร์เรย์ $_COOKIE - http://myproject.loc/viewCookies.php

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

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

คุกกี้ทั้งหมดจะถูกนำเสนอในรายการที่สะดวก

คุณต้องรู้อะไรอีกเกี่ยวกับคุกกี้

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

คุณสามารถตั้งค่าคุกกี้ก่อนแล้วจึงแสดงข้อความ

ทุกอย่างจะออกมาดี

แต่คุณไม่สามารถพิมพ์ข้อความ (ซึ่งเป็นเนื้อหาของการตอบสนอง HTTP) แล้วลองตั้งค่าคุกกี้

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

การตั้งค่าคุกกี้หลายรายการ

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

พวกเขาจะถูกโอนไปยังลูกค้าเรียบร้อยแล้ว

เราจะดูตัวอย่างการโต้ตอบของผู้ใช้เต็มรูปแบบผ่านคุกกี้ในบทเรียนถัดไป ในระหว่างนี้เรามาทำการบ้านกันเถอะ

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

คุกกี้

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

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

เซสชัน

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

กำลังบันทึกเซสชัน

การแก้ไขเซสชันเกิดขึ้นเมื่อผู้ใช้เชื่อมต่อกับเซสชันที่สร้างไว้แล้วและอัปโหลดข้อมูลของตนที่นั่น เมื่อเข้าสู่เซสชั่นที่กำหนดไว้แล้ว ผู้โจมตีสามารถเยี่ยมชมเซสชั่นนี้และรับข้อมูลที่ผู้ใช้ป้อน ตัวอย่างง่ายๆ คือการไปตามลิงก์ไปยังเว็บไซต์ที่มีการตั้งค่ารหัสเซสชันไว้แล้ว ตัวอย่างเช่น http://www.example.com/?PHPSESSID=1234 ขณะนี้ผู้โจมตีใช้ PHPSESSID เดียวกันเพื่อดูข้อมูลของคุณ

การแย่งชิงเซสชัน

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

การใช้เซสชันอย่างมีประสิทธิภาพ

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

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

ฟังก์ชั่นเข้าสู่ระบบ($ชื่อผู้ใช้, $รหัสผ่าน)
$sql = mysql_query("เลือก id, user_level จากผู้ใช้ WHERE รหัสผ่าน = "" . $password . "" AND ชื่อผู้ใช้ = "" . $username . "" จำกัด 1");
// หากไม่มีข้อมูลที่ตรงกัน แสดงว่าชื่อผู้ใช้และรหัสผ่านไม่ตรงกัน
ถ้า($sql === เท็จ)
{
กลับเท็จ;
}
อื่น
{
ในขณะที่($u = mysql_fetch_array($sql))
{
session_regenerate_id(จริง);
$session_id = $u;
$session_username = $ชื่อผู้ใช้;
$session_level = $u;

$_SESSION["user_id"] = $session_id;
$_SESSION["user_level"] = $session_level;
$_SESSION["user_name"] = $session_username;
$_SESSION["user_lastactive"] = เวลา();
กลับเป็นจริง;
}
}

มาวิเคราะห์โค้ดนี้กัน ระบบจะขอชื่อผู้ใช้และรหัสผ่านและตรวจสอบว่ามีผู้ใช้ที่ตรงกับเกณฑ์ทั้งสองข้อนี้หรือไม่ หากไม่มีผลลัพธ์ ระบบจะสร้างชื่อผู้ใช้/รหัสผ่านที่ไม่ถูกต้องและเกิดข้อผิดพลาด มิฉะนั้น ตัวแปรเซสชันจะถูกสร้างขึ้น: user_id, user_level, user_name และ user_lastactive ค่าเหล่านี้เต็มไปด้วยข้อมูลจากรายการ mysql

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

การเขียนฟังก์ชัน “จดจำฉัน”

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

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

account_active = จริง; // ตรวจสอบว่าผู้ใช้ต้องการให้บัญชีถูกบันทึกในคุกกี้ if($remember) ( // สร้างรหัสรับรองความถูกต้องใหม่สำหรับการเข้าสู่ระบบแต่ละครั้ง (ดังนั้นรหัสรับรองความถูกต้องเก่าไม่สามารถใช้ได้หลายครั้งในกรณี // ของการแย่งชิงคุกกี้) $cookie_auth= rand_string(10) . $username; $auth_key = session_encrypt($cookie_auth); $auth_query = mysql_query("อัปเดตผู้ใช้ SET auth_key = "" . $auth_key . "" WHERE ชื่อผู้ใช้ = "" . $username . """); setcookie("auth_key", $auth_key, time() + 60 * 60 * 24 * 7, "/", "example.com", false, true) ) // กำหนดตัวแปรให้กับเซสชัน session_regenerate_id(true); $session_id = $u; $session_username = $ชื่อผู้ใช้; $session_level = $u; $_SESSION["user_id"] = $session_id; $_SESSION["user_level"] = $session_level; $_SESSION["user_name"] = $session_username; $_SESSION["user_lastactive"] = เวลา(); กลับเป็นจริง; -

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

ฟังก์ชั่นนี้จะต้องเข้าถึงได้ในทุกหน้า มีวัตถุประสงค์เพื่อตรวจสอบคีย์อนุญาตการเข้าถึงของคุกกี้ (“auth_key”) หากคุกกี้ใช้ฟังก์ชัน isset ผู้ใช้ที่เกี่ยวข้องจะปรากฏขึ้น ย้ำอีกครั้งว่าฟังก์ชั่นนี้ต้องเข้าได้ทุกหน้า

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

คุณสมบัติอื่นๆ

= $currenttime)( // ตั้งเวลาใช้งานล่าสุดของผู้ใช้ใหม่ $_SESSION["user_lastactive"] = $currenttime; ) else ( // หากเซสชันไม่ได้ใช้งานนานเกินไป ออกจากระบบ ออกจากระบบ(); ) ) ) ) ?>

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

บทสรุปและการแย่งชิงเซสชัน

การป้องกัน Session Hijacking เป็นเรื่องยากมาก คุณอาจเคยอ่านคำแนะนำเกี่ยวกับการใช้ที่อยู่ IP ของผู้ใช้หรือกระบวนการตัวแทนผู้ใช้เพื่อสร้างแท็กระบุตัวตน อย่างไรก็ตาม สิ่งนี้ไม่มีผลกับผู้ใช้งานจริงของคุณ ที่อยู่ IP ของผู้ใช้มีการเปลี่ยนแปลงอยู่ตลอดเวลา ผู้ให้บริการอินเทอร์เน็ตรายใหญ่ เช่น AOL จะเปลี่ยนบริการทุกๆ สองสามนาที นี่จะสร้างปัญหาใหญ่ กระบวนการตัวแทนผู้ใช้ก็เปลี่ยนแปลงเช่นกัน - IE7 พบว่าตัวแทนผู้ใช้เปลี่ยนแปลงเป็นระยะ วิธีที่ดีที่สุดในการป้องกันการสกัดกั้นคือการสร้างระบบด้ามกายสิทธิ์ ระบบนี้จะส่งออกคุกกี้ในทุกหน้าที่โหลดและยังเก็บค่านี้ไว้ในรายการ mysql ของคุณด้วย ค่าคุกกี้จะถูกเปรียบเทียบกับค่าตาราง MySQL หากต่างกัน เซสชันจะไม่ถูกต้อง

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

โปรดตรวจสอบให้แน่ใจว่าค่าคุกกี้ถูกต้อง
ห้ามส่งออกรหัสผ่านเซสชันหรือตัวแปรคุกกี้

เพื่อป้องกันการแก้ไขเซสชัน ให้ใช้ตัวระบุ
session_regenerate_id

จนกว่าจะถึงบทเรียนต่อไป!

ป.ล. ฉันจะแปลความคิดเห็นในโค้ดภายใน 24 ชั่วโมง :)

( PHP 4, PHP 5, PHP 7)

setcookie - ส่งคุกกี้

คำอธิบาย

บูล ชุดคุกกี้ (สตริง $ชื่อ [, สตริง $value [, int $หมดอายุ = 0 [, สตริง $path [, สตริง $domain [, บูล $secure = เท็จ [, บูล $httponly = เท็จ ]]]]]])

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

เมื่อส่งผ่านไปยังไคลเอนต์แล้ว คุกกี้จะพร้อมใช้งานผ่านอาร์เรย์ $_COOKIE และ $HTTP_COOKIE_VARS ในครั้งถัดไปที่โหลดเพจ โปรดทราบว่า superglobals เช่น $_COOKIE มีเฉพาะใน PHP 4.1.0 เท่านั้น

ค่าคุกกี้ก็อยู่ใน $_REQUEST เช่นกัน

อาร์กิวเมนต์ทั้งหมดยกเว้นชื่อเป็นทางเลือก หากคุณต้องการข้ามอาร์กิวเมนต์ใดๆ คุณสามารถแทนที่ด้วยสตริงว่าง ( "" - สิ่งนี้ใช้ไม่ได้กับอาร์กิวเมนต์หมดอายุ เนื่องจากยอมรับค่าจำนวนเต็ม สตริงว่างจึงไม่เหมาะสำหรับการแทนที่ ใช้ศูนย์แทน ( 0 ).

หมดอายุ

เวลาที่คุกกี้หมดอายุ นี่คือการประทับเวลา Unix ซึ่งหมายความว่าเป็นจำนวนวินาทีนับตั้งแต่ยุคนั้น กล่าวอีกนัยหนึ่ง ขอแนะนำให้ตั้งเวลานี้โดยใช้ฟังก์ชัน เวลา()โดยเพิ่มเวลาเป็นวินาทีหลังจากนั้นคุกกี้จะหมดอายุ หรือคุณสามารถใช้ฟังก์ชั่น เอ็มเคไทม์(). เวลา()+60*60*24*30จะกำหนดวันหมดอายุของคุกกี้เป็น 30 วัน หากตั้งค่าเป็น 0 หรือละเว้น คุกกี้จะหมดอายุเมื่อสิ้นสุดเซสชัน (เมื่อปิดเบราว์เซอร์)

ความคิดเห็น:

คุณอาจสังเกตเห็นว่าการหมดอายุใช้การประทับเวลา Unix เป็นค่าและจัดเก็บในรูปแบบ Wdy,DD-จันทร์-YYYY HH:MM:SS GMT- PHP ทำการแปลงภายในโดยอัตโนมัติ

เส้นทาง

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

โดเมนที่มีคุกกี้ให้บริการ การระบุโดเมน "www.example.com"จะทำให้คุกกี้พร้อมใช้งานในโดเมนย่อย wwwและโดเมนย่อยของคำสั่งซื้อที่สูงกว่า คุกกี้ที่มีให้ในระดับต่ำเช่น "example.com"จะสามารถใช้ได้ในทุกโดเมนย่อยของระดับสูงสุด รวมทั้ง "www.example.com"- อาจต้องใช้เบราว์เซอร์รุ่นเก่าที่เป็นไปตาม RFC 2109 รุ่นเก่า . ก่อนโดเมนเพื่อให้รวมโดเมนย่อยทั้งหมด

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

เมื่อส่งคุกกี้จากเซิร์ฟเวอร์ไปยังไคลเอนต์ โปรแกรมเมอร์เว็บเซิร์ฟเวอร์จะต้องตรวจสอบให้แน่ใจว่าคุกกี้ประเภทนี้ถูกส่งผ่านช่องทางที่ปลอดภัย (ให้ความสนใจกับ $_SERVER["HTTPS"])

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

เท็จ

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

- อย่างไรก็ตาม นี่ไม่ได้หมายความว่าแอปพลิเคชันไคลเอนต์ (เบราว์เซอร์) ยอมรับและประมวลผลคุกกี้อย่างถูกต้อง

ตัวอย่าง

ด้านล่างนี้คือตัวอย่างบางส่วนของวิธีการส่งคุกกี้: เซตคุกกี้()

ตัวอย่างที่ 1 ตัวอย่างการใช้งาน" ;!}

$value = "something ที่ไหนสักแห่ง
Setcookie("TestCookie", $value); setcookie("TestCookie", $value, time()+ 3600);
/* ระยะเวลาใช้งานได้ 1 ชั่วโมง */
?>

setcookie ("TestCookie" , $value , เวลา ()+ 3600 , "/~rasmus/" , "example.com" , 1 ); เป็นที่น่าสังเกตว่าค่าคุกกี้นั้นมีการเข้ารหัส URL ก่อนที่จะส่งไปยังไคลเอนต์ เมื่อได้รับกลับมา ค่าคุกกี้จะถูกถอดรหัสและวางลงในตัวแปรที่มีชื่อเดียวกันกับชื่อคุกกี้ หากคุณไม่ต้องการเข้ารหัสค่า ให้ใช้ฟังก์ชัน setrawcookie()

(ทำงานใน PHP 5) คุณสามารถดูเนื้อหาของคุกกี้ทดสอบของเราได้โดยการเรียกใช้หนึ่งในตัวอย่างต่อไปนี้:
// พิมพ์ค่าคุกกี้เฉพาะหนึ่งค่า
เสียงสะท้อน $_COOKIE [ "TestCookie" ];

เสียงก้อง $HTTP_COOKIE_VARS [ "TestCookie" ];
// เพื่อวัตถุประสงค์ในการทดสอบและแก้ไขข้อบกพร่อง การพิมพ์คุกกี้ทั้งหมดอาจเป็นประโยชน์
?>

print_r($_คุกกี้); เซตคุกกี้()

ตัวอย่าง #2 ตัวอย่างการลบคุกกี้โดยใช้

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

setcookie("TestCookie", "", เวลา() - 3600); เซตคุกกี้() setcookie ("TestCookie" , "" , เวลา () - 3600 , "/~rasmus/" , "example.com" , 1 );

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

เมื่อดึงข้อมูลกลับมา ค่าทั้งหมดเหล่านี้จะถูกวางไว้ในอาร์เรย์ชื่อคุกกี้นั้น:
//ส่งคุกกี้
setcookie("คุกกี้" , "cookiethree" );
setcookie("คุกกี้" , "cookietwo" );

setcookie("คุกกี้" , "cookieone" );
// หลังจากโหลดหน้าใหม่แล้ว ให้แสดงคุกกี้
ถ้า (isset($_COOKIE [ "คุกกี้" ])) (
foreach ($_COOKIE [ "cookie" ] เป็น $name => $value ) (
$name = htmlspecialchars($ชื่อ);
$value = htmlอักขระพิเศษ($value);
เสียงสะท้อน " $name : $value
}
}
?>

\n" ; ในสคริปต์ หรือคุณสามารถกำหนดคำสั่งได้เอาต์พุต_บัฟเฟอร์

ความคิดเห็น:

ในไฟล์ php.ini หรือไฟล์การกำหนดค่าเซิร์ฟเวอร์

  • หมายเหตุทั่วไป: คุกกี้จะมองเห็นได้หลังจากโหลดหน้าเว็บที่ควรมองเห็นซ้ำแล้วเท่านั้น หากต้องการตรวจสอบว่าคุกกี้ได้รับการตั้งค่าอย่างถูกต้องหรือไม่ ให้ตรวจสอบในครั้งถัดไปที่คุณโหลดหน้าเว็บก่อนที่จะหมดอายุ วันหมดอายุของคุกกี้ระบุไว้ในพารามิเตอร์หมดอายุ สะดวกในการตรวจสอบการมีอยู่ของคุกกี้ด้วยการโทรง่ายๆ.
  • print_r($_คุกกี้); หรือเมื่อลบคุกกี้ จะต้องระบุการตั้งค่าเดียวกันกับเมื่อทำการติดตั้ง หากคุณตั้งค่าเป็นสตริงว่างหรือ
  • และตั้งค่าพารามิเตอร์ที่เหลือตามการเรียกก่อนหน้าที่ตั้งค่าคุกกี้ จากนั้นคุกกี้ที่มีชื่อที่กำหนดจะถูกลบออกจากเครื่องไคลเอนต์ ภายใน ดูเหมือนว่า: คุกกี้ถูกตั้งค่าเป็น "ลบ" และวันหมดอายุจะถูกย้ายกลับไปหนึ่งปี หรือตั้งแต่การตั้งค่า 0 จะลบคุกกี้ คุณไม่ควรตั้งค่าคุกกี้ให้เป็นค่าบูลีน คุณสามารถใช้แทนได้ หรือและ 1 จะลบคุกกี้ คุณไม่ควรตั้งค่าคุกกี้ให้เป็นค่าบูลีน คุณสามารถใช้แทนได้ จริง.
  • สำหรับ คุกกี้สามารถตั้งชื่อได้เหมือนกับอาร์เรย์ และคุกกี้จะมีอยู่ในสคริปต์ PHP ในรูปแบบอาร์เรย์ แต่คุกกี้จะถูกจัดเก็บเป็นบันทึกแยกต่างหากในเครื่องของผู้ใช้ หากต้องการตั้งค่าคุกกี้ที่มีชื่อและค่าหลายค่า ขอแนะนำให้ใช้ฟังก์ชันนี้ระเบิด() - ไม่แนะนำให้ใช้ฟังก์ชันนี้เพื่อวัตถุประสงค์เหล่านี้ทำให้เป็นอนุกรม()

เนื่องจากสิ่งนี้ส่งผลเสียต่อความปลอดภัยของสคริปต์ เซตคุกกี้()สำหรับการโทรหลายครั้ง



ฟังก์ชั่นต่างๆ จะถูกดำเนินการตามลำดับที่ถูกเรียก

ตั้งค่า (ลบ) คุกกี้ ตั้งค่าคุกกี้ ส่งคุกกี้ PHP

จะตั้งค่าคุกกี้โดยใช้ PHP ได้อย่างไร?

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

ใน PHP ตั้งค่าคุกกี้แล้วโดยใช้ฟังก์ชัน เซตคุกกี้().

คุกกี้

จะต้องเป็น

ส่งแล้ว

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

การตั้งค่าคุกกี้

ก่อนปิดเบราว์เซอร์ให้เขียนข้อความต่อไปนี้บนหน้า
setcookie("_ws_","ทดสอบ",0,"/");
// "/" - หากสคริปต์อยู่ในโฟลเดอร์อื่น
// คุกกี้จะยังคงเขียนเช่นนี้ www.sdws.ru
?>

จะตั้งค่าคุกกี้ตามเวลา, หนึ่งวัน, สองสามนาที, เป็นชั่วโมงได้อย่างไร?

ใน php อัลกอริธึมนั้นง่ายมาก
// ตั้งค่าคุกกี้
setcookie("_ws_","ทดสอบ",เวลา()+3600,"/");
?> เวลา()+3600- ตั้งค่าคุกกี้เป็นเวลาหนึ่งชั่วโมง (3600 วินาที)
ตัวอย่างเช่นเราต้องการ ส่งคุกกี้บน 23 วัน
// ตั้งค่าคุกกี้
setcookie("_ws_","ทดสอบ",เวลา()+1987200,"/");
?>

การลบคุกกี้ จะลบคุกกี้ได้อย่างไร?

กำลังลบคุกกี้เกิดขึ้นโดยใช้ฟังก์ชันเดียวกัน เซตคุกกี้()- เราตั้งค่าพารามิเตอร์เดียวกันโดยใช้เครื่องหมายลบเท่านั้น
setcookie("_ws_","ทดสอบ",เวลา()-3600,"/");
?> หัวข้อที่คล้ายกัน: