PHP: إيقاف نموذج من يجري إعادة تصنيعها بطريق الخطأ عندما يتم الضغط العودة

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

سؤال

ما هي أفضل وسيلة لوقف نموذج من يتم إعادة تصنيعها عندما يقوم المستخدم يضرب الزر الخلف؟

وأنا بعد المشاركة / توجيه / احصل على نمط ، لذلك ليس لدي مشكلة إذا تم دفع F5، ولكن الزر الخلفي لا يزال يوفر الفرصة لإعادة إرسال النموذج. إذا كان هذا النموذج هو صفحة معالجة بطاقات الائتمان، وهذا أمر سيء.

تم طرح هذا السؤال إلى حد ما <لأ href = "https://stackoverflow.com/questions/665399/how-do-i-stop-the-back-and-refresh-buttons-from-resubmitting-my- شكل "> هنا ، ولكن كانت الصياغة والأجوبة من نوعية رديئة وغير محددة لهذه المشكلة بالضبط.

ولدي form.php التي تقدم لنفسها. وإذا كانت هناك أية أخطاء في إدخال البيانات عند تقديم، يتم إعادة توجيه المستخدم إلى form_thanks.php. ضرب الظهر (و "إرسال" أو "إعادة إرسال") مرة واحدة إعادة إرسال form.php (BAD!) وبعد ذلك يجلب لهم العودة إلى form_thanks.php.

يرجى تشمل أيضا الحلول التي لا تنطوي على استخدام الجلسات، إذا أمكن ذلك.

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

المحلول 2

وينبغي أن يتم ذلك مع رمز تستخدم مرة واحدة، أو حالية . وينبغي أن تشمل فب / الخادم هذا الرمز المميز في حقل نموذج مخفي.

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

وإذا لم يكن في القائمة، ثم لا إعادة معالجة النموذج.
إذا كان في القائمة، ثم معالجة شكل وإزالة رمز من القائمة.

ووالرموز يمكن التعامل معها ضمن جلسات أو مجرد جدول قاعدة بيانات بسيطة بدون جلسات. يجب أن تكون الرموز بالمستخدم بالرغم من ذلك.

وهذا هو أيضا الطريقة الموصى بها لتجنب CSRF الهجمات.

نصائح أخرى

وأود أن تفعل ذلك بطريقة مختلفة. طرح المدخلات خفية مع سلسلة عشوائية كقيمة، وعند إرسالها من مخزن أن سلسلة عشوائية في الدورة. إعداد فحص بسيط لمعرفة ما اذا كانت قد نشرت بالفعل وإذا كان لديهم لا تقبل الإدخال.

ومجرد التفكير بصوت عال هنا. ولكن ماذا عن الاختلاف على آخر / توجيه / تحصل فيها الحصول النهائي ليست في الواقع الحصول على النهائي؛) ولكن بدلا من ذلك، فإنه في المقابل دائما تلقائيا إلى الأمام إلى الصفحة الأخيرة حقا، بحيث يجب ضرب المستخدم زر العودة، يعودون حق العودة من حيث أتوا؟

وتحرير:

وطيب، مع الأخذ بعين الاعتبار تعليق OP، وهنا فكرة أخرى. يمكن جعل URL لتقديم النموذج يتطلب معلمة ما هو جيد لاستخدام واحد فقط. سيتم إنشاء هذا المنوال (باستخدام MD5 أو بعض من هذا القبيل) قبل إرسال النموذج ويمكن تخزينها في قاعدة بيانات (ردا على اقتراح شخص آخر لك طلب حل دون استخدام جلسات). بعد معالجة النموذج، ثم يتم وضع علامة هذا المنوال في قاعدة البيانات قد استخدمت بالفعل. حتى عندما كانت الصفحة عاد لمع نفس المنوال، والخطوات التي يمكن اتخاذها لمنع إعادة تقديم بيانات النموذج إلى الخلفية.

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

وكما أنه من السهل لتنفيذ آلية تمنع الزر من إما للضغط مرتين أو يجري "يحبس" إذا حدث شيء أثناء طلب عن طريق دمج في معالج للطلب (سواء كان على مستوى عال مع PrototypeJS أو مسج أو منخفضة مستوى مع وظيفة handrolled الخاص بك) آليات لتمكين وتعطيل الزر عند اكتمال الطلب والحرائق الأولى، على التوالي.

وأجد أن ذلك يعود جلب النموذج إلى الحالة التي كان قبل الصفحة تم إعادة توجيه، إذا كان هذا هو الحال، ولها مدخل مخفي / متغير أو شيء من هذا الذي يبدأ مع قيمة يقولون صحيح، ثم مرة واحدة يتم إرسال النموذج، وإذا كانت القيمة الحقيقية، تغييره إلى false ثم تقدم، وإلا عودة كاذبة

وجرب هذا:

<SCRIPT type="text/javascript">
    window.history.forward();
</SCRIPT>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top