เหตุใดฉันจึงควรใช้session_regenerate_id()
ฟังก์ชันใน php? ฉันควรใช้มันทุกครั้งหลังจากใช้session_start()
? ฉันอ่านแล้วว่าต้องใช้เพื่อป้องกันการตรึงเซสชันนี่เป็นเหตุผลเดียวหรือไม่?
เหตุใดฉันจึงควรใช้session_regenerate_id()
ฟังก์ชันใน php? ฉันควรใช้มันทุกครั้งหลังจากใช้session_start()
? ฉันอ่านแล้วว่าต้องใช้เพื่อป้องกันการตรึงเซสชันนี่เป็นเหตุผลเดียวหรือไม่?
คำตอบ:
session_regenerate_id()
?ตามที่ชื่อฟังก์ชันระบุไว้เป็นฟังก์ชันที่จะแทนที่รหัสเซสชันปัจจุบันด้วยรหัสใหม่และเก็บข้อมูลเซสชันปัจจุบันไว้
ส่วนใหญ่จะช่วยป้องกันการโจมตีการตรึงเซสชัน การโจมตีการตรึงเซสชันคือการที่ผู้ใช้ที่ประสงค์ร้ายพยายามใช้ช่องโหว่ในระบบเพื่อแก้ไข (ตั้งค่า) รหัสเซสชัน (SID) ของผู้ใช้รายอื่น เมื่อทำเช่นนั้นพวกเขาจะได้รับการเข้าถึงโดยสมบูรณ์ในฐานะผู้ใช้ดั้งเดิมและสามารถทำงานที่ต้องการการรับรองความถูกต้องได้
เพื่อป้องกันการโจมตีดังกล่าวให้กำหนดรหัสเซสชันใหม่ให้ผู้ใช้โดยใช้ session_regenerate_id()
เมื่อเขาลงชื่อเข้าสำเร็จ (หรือสำหรับคำขอ X ทุกครั้ง) ตอนนี้มีเพียงเขาเท่านั้นที่มีรหัสเซสชันและรหัสเซสชัน (แก้ไข) เก่าของคุณใช้ไม่ได้อีกต่อไป
session_regenerate_id()
?ตามที่ symbecean ชี้ให้เห็นในความคิดเห็นด้านล่างรหัสเซสชันจะต้องมีการเปลี่ยนแปลงเมื่อมีการเปลี่ยนแปลงใด ๆ ในสถานะการตรวจสอบสิทธิ์และเฉพาะเมื่อเปลี่ยนการพิสูจน์ตัวตน
อ่านเพิ่มเติม:
คุณควรใช้session_regenerate_id()
เพื่อที่จะหยุดการหักหลังเซสชั่น และการตรึงเซสชั่น
การจี้เซสชันหมายถึงการขโมยคุกกี้เซสชัน สิ่งนี้สามารถทำได้อย่างง่ายดายที่สุดเมื่อแชร์เครือข่ายท้องถิ่นกับคอมพิวเตอร์เครื่องอื่น เช่นที่ Starbucks ตัวอย่าง ... ผู้ใช้ที่มีเซสชัน Y กำลังเรียกดูเว็บไซต์ของ James ที่ Starbucks ฉันกำลังฟังการรับส่งข้อมูลในเครือข่ายของพวกเขาจิบลาเต้ของฉัน ฉันใช้คุกกี้ของเซสชัน Y สำหรับเว็บไซต์ของ James และตั้งค่าเบราว์เซอร์ของฉันให้ใช้งาน ตอนนี้เมื่อฉันเข้าถึงไซต์ของเจมส์ไซต์ของเจมส์
จากหน้าเว็บนี้ :
Session Fixation เป็นเทคนิคการโจมตีที่บังคับให้ ID เซสชันของผู้ใช้เป็นค่าที่ชัดเจน ขึ้นอยู่กับฟังก์ชันการทำงานของเว็บไซต์เป้าหมายสามารถใช้เทคนิคหลายอย่างเพื่อ "แก้ไข" ค่ารหัสเซสชัน เทคนิคเหล่านี้มีตั้งแต่การหาประโยชน์จาก Cross-site Scripting ไปจนถึงการเจาะเว็บไซต์ด้วยคำขอ HTTP ที่ทำไว้ก่อนหน้านี้ หลังจากแก้ไข ID เซสชันของผู้ใช้แล้วผู้โจมตีจะรอให้ผู้ใช้นั้นเข้าสู่ระบบ เมื่อผู้ใช้ทำเช่นนั้นผู้โจมตีจะใช้ค่ารหัสเซสชันที่กำหนดไว้ล่วงหน้าเพื่อถือว่าเป็นตัวตนออนไลน์เดียวกัน
เมื่อต้องการใช้
เมื่อผู้ใช้กำลังแก้ไข / อัปเดตอินพุตที่สำคัญบางอย่าง (เปลี่ยนรหัสผ่านข้อมูลรับรองลืมรหัสผ่าน ฯลฯ ) ซึ่งอาจส่งผลต่อความปลอดภัยของไซต์หรือนโยบายความเป็นส่วนตัว
ดูสิ่งนี้ด้วย:
ฉันคิดว่าปัญหาของเซสชั่นเป็นพิษได้รับการคุ้มครองค่อนข้างดี
เพื่อตอบคำถาม "ฉันควรใช้สิ่งนี้เมื่อใด" ส่วนสิ่งสำคัญคือต้องย้อนกลับไปพิจารณาว่าแอปพลิเคชันของคุณกำลังทำอะไรกับเซสชันนี้ หรือพูดอีกอย่างหนึ่งนี่คือคำถามเพื่อความปลอดภัยที่สำคัญที่คุณต้องตอบ
หากมีคนเข้าร่วมเซสชั่นนี้พวกเขาจะได้อะไร?
หากสิ่งที่คุณทำคือติดตามข้อมูลที่ไม่ระบุตัวตน (ผู้ใช้เข้ามาที่ไซต์และคุณใช้เพื่อติดตามการเยี่ยมชมของพวกเขา) ก็มีเหตุผลเพียงเล็กน้อยที่จะสร้างเซสชันใหม่ นักจี้จะไม่ได้รับสิ่งมีค่าจากการคว้าเซสชันนั้น
อย่างไรก็ตามเว็บไซต์จำนวนมากเสนอการเข้าสู่ระบบ การเข้าสู่ระบบเปลี่ยนแปลงหลายสิ่งหลายอย่าง ฉันสามารถเข้าถึงโปรไฟล์ของฉันได้ ฉันสามารถเปลี่ยนการตั้งค่า ดังนั้นนักจี้อาจต้องการการเข้าถึงบัญชีของฉันโดยเฉพาะอย่างยิ่งหากผู้ใช้ปกติและผู้ดูแลระบบทั้งหมดใช้เซสชันเพื่อจัดการการเข้าสู่ระบบ ดังนั้นเมื่อมีคนเข้ามาที่ไซต์ของฉันและเข้าสู่ระบบฉันจะสร้างเซสชันใหม่ มันเพิ่มความปลอดภัยอีกชั้นที่ผู้ใช้ที่เพิ่งเข้าสู่ระบบของฉันมีโอกาสน้อยที่จะถูกไฮแจ็ค
เมื่อใดก็ตามที่เราเพิ่มข้อมูลสำคัญลงในเซสชันคุณควรพิจารณาสร้างรหัสเซสชันใหม่ หากคุณต้องการทำให้แอปพลิเคชันของคุณแข็งขึ้นจากการตรึงการสร้างใหม่แบบสุ่มจะมีประโยชน์ แต่ฉันจะไม่สร้างใหม่ในทุกคำขอ โดยค่าเริ่มต้น PHP จะเก็บเซสชันไว้ในไฟล์บนดิสก์ภายในเครื่อง คุณกำลังเพิ่มดิสก์ I / O จำนวนมากเพื่อลดเวกเตอร์การโจมตีที่ค่อนข้างเล็ก หากคุณต้องการความปลอดภัยมากขึ้นฉันขอแนะนำให้ใช้ HTTPS เต็มรูปแบบมากกว่าการสร้างใหม่เป็นประจำ (HTTPS ทำให้การตรึงยากมากที่จะดึงออก)
session_regenerate_id
?คุณควรใช้เพื่อป้องกันการตรึงเซสชันตรึงเซสชั่น
session_regenerate_id
?เมื่อใดก็ตามที่สถานะการรับรองความถูกต้องเปลี่ยนไปส่วนใหญ่จะเป็นการล็อกอินและออกจากระบบ
บ็อบนั่งอยู่ที่คอมพิวเตอร์สาธารณะและโดยการเรียกดู stackoverflow.com เขาเปิดเซสชันใหม่ที่นั่น รหัสเซสชันถูกบันทึกไว้ในคุกกี้ (พร้อมhttpOnly
แฟล็กเพื่อป้องกันการเข้าถึงผ่านจาวาสคริปต์) ลองนึกภาพ Stack Overflow เปิดใช้งาน HTTPS ตลอดเวลาและsecure
ตั้งค่าสถานะสำหรับคุกกี้ด้วย
เราจะขโมยเซสชั่นตอนนี้ได้อย่างไร?
Bob เขียนรหัสเซสชัน เขาออกจากคอมพิวเตอร์โดยไม่ปิดเบราว์เซอร์ ตอนนี้อลิซมาที่คอมพิวเตอร์เครื่องนี้และเห็นว่ามีการโหลด Stack Overflow แล้ว เธอเข้าสู่ระบบเดี๋ยวนี้
session_regenerate_id
ตอนนี้เรากำลังอยู่ในขั้นตอนที่คุณควรใช้ หากคุณไม่ได้สร้างรหัสเซสชันใหม่ที่นี่ในระหว่างการเข้าสู่ระบบบ็อบสามารถใช้เซสชันก่อนหน้านี้ที่เขาจดไว้เพื่อเข้าถึงเซสชันของอลิซและจะเข้าสู่ระบบในฐานะอลิซในตอนนี้
session_regenerate_id()
ออก Alice สามารถเข้าถึงบัญชี bobs ได้หรือไม่? นั่นถูกต้องใช่ไหม?
คุณสามารถใช้เพื่อความปลอดภัยที่ดีขึ้น
ด้วยวิธีนี้คุณกำลังสร้างรหัสเซสชันสำหรับการใช้งานครั้งเดียว
สมมติว่ารหัสเซสชันผู้ใช้ของคุณคือ = 3
แฮกเกอร์บางรายแฮ็กไคลเอ็นต์ของคุณและรับ session_id แฮ็กเกอร์จึงสามารถใช้คุกกี้นั้นเพื่อใช้เซสชันของตนได้
หากคุณมีรหัสเช่น
session_start();
session_regenerate_id();
คุณสามารถเปลี่ยนเซสชันได้ทุกครั้งที่ใช้เว็บไซต์ของคุณ
ตอนนี้แฮ็กเกอร์ได้รับ sessionid = 3
แต่คุณได้เปลี่ยนเซสชั่นหลังจากที่เขาใช้มัน
ผู้ใช้มี sessionid = 4 // auth
แฮ็กเกอร์มีเซสชัน = 3 // null
แต่มีจุดเล็ก ๆ น้อย ๆ ที่บอกว่าคุณกำลังใช้วิธีการสร้างใหม่และลูกค้าของคุณเพียงแค่ลงชื่อเข้าใช้เว็บไซต์และปิดเบราว์เซอร์หรือไม่ใช้งาน ไคลเอนต์ของคุณมี sessionid = 4 และหากแฮ็กเกอร์ได้รับคุกกี้ที่ส่วนนั้นพวกเขาจะมี sessionid เดียวกัน
ตามที่อธิบายไว้ข้างต้นวิธีนี้คุณสามารถป้องกันไคลเอ็นต์ของคุณจากการดมข้อมูลได้ทางเดียว แต่ก็ยังไม่สามารถแก้ไขปัญหานี้ได้ดี
แต่จะปลอดภัยมากหากคุณใช้ SSL enc
ขออภัยสำหรับภาษาอังกฤษที่ไม่ดี
กรณีใช้งานง่าย:
// User visits a webshop
$shopcart = new Cart();
เซสชันเริ่มต้นและรายการถูกสร้างขึ้นในฐานข้อมูล shopcart ของผู้ใช้ถูกระบุโดยรหัสเซสชันของเขา
// User orders items
$shopcart->add('123', 20);
$shopcart->add('124', 18);
$shopcart->add('127', 5);
สำหรับแต่ละผลิตภัณฑ์ที่เพิ่มบันทึกจะถูกสร้างขึ้นในตาราง shopcart ของฉัน ระบุด้วยรหัสเซสชันด้วย
// User saves cart in order to use it later
$shopcart->save();
ผู้ใช้ตัดสินใจที่จะบันทึกรถเข็นของเขา ตอนนี้กำลังแนบกับรหัสผู้ใช้ของเขา
// Regenerate session id for user to be able to make a new cart
session_regenerate_id();
รหัส sesssion จะถูกสร้างใหม่และผู้ใช้สามารถเริ่มสร้าง shopcart ใหม่ได้แล้ว
session_regenerate_id (): ไม่สามารถสร้างรหัสเซสชันใหม่ได้ - เซสชันไม่ทำงาน
if(session_status() == PHP_SESSION_ACTIVE)
{
session_regenerate_id();
}