هل هناك طريقة لمنع عرض الصفحة بمجرد قيام الشخص بتسجيل الخروج ولكنه يضغط على زر "الرجوع"؟

StackOverflow https://stackoverflow.com/questions/64059

سؤال

لدي بعض مواقع الويب التي تتطلب تسجيل الدخول وتظهر معلومات حساسة.

يذهب الشخص إلى الصفحة، ويُطلب منه تسجيل الدخول، ثم يتمكن من رؤية المعلومات.

يقوم الشخص بتسجيل الخروج من الموقع، ويتم إعادة توجيهه مرة أخرى إلى صفحة تسجيل الدخول.

يمكن للشخص بعد ذلك الضغط على "رجوع" والعودة مباشرة إلى الصفحة التي تحتوي على المعلومات الحساسة.نظرًا لأن المتصفح يعتبرها مجرد HTML معروض، فإنه لا يعرضها لهم أي مشكلة.

هل هناك طريقة لمنع عرض هذه المعلومات عندما يضغط الشخص على زر "رجوع" من شاشة تسجيل الخروج؟أنا لا أحاول تعطيل زر الرجوع نفسه، بل أحاول فقط منع عرض المعلومات الحساسة مرة أخرى لأن الشخص لم يعد مسجلاً الدخول إلى الموقع بعد الآن.

من أجل الجدال، الموقع/السيناريو أعلاه موجود في ASP.NET مع مصادقة النماذج (لذا عندما ينتقل المستخدم إلى الصفحة الأولى، وهي الصفحة التي يريدها، تتم إعادة توجيهه إلى صفحة تسجيل الدخول - في حالة ما إذا كان ذلك يجعل فرق).

هل كانت مفيدة؟

المحلول

الإجابة المختصرة هي أنه لا يمكن القيام بذلك بشكل آمن.

ومع ذلك، هناك الكثير من الحيل التي يمكن تنفيذها لتجعل من الصعب على المستخدمين الرد وعرض البيانات الحساسة.

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(Now.AddSeconds(-1));
Response.Cache.SetNoStore();
Response.AppendHeader("Pragma", "no-cache");

سيؤدي هذا إلى تعطيل التخزين المؤقت على جانب العميل، مهما كان الأمر غير مدعوم من قبل جميع المتصفحات.

إذا كان لديك خيار استخدام AJAX، فيمكن استرداد البيانات الحساسة باستخدام لوحة التحديث التي يتم تحديثها من رمز العميل، وبالتالي لن يتم عرضها عند الرد ما لم يكن العميل قيد تسجيل الدخول.

نصائح أخرى

ذاكرة التخزين المؤقت والتاريخ مستقلان ولا ينبغي لأحد أن يؤثر على الآخر.

الاستثناء الوحيد مصنوعة للبنوك هو هذا المزيج من HTTPS و Cache-Control: must-revalidate يتم تحديث القوات عند التنقل في التاريخ.

في HTTP العادي، لا توجد طريقة للقيام بذلك إلا من خلال استغلال أخطاء المتصفح.

يمكنك اختراقه باستخدام جافا سكريبت الذي يتحقق document.cookie وإعادة التوجيه عند تعيين ملف تعريف الارتباط "القاتل"، لكنني أتخيل أن هذا قد يحدث خطأً خطيرًا عندما لا يقوم المتصفح بتعيين/مسح ملفات تعريف الارتباط تمامًا كما هو متوقع.

من aspdev.org:

أضف السطر التالي أعلى معالج الأحداث Page_Load ولن يتم تخزين صفحة ASP.NET الخاصة بك مؤقتًا في متصفحات المستخدمين:

Response.Cache.SetCacheability(HttpCacheability.NoCache)

تضمن إعدادات هذه الخاصية أنه إذا قام المستخدم بالضغط على زر الرجوع، فسيتم اختفاء المحتوى، وإذا ضغط على "تحديث"، فسيتم إعادة توجيهه إلى صفحة تسجيل الدخول.

عناصر DannySmurf و<meta> لا يمكن الاعتماد عليها على الإطلاق عندما يتعلق الأمر بالتحكم في التخزين المؤقت، وخاصةً Pragma. مرجع.

dannyp وآخرون، عدم وجود ذاكرة تخزين مؤقت لا يمنع ذاكرات التخزين المؤقت من تخزين الموارد الحساسة.إنه يعني فقط أن ذاكرة التخزين المؤقت لا يمكنها خدمة المورد الذي تم تخزينه دون إعادة التحقق من صحته أولاً.إذا كنت ترغب في منع تخزين الموارد الحساسة مؤقتًا، فستحتاج إلى استخدام التوجيه no-store.

يمكن أن يكون لديك وظيفة جافا سكريبت تقوم بفحص سريع للخادم (ajax) وإذا لم يقوم المستخدم بتسجيل الدخول، فإنه يمسح الصفحة الحالية ويستبدلها برسالة.من الواضح أن هذا سيكون عرضة لمستخدم متوقف عن تشغيل جافا سكريبت، ولكن هذا نادر جدًا.على الجانب العلوي، هذه تقنية المتصفح والخادم (asp/php وما إلى ذلك) حيادية.

أنت تبحث عن توجيه عدم التخزين المؤقت:

<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">

إذا كنت قد بدأت في تصميم صفحة رئيسية، فقد يكون هذا أمرًا صعبًا بعض الشيء، ولكن أعتقد أنه يمكنك وضع هذا التوجيه على صفحة واحدة، دون التأثير على بقية موقعك (بافتراض أن هذا هو ما تريده).

إذا كنت قد حصلت على مجموعة التوجيهات هذه، فسيعود المتصفح بإخلاص إلى الخادم بحثًا عن نسخة جديدة تمامًا من الصفحة، مما سيجعل الخادم الخاص بك يرى أن المستخدم لم تتم مصادقته وينقله إلى صفحة تسجيل الدخول.

اجعل عملية تسجيل الخروج أ POST.ثم يطالب المتصفح بـ "هل أنت متأكد من أنك تريد إعادة نشر النموذج؟" بدلا من إظهار الصفحة.

لا أعرف كيفية القيام بذلك في ASP.NET ولكن في PHP سأفعل شيئًا مثل:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");

مما يفرض على المتصفح إعادة التحقق من هذا العنصر، لذلك يجب تشغيل فحص المصادقة الخاص بك، مما يمنع وصول المستخدم.

إنه أمر مرهق بعض الشيء، ولكن إذا كان لديك تطبيق Java صغير أو تطبيق فلاش تم تضمينه وتم إجراء المصادقة من خلاله، فيمكنك إجراء ذلك بحيث يتعين عليهم المصادقة في "الوقت الفعلي" مع الخادم في كل مرة أرادوا عرض المعلومات.

باستخدام هذا يمكنك أيضًا تشفير أي معلومات.

هناك دائمًا احتمال أن يقوم شخص ما بحفظ الصفحة التي تحتوي على المعلومات الحساسة، ولن يؤدي عدم وجود ذاكرة تخزين مؤقت إلى التغلب على هذا الموقف (ولكن بعد ذلك يمكن دائمًا التقاط لقطة شاشة لتطبيق فلاش أو جافا).

للأكتمال:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1));

تتضمن الإجابة الصحيحة استخدام تعيين رأس HTTP Cache-Control على الاستجابة.إذا كنت تريد التأكد من أنهم أبداً قم بتخزين الإخراج مؤقتًا، يمكنك القيام بالتحكم في ذاكرة التخزين المؤقت:لا ذاكرة التخزين المؤقت.غالبًا ما يستخدم هذا بالتنسيق مع عدم وجود متجر أيضًا.

تتضمن الخيارات الأخرى، إذا كنت تريد تخزينًا مؤقتًا محدودًا، تحديد وقت انتهاء الصلاحية وضرورة إعادة التحقق، ولكن من المحتمل أن تؤدي جميع هذه الخيارات إلى عرض الصفحة المخزنة مؤقتًا مرة أخرى.

يرى http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4

حسنًا، في إحدى الشركات المصرفية البرازيلية الكبرى (Banco do Brasil) المعروفة بامتلاكها أحد أكثر برامج الخدمات المصرفية المنزلية أمانًا وكفاءة في العالم، فإنهم ببساطة يضعون History.go(1) في كل صفحة. لذلك، إذا قمت بالنقر على زر الرجوع، سيتم إرجاعك.بسيط.

يرجى النظر في رؤوس استجابة HTTP.يبدو أن معظم أكواد ASP التي ينشرها الأشخاص تقوم بتعيينها.تأكد.

ال كتاب السنجاب من أورايلي هو الكتاب المقدس لHTTP، و كتاب HTTP لكريس شيفليت جيد أيضًا.

يمكنك إعادة صفحة الويب التي تحتوي على المعلومات الحساسة بتنسيق HTTP POST، وفي معظم الحالات، ستقدم لك المتصفحات رسالة تسألك عما إذا كنت تريد إعادة إرسال البيانات.(لسوء الحظ لا أستطيع العثور على مصدر قانوني لهذا السلوك.)

لقد كان لدي مثال مصرفي في ذهني.

تحتوي صفحة البنك الذي أتعامل معه على هذا:

<meta http-equiv="expires" content="0" />

يجب أن يكون هذا حول هذا على ما أعتقد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top