PHP: Geri basıldığında yanlışlıkla yeniden işleniyor bir form Durdur

6 Cevap php

Bir kullanıcı geri düğmesini çarptığında yeniden işleniyor bir form durdurmak için en iyi yolu nedir?

Ben Post/Redirect/Get pattern takip ediyorum, yani F5 itti eğer benim bir sorunum yok, ama geri düğmesi hala formunu yeniden göndermek için fırsat sağlar. Bu formu bir kredi kartı işlem sayfası ise, bu kötü.

Bu soru here biraz istendi, ancak cümleleme ve cevapları tam olarak kalitesiz ve bu soruna özgü değildir vardı.

Ben kendisine teslim form.php var. Ibrazı üzerine veri girişi hiç hata olsaydı, kullanıcı form_thanks.php yönlendirilir. Geri vurmak (ve "Tekrar Gönder" "Gönder" ya da) bir kez form.php (olmasa da) yeniden gönderir ve daha sonra form_thanks.php onları geri getiriyor.

Ayrıca mümkünse, Oturumları kullanarak içermeyen çözümler eklemeyi unutmayın.

6 Cevap

Bu, tek kullanımlık bir belirteç ya da bir nonce ile yapılmalıdır. Php / sunucu gizli form alanına bu belirteci içermelidir.

Tüm yeni belirteçleri ve bir form gönderildiğinde her zaman bir listesini saklamak gerektiğini, bu belirteç son geçerli jeton listesinde olup olmadığını görmek için kontrol etmelisiniz.

If it's not in the list, then don't reprocess the form.
If it is in the list, then process the form and remove the token from the list.

Belirteçleri oturumları olmadan seans içinde ya da sadece basit bir veritabanı tablo ele alınabilir. Belirteçleri olsa kullanıcıya özel olmalıdır.

Bu aynı zamanda CSRF saldırıları önlemek için önerilen bir yoldur.

Ben bunu farklı bir şekilde yapardı. Değer olarak rasgele bir dize ile gizli bir giriş koyun ve mağaza teslim olduğunda bir oturumda rasgele dize söyledi. Onlar zaten gönderdiniz görmek için basit bir kontrol kurmak ve onlar varsa girişini kabul etmiyoruz.

Sadece sesli düşünüyordum. Ama ne yazı üzerine bir varyasyon hakkında / kullanıcı geri tuşuna gerektiğini, böylece son olsun bu, her zaman otomatik olarak ileri gerçekten son sayfasına da, yerine aslında son olsun ;) değil Ama nereden / yönlendirmek, onlar geri Onlar geldi hemen geri nereden?

EDIT:

Tamam, dikkate OP'ın Yorum alarak, burada başka bir fikir. Form gönderme URL tek kullanım için iyi bir parametre gerektirir yapılabilir. Bu belirteç formu sunulmadan önce (MD5 veya bazı tür kullanılarak) oluşturulmuş olacak ve (oturumları kullanmadan bir çözüm talep başkasının önerisine yanıt olarak) bir veritabanında saklanır olabilir. Form işlendikten sonra, bu belirteç, sonra zaten kullanılmış sahip olarak veritabanında bayraklı olacaktır. Sayfa Aynı şekilde birlikte iade edildiğinde, adımlar arka uç form verisinin resubmission önlemek için alınabilecek böylece.

Geç cevap, ama bir AJAX tabanlı çözüm kullanarak tamamen işlenmesini önlemek olabilir; Orada bu işlem düzeni ile bir seferlik de dahil olmak üzere bir sorun olmaz, ama başarı, kullanıcıyı yönlendirir, uyumsuz bir sorgu kullanarak, istekleri, ferahlatıcı geri basmak, ya da düğmesine tıklayarak başka bir şey tarafından tekrarlanan değildir.

Bu kez basılmasını ya da bir şey isteği işleyicisi içine gömerek istek sırasında olduysa ile (PrototypeJS veya jQuery ya da düşük düzeyde olmadığını yüksek düzeyde "kilitli" ediliyor birinden düğmesini engelleyen bir mekanizma uygulamak da kolaydır sizin handrolled fonksiyonu) mekanizmalar etkinleştirmek ve devre dışı bırakmak düğmesine isteği tamamlar ve ilk ne zaman patlar, sırasıyla.

Ben sayfa yönlendirildi önce bu geri öyleydi durumuna formu getirecek bulmak, bu durum ise, gizli bir giriş / değişken veya değer ile başlar şey daha sonra form gönderildiğinde bir kez, ve eğer doğru söylüyor var değer true, return false başka, false olarak değiştirin ve daha sonra göndermek

Bu deneyin:

<SCRIPT type="text/javascript">
    window.history.forward();
</SCRIPT>