När man öppnar sin email och upptäcker att man fått 999st lika dana mail från sitt eget formulär blir man lite half irriterad.
Det är ju visserligen inte så svårt att ta bort dessa mail men onödigt jobb. Header räcker tydligen inte eftesom folk då kan trycka bakåt och skicka samma igen. Kan man istället på något sätt sätta en delay så endast ett formulär kan skickas t.e.x var 5e min, och ja självklart då måste det ju specificera användarna så just respektive användare har sitt delay så inte nästa som försöker skicka och det inte funkar?
Till att börja med bör du skicka iväg folk till en annan sida efter att mailet skickats. Det betyder dels att den som vill skicka dubbelt blir tvungen att gå tillbaka till sidan innan och plita in nästa meddelande för att göra detta, dels att du slipper extra mail bara därför att någon laddar om sidan eller råkar backa till den. Dessutom tar det ju lite tid att gå tillbaka, så det blir ju en implicit fördröjning. Vidareskickningen fixas med
header("mailSent.php");
där mailSent.php med fördel kan skriva ut att mailet skickats iväg. :)
Om du vill lägga in en explicit tidsspärr måste du lagra uppgiften om att mail skickats någonstans. Har du en databas?
Till att börja med bör du skicka iväg folk till en annan sida efter att mailet skickats. Det betyder dels att den som vill skicka dubbelt blir tvungen att gå tillbaka till sidan innan och plita in nästa meddelande för att göra detta, dels att du slipper extra mail bara därför att någon laddar om sidan eller råkar backa till den. Dessutom tar det ju lite tid att gå tillbaka, så det blir ju en implicit fördröjning. Vidareskickningen fixas med
header("mailSent.php");
där mailSent.php med fördel kan skriva ut att mailet skickats iväg. :)
Om du vill lägga in en explicit tidsspärr måste du lagra uppgiften om att mail skickats någonstans. Har du en databas?
Jag kanske skrev det hela lite otydligt men det där du första skrev om med header("mailSent.php"); finns redan det la jag in från första början.
så användaren som sagt kommer till en annan sida där det står att medelandet har levererats.
men biten med explicit tidsspärr låter intressant. tyvärr har jag haft lite problem med databasen den får inte kontakt med den på localhost och hörde att man på surftown inte kan köra annat än localhost men jag vet inte?
men iallafall förklara gärna mer hur man lägger dit den spärren.
... men biten med explicit tidsspärr låter intressant. tyvärr har jag haft lite problem med databasen den får inte kontakt med den på localhost och hörde att man på surftown inte kan köra annat än localhost men jag vet inte?
men iallafall förklara gärna mer hur man lägger dit den spärren.
Compusas förslag att lagra i session fungerar antagligen bättre. Såvida inte spammarna vägrar sessions förståss, för då framstår det som om de inte skickat något tidigare. Med sessioner sätts tex $_SESSION[s_mailTid] = time(); efter att mailet skickats, och innan det skickas så kollas att:
if (!isSet($_SESSION["s_mailTid"]) || $_SESSION["s_mailTid"] + $antalSekISpärr) >= time() ) {
//OK att skicka
}
else echo "Wait, please!";
Fördelen med sessioner är att de tas bort med automatik, nackdelen att den som vägrar att spara sessionscookies kan komma runt tidsfördröjningen. (Eftersom $_SESSION[..] aldrig är satt...)
Annars får du skapa en tabell där du lagrar ipnr och klockslag för mailets skickande. Och sedan kollar mot denna tabell i stället för mot sessioner innan mailet sänds, på motsvarande sätt som ovan.
Hur långt delay skulle det bli om man använder sig av ovanstånde kod du skrev?
Vad man mer kan tänka sig är ju att dem som med avsikt vill spamma inte är helt bakåt flötet och känner säkert till hur man ungår sessions.
det sist nämnda att man gör en tabell som loggar ip tycker jag låter som en stabil lösning. vet du hur man skulle kunna göra det?
nu är jag inte så jättehaj på databashantering så förklara gärna genomgående.
Jag ska nog klara det efter många försökt och åtskilliga svordommar :e
Jag testade den koden som stog på sidan, vilket verkar som en enkel lösning tyvärr så aktiveras delayen från första gången dem går in på sidan vilket istället antagligen uppfattas som irriterande.
Hur långt delay skulle det bli om man använder sig av ovanstånde kod du skrev?
Lika många sekunder som du lagrar i $antalSekISpärr. Alltså, tex
$antalSekISpärr = 60 * x ger x minuters väntan.
Iceyes skrev:
det sist nämnda att man gör en tabell som loggar ip tycker jag låter som en stabil lösning. vet du hur man skulle kunna göra det?
Jag utgår ifrån att inloggning inte krävs för skickande av mail, för i så fall kan du ju hindra åtkomst för spammarna specifikt. Alltså kan gäster skicka mail. För att skilja en gäst från en annan, används då lämpligen ip-nummer.
//Connect till databasen är redan gjort
$tabell = "CREATE TABLE mailare (
IP VARCHAR(15) NOT NULL,
DatumTid DATETIME NOT NULL,
PRIMARY KEY(IP, DatumTid))";
//Om GARANTERAT bara du kan köra skriptet:
$res = mysql_query($tabell) or die("Oväntat Fel! ".mysql_error());
//Annars är mysql_error() "farlig" eftersom info om SQL-frågan kommer ut.
$res = mysql_query($tabell) or die("Oväntat Fel! ");
echo "Tabellen existerar! :-)";
//Använd i mail.php
// Try to get the correct remote IP-address.
// Funktionen stammar från någon på wF
function getRemoteAddress() {
// If HTTP_X_FORWARDED_FOR is set we grab the first address in the list
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
if (preg_match("/[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/",
$_SERVER['HTTP_X_FORWARDED_FOR'], $addresses))
return $addresses[0];
}
// If no address was found in HTTP_X_FORWARDED_FOR, we try HTTP_CLIENT_IP
// and if that isn't set we return REMOTE_ADDR
elseif (isset($_SERVER['HTTP_CLIENT_IP'])) return $_SERVER['HTTP_CLIENT_IP'];
else return $_SERVER['REMOTE_ADDR'];
}
$delay = 60 * 2; //Tvingas vänta 2 min - du kan byta 2:an mot vad du vill.
$sql = "SELECT MAX(DatumTid) FROM mailare WHERE IP = '".getRemoteAddress() ."'";
$res = mysql_query($sql) or die("Tyvärr gick det inte att kontakta databasen. Försök igen senare. "); //UTAN mysql_error!!!
$row = mysql_fetch_array($res);
//$row är false om ip:t saknas i DB:n - dvs, har inte skickat tidigare.
if ($row && ($row["DatumTid"] + $delay) < time()) {
exit("Vänta, vänta... du vill väl inte bli betraktad som spammare va? ")
}
else {
//Visa formulär....
}
//På raden före att mail skickas eller omedelbart efter, vilket som känns bäst:
$sql = "INSERT INTO mailare(IP, DatumTid)
VALUES ('".getRemoteAddress()."', ".time().")"; //(*)
$res = mysql_query($sql) or die("Tyvärr gick det inte att kontakta databasen. Försök igen senare. "); //UTAN mysql_error!!!
//(*) Möjligen borde det stå: (Blev osäker så här på morgonkvisten...)
$sql = "INSERT INTO mailare(IP, DatumTid)
VALUES ('".getRemoteAddress()."', '".time()."')";
Ev. - om spammarna kör med AOL - kan du behöva bortse ifrån den sista byten i IP-numret för att få spärren att funka... :OO Mitt tips är att prova utan detta extra strul, och att lägga till AOL-fix om det inte verkar funka.
589 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e