เว็บเซสชัน“ ออกแบบไม่ดี” หรือไม่? ทำไม?


13

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

เขาตอบฉันอีกครั้งว่าแม้ใน MS พวกเขาสามารถตอบฉันได้อย่างง่ายดายว่ามันเป็นการออกแบบที่ไม่ดี และเขาสามารถแสดงเอกสารสีขาวให้ฉันดูได้

น่าเสียดายที่ฉันไม่มีโอกาสติดต่อกับผู้ชายคนนี้อีกต่อไป แต่ฉันอยากจะเข้าใจมากขึ้นเกี่ยวกับมุมมองของเขา ใครบ้างมีข้อมูล / มุมมองเกี่ยวกับที่นี่?


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

@ Katana314 การจัดเก็บฐานข้อมูลพร้อมคุกกี้ คุณสามารถใช้เซสชันสำหรับข้อมูลพื้นฐานเช่นการระบุผู้ใช้ แต่การใช้งานเซสชันจำนวนมาก (โดยเฉพาะใน Django ซึ่งเราตีหลายครั้ง) มีข้อบกพร่องที่สามารถสร้างเงื่อนไขการแข่งขันด้วยข้อมูลชั่วคราวมากขึ้นทุกครั้งที่ผู้ใช้คนเดียวกันร้องขอหลายครั้ง ถูกส่งในครั้งเดียว (เช่นเดียวกับการโทร AJAX)
Izkata

2
การจัดเก็บฐานข้อมูลกับคุกกี้เป็นเพียงเรื่องของเซสชันของคุณในฐานข้อมูล
Alan Shutko

คำตอบ:


11

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

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

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

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

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


1
but you can't always count on the client being able to save cookiesจากนั้น AFAIK คุณไม่สามารถนับจำนวนเซสชันได้เช่นกัน ไม่ใช้คุกกี้เพื่อระบุว่าเซสชันใดเป็นของผู้ใช้รายใดหรือมีวิธีอื่นและนั่นเป็นวิธีที่พบได้บ่อยที่สุด
Izkata

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

8

ฉันคิดว่าคุณสับสนสองหัวข้อ: 1) เซสชันและ 2) รูปแบบหน้าเว็บของ asp.net

เว็บเซสชันจำเป็นสำหรับการตรวจสอบผู้ใช้ เป็นการดีที่จะใช้เซสชั่นเพื่อการนี้เท่านั้น คุณไม่ควรจัดเก็บข้อมูลผู้ใช้ในเซสชัน (ไม่ว่าจะเป็นบนเซิร์ฟเวอร์ในคุกกี้หรือเป็น asp.net/webforms ก็ทำได้: ภายในหน้าเว็บของตัวเอง) ไม่มีใครควรพูดว่าเว็บเซสชั่นไม่ดี แต่เป็นการเก็บข้อมูลผู้ใช้ในเซสชั่นคือการปฏิบัติที่ไม่ดี เหตุผลในการไม่จัดเก็บข้อมูลผู้ใช้บนเซิร์ฟเวอร์มีเหตุผลเดียวกันเพื่อหลีกเลี่ยงตัวแปรส่วนกลาง การจัดเก็บข้อมูลผู้ใช้ในคุกกี้หรือในหน้าสามารถแนะนำปัญหาด้านความปลอดภัย การใช้รูปแบบหน้าของ asp.net นั้นไม่ได้เป็นไปตามลักษณะไร้สัญชาติของเว็บ คุณสามารถทำการค้นหาเพื่อหาข้อมูลเพิ่มเติมเกี่ยวกับสาเหตุที่เว็บฟอร์มนั้นมีการออกแบบที่ไม่ดี ในทางกลับกันเป็นส่วนที่จำเป็นของเว็บแอปพลิเคชัน


"เซสชันในอีกแง่หนึ่งเป็นส่วนที่จำเป็นของเว็บแอปพลิเคชัน ไม่
masterxilo

6

การควบคุมและการจัดเก็บสถานะเซสชันในหน้าเว็บเป็นหลักในการแฮก เป็นกรณีของ MS - เป็นสิ่งที่จำเป็นเพราะพวกเขาต้องการที่จะสามารถจัดเตรียมสภาพแวดล้อมการพัฒนาที่คุณสามารถออกแบบหน้าเว็บได้อย่างที่คุณสามารถทำได้ในสภาพแวดล้อม winform

MS ได้ย้ายตัวเองไปสู่สถาปัตยกรรม MVC (เวอร์ชันล่าสุด - MVC 4) ซึ่งเป็นการกลับไปสู่โปรโตคอลที่ควรเป็นจริงมากขึ้น

มีสถานการณ์ที่สถานะการจัดเก็บยังคงมีประโยชน์ แต่ควรเข้าใจว่านี่เป็นข้อยกเว้นมากกว่ากฎ

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