webForumDet fria alternativet

Hindra dubbelpostning i php

10 svar · 2 129 visningar · startad av apg29

apg29Medlem sedan nov. 200584 inlägg
#1

Jag har nu suttit i ett bra tag och försökt lösa problemet med dubbelpostning, utan att ha lyckats. Det går att lösa i javascript, men jag vill ha det i php. Hur gör man?

Tack på förhand!

LedelMedlem sedan dec. 2004736 inlägg
#2

Jag vet inte vilket sätt som är bäst egentligen, men jag kan komma på två:

  1. Ha en tidsgräns för hur tätt en användare kan skriva inlägg. Spara tiden för senaste post i en sessionsvariabel och jämför mot denna när en ny post görs. 30 sekunder kan vara en lämplig tid.
  2. Jämför inlägget användaren försöker posta med föregående sparat inlägg. Är de lika är det troligtvis en dubbelpostning.

Kan mycket möjligt finnas fler och bättre sätt...

apg29Medlem sedan nov. 200584 inlägg
#3

Tack för tipsen... Finns det fler sätt?

civilpolisenMedlem sedan dec. 2009872 inlägg
#4

Nu kör jag mest ASP men tekniken är underordnad användningen.

Jag brukar ha formulär på en sida, databashantering på en annan och "tack" på en tredje.

index.asp
confirm.asp
thankyou.asp

Jag har använt detta i över tio år och inte fått en enda dubbelpost eller skickade brev eller vad som helst på den tiden. Så... Jag skulle säga att tekniken som sådan är rätt vattentät mot dubbelposter. Men att tro är att inte veta!!

Om man backar i webbläsaren skulle jag gissa att det går att dubbelposta, men det är samtidigt en medveten manöver, inte av misstag.

Det är olika hur man gör. Detta passar för mig och i alla sammanhang har det passat men det är mycket möjligt att det finns sammanhang där det inte passar, bara det att jag inte har kommit dit ännu!! :-)

apg29Medlem sedan nov. 200584 inlägg
#5

Tack igen, jag ska se om jag kan klura ut det sista tipset...
Kanske finns fler tips?

MickeA.comMedlem sedan feb. 20034 441 inlägg
#6

Vad menar du med dubbelpostning? Är det att det blir två gånger om användaren postar ett inlägg och trycker F5 och laddar om sidan? Det bästa är isf. att spara inlägget och sen köra:

header("Location: sida-för-presentation.php"); 
exit();

Då kommer inlägget inte att postas igen, även om användaren laddar om sidan.

onkelborgMedlem sedan juli 2003555 inlägg
#7

Fast det är inte vattentätt. Servern skulle kunna fått data ifrån klienten, sedan bryts anslutningen. Klienten försöker igen...

apg29Medlem sedan nov. 200584 inlägg
#8

onkelborg skrev:

Fast det är inte vattentätt. Servern skulle kunna fått data ifrån klienten, sedan bryts anslutningen. Klienten försöker igen...

Men jag använder den funktionen, fast jag har det på samma sida dom formuläret, men det funkar inte. Måste det vara i olika sidor/filer?

MarcusMedlem sedan juli 2000449 inlägg
#9

Det behöver inte vara på olika sidor. Det är bara jobbigt och ger i många fel felaktig respons mot personer som kommit till sidan på alternativa sätt. Jag kör alltid formulär, kontroller och "tack" på samma sida.

Rekommenderar Ledels punkt 2.

Innan en post sparas, skapar du en checksumma av alla fälten. Denna checksumma kontrolleras mot databasen/session beroende vad du är bekväm med för metod. Förutom indatafälten bör checksumman skapas baserat på värden som identifierar den unika användaren.

MickeA.comMedlem sedan feb. 20034 441 inlägg
#10

Marcus skrev:

Det behöver inte vara på olika sidor. Det är bara jobbigt och ger i många fel felaktig respons mot personer som kommit till sidan på alternativa sätt. Jag kör alltid formulär, kontroller och "tack" på samma sida.

Rekommenderar Ledels punkt 2.

Innan en post sparas, skapar du en checksumma av alla fälten. Denna checksumma kontrolleras mot databasen/session beroende vad du är bekväm med för metod. Förutom indatafälten bör checksumman skapas baserat på värden som identifierar den unika användaren.

Precis, t.ex. så kan du sätta ihop en checksumma som ser ut såhär:

$checksum = md5($_POST['userid'] . $_POST['subject'] . $_POST['body']);

Resten av koden:

SELECT id
FROM tabell
WHERE MD5(CONCAT(userid, subject, body)) = ' . $checksum . '
apg29Medlem sedan nov. 200584 inlägg
#11

Tack för de intressanta svaren. Ska kolla på det mer i morgon.

130 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)