Bazen kullanıcı Enter
iki defa basın edebilir ve sonrası iki kez sokulur.
Ile bir yazı varsa zaten kontrol dışında, bu başka önlemek için bir çözüm var mı aynı title
ve content
?
Her post / geri gönderme sadece bir kez işlenir, böylece yazı ile eşsiz bir simge kullanın.
Gönder düğmesini devre dışı bırakma insanlar javascript kapalı, ya da başka garip şeyler yapıyor olabilir çünkü çok iyi bir çözüm değildir. İstemci tarafı doğrulama iyi bir başlangıç, ama her zaman sunucu tarafında hem de taşıma ile yedeklenmesi gerekir.
Bu sorunun birkaç çözümü vardır:
Buna Use Javascript to disable the form's submit button when it is posted. Olumsuz bu KESİNLİKLE kusursuz bir yol olmasıdır. Aslında butonuna tıklayarak olmadan formları göndermek çok kolay, ve bu da JavaScript devre dışı kullanıcılar için işe yaramaz. I would definitely not recommend this method. strong>
Örnek:
<script language="javascript">
<!--
function disableSubmitButton() {
// you may fill in the blanks :)
}
-->
</script>
<form action="foo.php" method="post">
<input type="text" name="bar" />
<input type="submit" value="Save" onclick="disableSubmitButton();">
</form>
Use PHP sessions yazının geçerli zaman damgası (örnek $ _SESSION ['posttimer'] için) bir oturum değişkeni ayarlamak için. Aslında PHP formu işlemeden önce strong>, kontrol ederseniz $ _SESSION ['posttimer '] değişkeni var ve belli bir zaman damgası fark (IE: 2 saniye) kontrol edin. Bu şekilde, kolayca çift gönderimleri filtre edebilirsiniz.
Örnek:
// form.html
<form action="foo.php" method="post">
<input type="text" name="bar" />
<input type="submit" value="Save">
</form>
// foo.php
if (isset($_POST) && !empty($_POST))
{
if (isset($_SESSION['posttimer']))
{
if ( (time() - $_SESSION['posttimer']) <= 2)
{
// less then 2 seconds since last post
}
else
{
// more than 2 seconds since last post
}
}
$_SESSION['posttimer'] = time();
}
Include a unique token on each POST. Bu durumda, siz de dahil ve sonra formda belirteci işlemek istediğiniz belirteci bir oturum değişkeni ayarlamak olacaktır. Form gönderildikten sonra, simgeyi yeniden-üretir. Sunulan belirteci oturumunda belirteci eşleşmiyor zaman, formu re-teslim edilmiş ve geçersiz ilan edilmelidir.
Örnek:
// form.php
<?php
// obviously this can be anything you want, as long as it is unique
$_SESSION['token'] = md5(session_id() . time());
?>
<form action="foo.php" method="post">
<input type="hidden" name="token" value="<?php echo $_SESSION['token'] ?>" />
<input type="text" name="bar" />
<input type="submit" value="Save" />
</form>
// foo.php
if (isset($_SESSION['token']))
{
if (isset($_POST['token']))
{
if ($_POST['token'] != $_SESSION['token'])
{
// double submit
}
}
}
Formu göndermek için benzersiz, tek kullanımlık anahtarı oluşturun.
Bu kullanıcı tarafından istemci devre dışı bırakılmış olabilir, çünkü JavaScript dayanarak kötü bir fikirdir. Göndermek sunucu tarafından alınan anahtar düzeni ile, bu anahtarın teslim kilitlenmiş olabilir. Sen ancak sizin gibi gönderimleri çoğaltmak yanıt verebilir.
Bu yaklaşım, çalışması için, tuşları benzersiz ve tahmin etmek çok zor olmalı. Aksi takdirde bazı formları nedeniyle önemli çarpışmalar kilitlenmiş olabilir. Yani her form gönderme tuşları izlemek ve çarpışmaları önlemek zorunda değilsiniz, tuşları o kullanıcının oturumu ile sona gerekir. Dikkat etmeniz gereken başka bir şey kötü niyetli kullanıcıların anahtarı tahmin etmek mümkün ise, kod kaçırma veya DOS istismar çeşit savunmasız olabilir olduğunu.
Prevent Duplicate Form Submission javascript olmadan bunu yapmanın bir yol gösterir.
Aron Rotteveel en Include a unique token on each POST benim için çalıştı. Bir kullanıcı sayfası (F5) yeniler Ancak, benim form hala gönderir. Ben bir reset ekleyerek bu çözmek başardı:
// reset session token
$_SESSION['token'] = md5( $_POST['token'] . time() );
benim son komut şöyle:
if (isset($_SESSION['token'])) {
if (isset($_POST['token'])) {
if ($_POST['token'] != $_SESSION['token']) {
echo '<h3>Oops! You already submitted this request.</h3>';
} else {
// process form
// reset session token
$_SESSION['token'] = md5( $_POST['token'] . time() );
}
} else {
echo 'post token not set';
$_SESSION['token'] = md5( $somevariable . time() );
}
}
oh! session_start();
önce eklemek unutmayın <!DOCTYPE>
Ben düzensizlikleri bulursanız beni düzeltin lütfen bir PHP çaylağım.