qualitum logo
Stoppa spambots utan CAPTCHA (dynamiska name-attribut)

PHPportalen Forum Index » Tips och Trix
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget Gå till sida 1, 2  Nästa
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
Nicklas



Medlem i: 1804 dagar
Från: Fablernas Värld
Status: Offline



#422844
Inlägg Skrivet: 2006-10-13 18:47      Ämne: Stoppa spambots utan CAPTCHA (dynamiska name-attribut) Citera

Tänkte ge ett exempel på hur man kan förstärka sitt spamskydd för att stoppa äckliga spambottar utan att använda sig utav CAPTCHA. Det hela går helt enkelt ut på att man ersätter sina name-attribut med genererade md5() hashar, som genereras och uppdateras vid varje sidladdning. På så sätt försvårar man för spambotten att luska ut vilket fält som är vad.

T.ex, här är ett vanligt formulär:
KOD:
1:
<form method="post" action="">
2:
<table>
3:
<tr>
4:
   <td>Namn:</td>
5:
   <td><input type="text" name="name" /></td>
6:
</tr>
7:
<tr>
8:
   <td>e-post:</td>
9:
   <td><input type="text" name="email" /></td>
10:
</tr>
11:
 
12:
<tr>
13:
   <td>Meddelande:</td>
14:
   <td><textarea name="message"></textarea></td>
15:
</tr>
16:
<tr>
17:
   <td colspan="2"><input type="submit" name="submit" value="Skicka" /></td>
18:
</tr>
19:
</table>
20:
</form>


Inga konstigheter alls, formuläret ovan är enkelt för en spambot att fylla i, spambotten letar helt enkelt upp name-fältet och fyller i ett namn, email och fyller i en epostadress och message för att skicka i sitt spam-meddelande... Inga konstigheter för boten...

men om formuläret ser ut så här:
KOD:
1:
<form method="post" action="">
2:
<table>
3:
<tr>
4:
   <td>Namn:</td>
5:
   <td><input type="text" name="fed953679dc84ccfb75e30f9db65570a" /></td>
6:
</tr>
7:
<tr>
8:
   <td>e-post:</td>
9:
   <td><input type="text" name="5100f32f4083eec068f4d6180255f7f2" /></td>
10:
</tr>
11:
 
12:
<tr>
13:
   <td>Meddelande:</td>
14:
   <td><textarea name="d73b64799b584a2f47ef2bd019bf1351"></textarea></td>
15:
</tr>
16:
<tr>
17:
   <td colspan="2"><input type="submit" name="submit" value="Skicka" /></td>
18:
</tr>
19:
</table>
20:
</form>


Då blir det genast svårare för boten att veta vilket fält som är vad. Som jag sade tidigare, så genereras nya md5() hashar vid varje sidladdning, så name-attributen blir aldrig detsamma. Detta kan också användas tillsamans med CAPTCHA´s som ett komplement, och på så sätt få ett starkare spamskydd.

demo finns här: http://www.nswardh.com/demo/md5_form.php
kolla sedan i källkoden för varje sidladdning...

Till sist, ett litet script för att demonstrera:
PHP:
1:
<?php
2:
session_start();
3:
 
4:
if (isset($_POST['submit'])) {
5:
 
6:
   $name $_POST[$_SESSION['formfield']['name']];
7:
   $email $_POST[$_SESSION['formfield']['email']];
8:
   $message $_POST[$_SESSION['formfield']['message']];
9:
 
10:
   echo "<p>$name<br />$email<br />$message</p>";
11:
 
12:
}
13:
 
14:
// Generera en array med unika värden vid varje updatering av sidan
15:
$_SESSION['formfield'] = array(
16:
                     'name' => md5(microtime() . mt_rand(10000099999) . 'name'),
17:
                     'email' =>  md5(microtime() . mt_rand(10000099999) . 'email'),
18:
                     'message' =>  md5(microtime() . mt_rand(10000099999) . 'message')
19:
                     );
20:
?>
21:
 
22:
<form method="post" action="">
23:
<table>
24:
<tr>
25:
   <td>Namn:</td>
26:
   <td><input type="text" name="<?=$_SESSION['formfield']['name'];?>" /></td>
27:
</tr>
28:
<tr>
29:
   <td>e-post:</td>
30:
   <td><input type="text" name="<?=$_SESSION['formfield']['email'];?>" /></td>
31:
</tr>
32:
<tr>
33:
   <td>Meddelande:</td>
34:
   <td><textarea name="<?=$_SESSION['formfield']['message'];?>"></textarea></td>
35:
</tr>
36:
<tr>
37:
   <td colspan="2"><input type="submit" name="submit" value="Skicka" /></td>
38:
</tr>
39:
</table>
40:
</form>
 

_________________
if ($you != 'hårdrockare') die ('there´s something wrong with $you');
Twittra med mig
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp Besök användarens hemsida
PowaH



Medlem i: 1810 dagar
Från: Uppsala
Status: Offline



#422845
Inlägg Skrivet: 2006-10-13 18:51      Ämne: Citera

hmm, går du på piller? Wink

Du gör ett bra script efter det andra =P Keep it up
 

_________________
Vad är en funktion utan fel? - Dectgap - Du må alltid vila i frid
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp
überfuzz



Medlem i: 1642 dagar

Status: Offline



#425908
Inlägg Skrivet: 2006-10-21 14:15      Ämne: Citera

Klurigt värre! Ska se om jag klarar av att lägga till det i mitt formmail.
 

_________________
Windows macht frei
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp
Webbgurun



Medlem i: 1325 dagar

Status: Offline



#452962
Inlägg Skrivet: 2007-01-20 12:15      Ämne: Citera

Mycket bra skript! En fråga bara...
Hur ska jag göra i php-filen när jag ska ta emot det som skrevs in i fälten och göra en variabel av dom?
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp
Wedge
Administratör



Medlem i: 2928 dagar
Från: Järfälla
Status: Offline



#452974
Inlägg Skrivet: 2007-01-20 13:10      Ämne: Citera

Webbgurun skrev:
Mycket bra skript! En fråga bara...
Hur ska jag göra i php-filen när jag ska ta emot det som skrevs in i fälten och göra en variabel av dom?
På precis samma sätt som det görs i demokoden.
 

_________________
Qualitum Webbhotell | Gomoku.se | PHP6.se
Sensei ni rei!
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp Besök användarens hemsida MSN Messenger
Icecube



Medlem i: 2163 dagar
Från: Rävlanda
Status: Offline



#453295
Inlägg Skrivet: 2007-01-21 13:21      Ämne: Citera

Ett annat bra sätt är att ha ett dolt fält med namnet "name" och inte skicka något om det är ifyllt.
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp
lajja
Inaktiverad



Medlem i: 1603 dagar
Från: "The United Earth"
Status: Offline



#453324
Inlägg Skrivet: 2007-01-21 13:52      Ämne: Citera

Skitsnyggt. ^^

Hur fan lyckas du?!
 

_________________
Jag är lätt världens bästa 13-åring!

min sida - värd 170$ Razz
mitt skrivbord
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp Besök användarens hemsida MSN Messenger
therin



Medlem i: 1648 dagar
Från: Uppsala
Status: Offline



#453895
Inlägg Skrivet: 2007-01-23 10:06      Ämne: Citera

Jag undrar en sak med detta skript...räcker det om jag kör detta knep på bara en del av fälten, t.ex. bara dom fälten som jag kontrollerar på något vis, eller blir det enklare för nån att "knäcka" det då?
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp Besök användarens hemsida
Wedge
Administratör



Medlem i: 2928 dagar
Från: Järfälla
Status: Offline



#453903
Inlägg Skrivet: 2007-01-23 11:09      Ämne: Citera

therin skrev:
Jag undrar en sak med detta skript...räcker det om jag kör detta knep på bara en del av fälten, t.ex. bara dom fälten som jag kontrollerar på något vis, eller blir det enklare för nån att "knäcka" det då?
Meningen med scriptet är ju att förvilla spamboten genom att göra alla fälten anonyma, så om du inte "skyddar" alla namn så ökar naturligtvis risken att boten gissar rätt. I alla fall i teorin. En spambot som inte direkt identifierar sidan som exempelvis ett gästboksformulär kanske inte ens försöker.
 

_________________
Qualitum Webbhotell | Gomoku.se | PHP6.se
Sensei ni rei!
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp Besök användarens hemsida MSN Messenger
dr_ll



Medlem i: 3045 dagar

Status: Offline



#458348
Inlägg Skrivet: 2007-02-07 15:44      Ämne: Citera

Jag skulle vilja testa din lösning Nicklas, men jag skulle vilja sätta javascript koll innan formuläret postas men det verkar ej gå så bra när name är typ still med hfhgh22424jgjgjg då klagar javacript kan man komma runt detta ändå?
 

_________________
~Ett stort tack till Malte, Taurus och md2perpe, utan er hade det inte gått.
Tack för att ni lägger er dyrbara tid för att hjälpa andra!
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp
Icecube



Medlem i: 2163 dagar
Från: Rävlanda
Status: Offline



#458400
Inlägg Skrivet: 2007-02-07 18:36      Ämne: Citera

dr_ll skrev:
Jag skulle vilja testa din lösning Nicklas, men jag skulle vilja sätta javascript koll innan formuläret postas men det verkar ej gå så bra när name är typ still med hfhgh22424jgjgjg då klagar javacript kan man komma runt detta ändå?


Ja, du får hitta på någon enkel kryptering och dekryptering som du kan skriva i både JavaScript och PHP. Sen lägger du in värderna i cookies istället för sessions och så kan du sedan ta ut värdet från kakan med JavaScript ó dekryptera det och genom det sättet tar du reda på vad namnet på formen är och kan nå det med JavaScript, hoppas du förstår.
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp
therin



Medlem i: 1648 dagar
Från: Uppsala
Status: Offline



#462047
Inlägg Skrivet: 2007-02-19 12:37      Ämne: Citera

Tänkte dela med mig av funktionsvarianten av detta finfina antispam

KOD:
1:
 
2:
     function antispamNames($values,$fields)
3:
      {
4:
         foreach($fields AS $field)
5:
         {
6:
            $values[$field] = $values[$_SESSION['fields'][$field]];
7:
         }
8:
         
9:
         foreach($fields AS $field)
10:
         {
11:
            $_SESSION['fields'][$field] = md5(microtime().mt_rand(100000,99999).$field);
12:
         }
13:
                 
14:
                 return $values;
15:
      }
16:
 


Använd på följande vis

KOD:
1:
 
2:
$fields = array("phone","text"); // Namn på fälten
3:
$_POST = antispamNames($_POST,$fields);
4:
 


Annars är det som tidigare i Nicklas script, alltså t.ex.

KOD:
1:
 
2:
<input id = "phone" name = "<?php echo $_SESSION['fields']['phone']; ?>" type = "text" />
3:
 
 

_________________
therin.se
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp Besök användarens hemsida
FredrikForsberg



Medlem i: 2798 dagar
Från: Sundbyberg - Sthlm
Status: Offline



#463134
Inlägg Skrivet: 2007-02-23 12:39      Ämne: objektorienterat Citera

Nice. Då väntar man bara på den objektorienterade php5-komponenten då Smile. PHP är ju för guds skull objektorienterat nu för tiden. Wink

Liten invändan bara; denna hash-generering av formulärsnamn känns lite halvosäker ändå - botarnas "formulärsidentifiering" kommer nog för eller senare att skrivas om så att de helt sonika postar sin spam oavsett vad fälten är döpta till. captcha är fortfarande mer "människoavgörande". cool ide dock, detta med md5-hashningen...
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp Besök användarens hemsida MSN Messenger ICQ-nummer
ErikW



Medlem i: 1302 dagar
Från: Linköping
Status: Offline



#463157
Inlägg Skrivet: 2007-02-23 14:53      Ämne: Citera

Kommer nog få användning av detta Smile
 

_________________
Www.superstart.inc.se
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp Besök användarens hemsida MSN Messenger
therin



Medlem i: 1648 dagar
Från: Uppsala
Status: Offline



#463203
Inlägg Skrivet: 2007-02-23 18:21      Ämne: Re: objektorienterat Citera

FredrikForsberg skrev:
Nice. Då väntar man bara på den objektorienterade php5-komponenten då Smile. PHP är ju för guds skull objektorienterat nu för tiden. Wink

Liten invändan bara; denna hash-generering av formulärsnamn känns lite halvosäker ändå - botarnas "formulärsidentifiering" kommer nog för eller senare att skrivas om så att de helt sonika postar sin spam oavsett vad fälten är döpta till. captcha är fortfarande mer "människoavgörande". cool ide dock, detta med md5-hashningen...


Väldigt enkelt att lägga in den i en klass om man vill köra det OOP. Jag har den själv så, men gjorde om den så att man själv kan välja (det kunde man väll iofs gjort ändå, men ja ja).
 

_________________
therin.se
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp Besök användarens hemsida
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget Gå till sida 1, 2  Nästa
PHPportalen Forum Index » Tips och Trix
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic
qualitum logo