$ _POST Değerlerle olmadığını sayfasını kontrol etmek hash kullanarak yenilendiği

3 Cevap php

Aynı PHP sayfasına bir form gönderme yaparken sayfa yerine yanlışlıkla tekrar teslim tazelemek eğer, bulmak için doğru yöntem nedir?

İşte ben şu anda kullanıyorum buydu:

$tmp = implode('',$_POST);
$myHash = md5($tmp);

if(isset($_SESSION["myHash"]) && $_SESSION["myHash"] == $myHash)
{
    header("Location: index.php");  // page refreshed, send user somewhere else
    die();
}
else
{
    $_SESSION["myHash"] = $myHash;
}

// continue processing...

Bu çözümde yanlış bir şey var mı?

UPDATE: Bu senaryo için bir örnek, bir kayıt tabloya bir satır ekleyerek olacaktır. Sadece bu işlem bir kez yürütme isterim.

3 Cevap

Diyelim ki accidental purposeful yeniler adlı yeniler ayırt edemez nokta ile başlayalım. Yani sadece hiç ferahlatır izin karar, ya da başka bir deyişle benzersiz olmalıdır ve her form sunmasını talep edebilir. Bunu yapmak için en iyi yolu, forma rastgele bir belirteç yerleştirmektir.

<?php
    $token = /* a randomly generated string */;
    $_SESSION['_token'] = $token;
?>
<input type="hidden" name="_token" value="<?php echo $token; ?>" />

Her sonra oturum belirteci geçersiz gönderin. Oturumda belirteç formu ile gönderilen birinden farklıysa, POST atabilirsiniz.

Yorumlarınız Re: Bir öğe başına temelinde bu yapabilirdi. Örneğin, burada SO, açık birkaç soru windows olabilir ve aynı anda birkaç soruları cevaplamak. Sen başına soru bazında belirteci yapabilir, böylece kullanıcı herhangi bir anda birkaç geçerli belirteç olabilir, ancak her soru için sadece bir.

Bu senaryo için bir örnek, bir kayıt tabloya bir satır ekleyerek olacaktır. Sadece bu işlem bir kez yürütme isterim.

Bu durumda muhtemelen gerçek POST hakkında çok endişe olabilir, ama gibi veri tutarlılığı konusunda olmamalı. Sen onun e-posta adresi gibi, her kullanıcı için benzersiz kimlik çeşit olmalıdır. Adresi zaten veritabanında kayıtlı ise, tekrar kullanıcı kayıt yok. Bu kullanıcı (çift göndermek veya tekrar kayıt fiili girişimi) iki kez kayıt çalıştı neden bağımsızdır.

Ben genellikle POST işleyicisi bunu yapmak için ne gerekiyorsa yapacak olan ve daha sonra yeni bir sayfaya kullanıcı yönlendirme tercih

header("Location: new-page.php");

böylece onlar bir şey karışıklık olmadan yenileyebilirsiniz

POST/REDIRECT/GET tasarım deseni ile birlikte belirteçleri kullanarak mevcut en iyi çözüm gibi görünüyor.

  • Tek kullanımlık bir simge ayarlama geri düğmesine basarak ve tekrar formu göndermek için çalışırken kullanıcı önleyecek.
  • Kullanıcı yönlendirme ve girişini görüntülemek için bir görünümünü kullanarak onlar memnun eğer onları yenileme isabet sağlar.