Bir formda çift gönderme önlemek için bazı yöntemler nelerdir?

2 Cevap php

I want to prevent users from accidentally posting a comment twice. I use the PRG (post redirect get) method, so that I insert the data on another page then redirect the user back to the page which shows the comment. This allows users to refresh as many times as they want. However this doesn't work when the user goes back and clicks submit again or when they click submit 100 times really fast. I don't want 100 of the same comments.

Ben SO üzerinde ilgili sorular baktı ve bir belirteç iyi olduğunu bulundu. Ama bunu kullanırken sorun yaşıyorum.

//makerandomtoken(20) returns a random 20 length char. 

<form  method="post" ... >
<input type="text" id="comments" name="comments" class="commentbox" /><br/>
<input type="hidden" name="_token" value="<?php echo $token=makerandomtoken(20); ?>" />
<input type="submit" value="submit" name="submit"  />
</form>

if (isset($_POST['submit']) && !empty($comments)) 
{
    $comments= mysqli_real_escape_string($dbc,trim($_POST['comments']));

    //how do I make the if-statment to check if the token has been already set once?
    if ( ____________){ 
        //don't insert comment because already clicked submit
    }
    else{
        //insert the comment into the database
    }
}

Yani gizli bir değer olarak belirteç var ama nasıl teslim birden tıklayarak önlemek için kullanırım.

METHODS: someone suggested using sessions. I would set the random token to $_SESSION['_token'] and check if that session token is equal to the $_POST['_token'], but how do I do that? When I tried, it still doesn't check

2 Cevap

Çift gönderimleri önlemek istiyorsanız, "teslim değil" karşı "teslim olan" durumunu saklamak gerekir. Bu bilgileri tutmak için nerede birkaç seçeneğiniz vardır.

  • Database - benzersiz bir autogenerated değerine sahip bir gizli alan ekleyin (kısa rastgele bir dize onu üretmek ve şimdiki zaman ekleyebilirsiniz). Eğer durum bilgisi web konuşma gerekirse - Bu değer aynı zamanda konuşma tanımlamak için kullanılır. Veritabanına bu değeri ekleyin ve benzersiz kılmak. Dezavantajları: veritabanında gereksiz depolama, yorum ekleme üzerinde düşük performans, benzersiz bir dize oluşturmak zorunda.
  • Session - benzer bir madde içinde üretilen bir değer ile aynı gizli alanını ekleyin. Kullanıcı formu gönderdiğinde zaman zaten orada değilse, oturumda değeri kaydedin. Eğer öyleyse, bu bir çifte gönderme var. Dezavantajları: Eğer hala eşsiz belirteç oluşturmak gerekiyor.
  • Browser - (1) tıklandığında bir kez Gönder düğmesini devre dışı bırakmak için bazı javascript ekle. (2) değeri 0 ile başlar ve kullanıcı Gönder düğmesini tıkladığında 1 değiştirildiğinde bir gizli alan var. Kullanıcı tekrar düğmesini tıklarsa, size değer 1 olup olmadığını kontrol edin ve eğer iptal. Avantajları: hayır benzersiz bir dizedir. Dezavantajları: etkin olması javascript gerektirir; Eğer durum bilgisi web konuşmaları uygulamak için yine dize gerektirebilir.

Ben bütün rastgele belirteç şeyi atlayın ve sadece oturumda Yorum (hash) saklamak istiyorum. Bu oturumda depolanan varolan değeri eşleşirse, yorum bırakın. Değilse, bunu geçeyim. Açıkçası sorunlar var:

  • Farklı yerlerde aynı yorum gönderme kullanıcı durur. Bu bir sorun ise, üzerinde yorum var şey Yorumlarınız ve id bir karma saklayın.
  • User "geri" tuşuna basınız ve farklı bir yorum gönderebilirsiniz. Ben bu özelliği (bir önceki yorumun rastgele belirteci eşleşen çünkü yorum bırakarak daha iyi) düşünün. Otomatik olarak bir açıklama-düzenleme olarak yorumlamaktadır kolay değildir.
  • Bir kullanıcı presler alternatif sekmelerde "Gönder" eğer çalışmaz. (Ben bu olası düşünün, ve birden fazla rasgele belirteçleri depolama gerektirmez.)

Zaten XSRF önlemek için rasgele bir belirteci isteyebilirsiniz, ama bu başka bir konudur (ve bu durumda, rasgele simge "ne olmalıdır" gibi aynı olduğundan emin olmak istiyorum, ben uzun ömürlü birini saklamak istiyorum oturumda).

Ayrıca, hazırlanmış deyimleri kullanmayı düşünün.