คำขอ AJAX เก็บข้อมูลเซสชัน PHP ไว้ไหม


154

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

คำตอบ:


191

คำตอบคือใช่:

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

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


10
การติดตามผล: เซิร์ฟเวอร์สามารถตั้งค่าHttpOnlyสถานะเมื่อตั้งค่าคุกกี้ซึ่งหมายความว่า Javascript ของคุณจะไม่สามารถดูคุกกี้ได้ อย่างไรก็ตามคุกกี้จะยังคงถูกส่งสำหรับทั้ง AJAX และคำขอหน้าปกติและทำงานต่อไปเหมือนเดิมทุกประการ Javascript ของคุณจะไม่เห็นในdocument.cookieเลย
thomasrutter

หากการรายงานข้อผิดพลาด PHP เปิดอยู่คุณสามารถรับข้อผิดพลาดของเซสชันที่ส่งคืนพร้อมการตอบกลับ AJAX ฉันได้รับWarning: session_write_close(): Failed to write session data (user)ข้อผิดพลาดเป็นระยะเมื่อเร็ว ๆ นี้ในโครงการ แต่เมื่อคำขอ AJAX เกิดขึ้นระหว่างการโหลดส่วนที่เหลือของหน้า ฉันกำลังใช้ฐานข้อมูล MySQL สำหรับข้อมูลเซสชั่นและเป็นไปได้ว่าคำขอหน้าหลักคือการล็อคตารางนั้นป้องกันไม่ให้คำขอ AJAX เข้าถึงได้
Buttle Butkus

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

มันเกิดขึ้นในเครื่องร่อนเร่ดังนั้นการเชื่อมต่อ MySQL ควรจะอิ่มตัว ฉันจะโพสต์คำถามแน่นอนถ้าฉันไม่สามารถหาได้ในไม่ช้า
Buttle Butkus

23

หากไฟล์ PHP คำขอ AJAX มีsession_start()ข้อมูลเซสชันจะถูกเก็บไว้ (ถอดคำขออยู่ภายในโดเมนเดียวกัน)


2
จริง ๆ แล้วนั่นคือสิ่งที่ฉันลืมที่จะทำ :-)
sivann

23

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


1
ฉันอาจจะผิด แต่ฉันคิดว่ามันเป็นไปไม่ได้ที่จะโพสต์คำขอ ajax ไปยังโดเมนอื่น ๆ (ยกเว้นโดเมนย่อย)?
Emil H

คุณอาจสามารถโกงด้วยเคล็ดลับสคริปต์แบบไดนามิก ไม่เคยเบื่อเลย
cletus

1
ใช่ไม่สามารถทำการร้องขอ ajax กับโดเมนอื่นได้ อย่างไรก็ตามคุณสามารถแทรกแท็ก <script> ในหน้าแบบไดนามิกและตั้งค่า src เป็น url โดเมนแบบออฟไลน์ที่สะท้อนจาวาสคริปต์
คลิกโหวต

1
คำขอ ajax ไม่สามารถทำได้กับโดเมนอื่น แต่คุณสามารถสร้าง proxy ในรหัส php ของคุณได้ ajax ร้องขอไปยัง proxy, proxy ร้องขอไปยังโดเมนอื่น
Peter Long

2
แค่ทราบ ... คำขอ ajax สามารถสร้างข้ามโดเมนได้ แต่หากประเภทการตอบสนองคือ jsonp ฉันทำสิ่งนี้ตลอดเวลา
Epiphany

8

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

PHP สามารถกำหนดค่าให้รักษาเซสชันโดยการเขียน URL ใหม่แทนคุกกี้ ( วิธีที่ดีหรือไม่ดี (<- ดูตัวอย่างความคิดเห็นที่สูงที่สุดในนั้น) เป็นคำถามที่แยกต่างหากตอนนี้ให้ยึดติดกับคำถามปัจจุบันด้วยหมายเหตุด้านเดียว: ปัญหาที่โดดเด่นที่สุดของเซสชันตาม URL - ที่เห็นได้ชัด ทัศนวิสัยของ ID เซสชั่นเปล่า - ไม่เป็นปัญหากับการเรียก Ajax ภายใน แต่ถ้าเปิดใช้สำหรับ Ajax จะเปิดสำหรับส่วนที่เหลือของไซต์ด้วยดังนั้นจึงมี ... )

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

  1. หากการเรียก Ajax เพียงดึง URL คำต่อคำออกจาก HTML (ตามที่ได้รับจาก PHP) นั่นควรจะเป็น OK เนื่องจากพวกมันถูกปรุงสุกแล้ว

  2. หากพวกเขาจำเป็นต้องรวบรวมคำขอ URIs ด้วยตนเองจะต้องเพิ่มรหัสเซสชันใน URL ด้วยตนเอง (ตรวจสอบที่นี่หรือแหล่งที่มาของหน้าเว็บที่สร้างโดย PHP ( โดยเปิด URL ใหม่ ) เพื่อดูวิธีการทำ)


จากOWASP.org :

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

จากโพสต์ในฟอรัม Ruby :

เมื่อใช้ php กับคุกกี้รหัสเซสชันจะถูกส่งโดยอัตโนมัติในส่วนหัวของคำขอแม้สำหรับ Ajax XMLHttpRequests หากคุณใช้หรืออนุญาตเซสชัน php ที่ใช้ URL คุณจะต้องเพิ่มรหัสเซสชันใน URL คำขอ Ajax ทุกอัน


สถิติที่เชื่อถือได้เกี่ยวกับจำนวนผู้ที่ปิดใช้งานคุกกี้เซสชัน ? (ฉันไม่พบอะไรเลยเฉพาะใน Javascript: ที่ดูเหมือนประมาณ 2% ในสหรัฐอเมริกา / ยุโรปและ ~ 1.2% world avg.)
Sz

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

3

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


0

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

หากแอปพลิเคชันกำลังสร้างรหัสเซสชันซ้ำเช่นนี้คุณสามารถลงเอยด้วยสถานการณ์ที่การร้องขอ ajax มีผลทำให้โมฆะ / แทนที่รหัสเซสชันในหน้าการร้องขอ


0

นั่นคือสิ่งที่กรอบทำเช่นถ้าคุณเริ่มต้นเซสชั่นใน Front Controller หรือสคริปต์ Boostrap คุณจะไม่ต้องกังวลเกี่ยวกับมันเป็น initalization ทั้งสำหรับตัวควบคุมหน้าหรือตัวควบคุม ajax กรอบ PHP ไม่ได้เป็นยาครอบจักรวาล แต่พวกเขาทำสิ่งที่มีประโยชน์มากมายเช่นนี้!


0

ใส่เซสชั่นของคุณ () รับรองความถูกต้องในทุกหน้าฝั่งเซิร์ฟเวอร์ยอมรับคำขอ ajax:

if(require_once("auth.php")) {

//run json code

}

// do nothing otherwise

นั่นเป็นวิธีเดียวที่ฉันเคยทำ

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