เมื่อใดและทำไมฉันจึงควรใช้ session_regenerate_id ()


96

เหตุใดฉันจึงควรใช้session_regenerate_id()ฟังก์ชันใน php? ฉันควรใช้มันทุกครั้งหลังจากใช้session_start()? ฉันอ่านแล้วว่าต้องใช้เพื่อป้องกันการตรึงเซสชันนี่เป็นเหตุผลเดียวหรือไม่?


เนื่องจากหลังจากเซสชันเริ่มต้นจะถูกสร้างขึ้นและในหน้าอื่น ๆ เมื่อคุณเริ่มเซสชันจะมีตัวแปรอยู่: -
HaRsH

@HaRsH Oo? Session_regenerate_id จะลบรหัสเซสชันเก่าและสร้างรหัสใหม่เพื่อหลีกเลี่ยงการไฮแจ็คเซสชันด้วย XSS เป็นต้น ไม่มีผลใด ๆ ต่อการมองเห็นตัวแปร SESSION ในเอกสารอื่น ๆ
Xatenev

ใช่ฉันรู้ว่าฉันไม่มีผลกับตัวแปรอื่น แต่ถ้าคุณไม่เริ่มเซสชันในหน้านั้นตัวแปรจะไม่มีอยู่ในหน้านั้นใน core php
HaRsH

1
แต่นี่เป็นเรื่องของ session_regenerate_id ไม่ใช่เกี่ยวกับ session_start ...
Xatenev

1
ฉันขอแนะนำให้อ่าน RFC ที่มีการเสนอ: wiki.php.net/rfc/precise_session_management
jankal

คำตอบ:


98

คืออะไรsession_regenerate_id()?

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

มันทำอะไร?

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

เพื่อป้องกันการโจมตีดังกล่าวให้กำหนดรหัสเซสชันใหม่ให้ผู้ใช้โดยใช้ session_regenerate_id()เมื่อเขาลงชื่อเข้าสำเร็จ (หรือสำหรับคำขอ X ทุกครั้ง) ตอนนี้มีเพียงเขาเท่านั้นที่มีรหัสเซสชันและรหัสเซสชัน (แก้ไข) เก่าของคุณใช้ไม่ได้อีกต่อไป

ฉันควรใช้เมื่อใด session_regenerate_id() ?

ตามที่ symbecean ชี้ให้เห็นในความคิดเห็นด้านล่างรหัสเซสชันจะต้องมีการเปลี่ยนแปลงเมื่อมีการเปลี่ยนแปลงใด ๆ ในสถานะการตรวจสอบสิทธิ์และเฉพาะเมื่อเปลี่ยนการพิสูจน์ตัวตน

อ่านเพิ่มเติม:


2
และจะเกิดอะไรขึ้นหากแฮกเกอร์ทำการโทรครั้งที่ 20? รหัสเซสชันมีการเปลี่ยนแปลงและเขาเป็นคนเดียวที่เป็นเจ้าของเซสชัน;))
fred727

@ fred727 หากแฮ็กเกอร์โชคดีพอถึงสายที่ 20 ผู้ใช้จะมีรหัสที่ไม่ถูกต้องและไม่ได้รับการตรวจสอบสิทธิ์อีกต่อไป หากไม่มีการสร้างใหม่ทั้งแฮ็กเกอร์และผู้ใช้จะได้รับการตรวจสอบสิทธิ์
Bradmage

นอกจากนี้ยังอาจมีประโยชน์ในการเรียก session_regenerate_id เมื่อจัดเก็บข้อมูลที่ละเอียดอ่อนในเซสชัน (ไม่ใช่เฉพาะที่การตรวจสอบสิทธิ์เท่านั้น)
Adam

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

"เพื่อแก้ไข (ตั้งค่า) รหัสเซสชัน (SID) ของผู้ใช้รายอื่น" .... ควรแทนที่ด้วย "เพื่อแก้ไข (ตั้งค่า) รหัสเซสชัน (SID) บนคอมพิวเตอร์ของผู้ใช้รายอื่นจากนั้นใช้หลังจากตรวจสอบสิทธิ์แล้ว "
นักบัญชี

25

คุณควรใช้session_regenerate_id()เพื่อที่จะหยุดการหักหลังเซสชั่น และการตรึงเซสชั่น

จากคำตอบ Security.SE นี้ :

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

จากหน้าเว็บนี้ :

Session Fixation เป็นเทคนิคการโจมตีที่บังคับให้ ID เซสชันของผู้ใช้เป็นค่าที่ชัดเจน ขึ้นอยู่กับฟังก์ชันการทำงานของเว็บไซต์เป้าหมายสามารถใช้เทคนิคหลายอย่างเพื่อ "แก้ไข" ค่ารหัสเซสชัน เทคนิคเหล่านี้มีตั้งแต่การหาประโยชน์จาก Cross-site Scripting ไปจนถึงการเจาะเว็บไซต์ด้วยคำขอ HTTP ที่ทำไว้ก่อนหน้านี้ หลังจากแก้ไข ID เซสชันของผู้ใช้แล้วผู้โจมตีจะรอให้ผู้ใช้นั้นเข้าสู่ระบบ เมื่อผู้ใช้ทำเช่นนั้นผู้โจมตีจะใช้ค่ารหัสเซสชันที่กำหนดไว้ล่วงหน้าเพื่อถือว่าเป็นตัวตนออนไลน์เดียวกัน

เมื่อต้องการใช้

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

ดูสิ่งนี้ด้วย:

คู่มือการรักษาความปลอดภัย PHP: เซสชัน

การตรึงเซสชัน (อ่านดี)


23

ฉันคิดว่าปัญหาของเซสชั่นเป็นพิษได้รับการคุ้มครองค่อนข้างดี

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

หากมีคนเข้าร่วมเซสชั่นนี้พวกเขาจะได้อะไร?

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

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

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


2
HTTPS ไม่ได้เปลี่ยนแปลงอะไรในการแก้ไข
kelunik

4
แต่จะทำให้การโจมตีด้วยการดมกลิ่นยากขึ้นซึ่งสามารถใช้เพื่อรับรหัสเซสชันได้ตั้งแต่แรก
demonkoryu

แอป php ของฉันออกจากระบบภายในไม่กี่วินาทีโดยใช้การสร้างใหม่มีไฟล์เซสชันที่สามารถสร้างได้ จำกัด หรือมีข้อ จำกัด เกี่ยวกับรหัสที่สร้างใหม่ซึ่งอาจทำให้เกิดการออกจากระบบได้หรือไม่
sqlchild

ไม่โดยทั่วไปไม่ คุณอาจต้องการโพสต์คำถามแยกต่างหาก
Machavity

17

ทำไมฉันจึงควรใช้ session_regenerate_id ?

คุณควรใช้เพื่อป้องกันการตรึงเซสชันตรึงเซสชั่น

ฉันควรใช้เมื่อใด session_regenerate_id ?

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

ตัวอย่าง

บ็อบนั่งอยู่ที่คอมพิวเตอร์สาธารณะและโดยการเรียกดู stackoverflow.com เขาเปิดเซสชันใหม่ที่นั่น รหัสเซสชันถูกบันทึกไว้ในคุกกี้ (พร้อมhttpOnlyแฟล็กเพื่อป้องกันการเข้าถึงผ่านจาวาสคริปต์) ลองนึกภาพ Stack Overflow เปิดใช้งาน HTTPS ตลอดเวลาและsecureตั้งค่าสถานะสำหรับคุกกี้ด้วย

เราจะขโมยเซสชั่นตอนนี้ได้อย่างไร?

Bob เขียนรหัสเซสชัน เขาออกจากคอมพิวเตอร์โดยไม่ปิดเบราว์เซอร์ ตอนนี้อลิซมาที่คอมพิวเตอร์เครื่องนี้และเห็นว่ามีการโหลด Stack Overflow แล้ว เธอเข้าสู่ระบบเดี๋ยวนี้

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


แต่จนกว่าจะถึงเวลาที่session_regenerate_id()ออก Alice สามารถเข้าถึงบัญชี bobs ได้หรือไม่? นั่นถูกต้องใช่ไหม?
Akam

2
@akam - มันสายไป แต่ก็คุ้มค่าที่จะตอบกลับ ... 1. Bob ไม่ออกจากระบบ Alice สามารถใช้การเข้าสู่ระบบของเขาได้ - 2. Bob ออกจากระบบ Alice ไม่ได้เข้าสู่ระบบ Alice สามารถใช้ session ID ได้ แต่ ไม่มีการเข้าสู่ระบบที่ใช้งานเพื่อเข้าถึงข้อมูลของเขา - 3. Bob ออกจากระบบ Alice เข้าสู่ระบบ Bob ใช้รหัสเซสชันมีการเข้าสู่ระบบที่ใช้งานอยู่ Bob เข้าถึงข้อมูลของ Alice แต่เพื่อให้เฉพาะเจาะจง: ขึ้นอยู่กับการรักษาความปลอดภัยของสคริปต์รหัสเซสชันไม่จำเป็นต้องหมายความว่าคุณสามารถเข้าถึงข้อมูลของผู้ใช้ที่ออกจากระบบได้ แต่โดยทั่วไปแล้วจะมีความเป็นไปได้และมีความเสี่ยงสูง
codekandis

15

คุณสามารถใช้เพื่อความปลอดภัยที่ดีขึ้น

ด้วยวิธีนี้คุณกำลังสร้างรหัสเซสชันสำหรับการใช้งานครั้งเดียว

สมมติว่ารหัสเซสชันผู้ใช้ของคุณคือ = 3

แฮกเกอร์บางรายแฮ็กไคลเอ็นต์ของคุณและรับ session_id แฮ็กเกอร์จึงสามารถใช้คุกกี้นั้นเพื่อใช้เซสชันของตนได้

หากคุณมีรหัสเช่น

session_start();
session_regenerate_id();

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

ตอนนี้แฮ็กเกอร์ได้รับ sessionid = 3

แต่คุณได้เปลี่ยนเซสชั่นหลังจากที่เขาใช้มัน

ผู้ใช้มี sessionid = 4 // auth

แฮ็กเกอร์มีเซสชัน = 3 // null

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

ตามที่อธิบายไว้ข้างต้นวิธีนี้คุณสามารถป้องกันไคลเอ็นต์ของคุณจากการดมข้อมูลได้ทางเดียว แต่ก็ยังไม่สามารถแก้ไขปัญหานี้ได้ดี

แต่จะปลอดภัยมากหากคุณใช้ SSL enc

ขออภัยสำหรับภาษาอังกฤษที่ไม่ดี


12

กรณีใช้งานง่าย:

// 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 ใหม่ได้แล้ว


5

session_regenerate_id (): ไม่สามารถสร้างรหัสเซสชันใหม่ได้ - เซสชันไม่ทำงาน

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.