| 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
|
Skrivet: 2006-10-13 18:47
Ämne: Stoppa spambots utan CAPTCHA (dynamiska name-attribut)
|
|
|
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:
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:
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:
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(100000, 99999) . 'name'), 17: 'email' => md5(microtime() . mt_rand(100000, 99999) . 'email'), 18: 'message' => md5(microtime() . mt_rand(100000, 99999) . '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 |
|
PowaH

Medlem i: 1810 dagar Från: Uppsala
Status: Offline
#422845
|
Skrivet: 2006-10-13 18:51
Ämne:
|
|
|
hmm, går du på piller?
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 |
|
überfuzz
Medlem i: 1642 dagar
Status: Offline
#425908
|
Skrivet: 2006-10-21 14:15
Ämne:
|
|
|
| Klurigt värre! Ska se om jag klarar av att lägga till det i mitt formmail. |
|
|
_________________ Windows macht frei |
| Till toppen på sidan |
|
Webbgurun
Medlem i: 1325 dagar
Status: Offline
#452962
|
Skrivet: 2007-01-20 12:15
Ämne:
|
|
|
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 |
|
Wedge


Medlem i: 2928 dagar Från: Järfälla
Status: Offline
#452974
|
Skrivet: 2007-01-20 13:10
Ämne:
|
|
|
| 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 |
|
Icecube

Medlem i: 2163 dagar Från: Rävlanda
Status: Offline
#453295
|
Skrivet: 2007-01-21 13:21
Ämne:
|
|
|
| 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 |
|
lajja


Medlem i: 1603 dagar Från: "The United Earth"
Status: Offline
#453324
|
Skrivet: 2007-01-21 13:52
Ämne:
|
|
|
Skitsnyggt. ^^
Hur fan lyckas du?! |
|
|
_________________ Jag är lätt världens bästa 13-åring!
min sida - värd 170$
mitt skrivbord |
| Till toppen på sidan |
|
therin

Medlem i: 1648 dagar Från: Uppsala
Status: Offline
#453895
|
Skrivet: 2007-01-23 10:06
Ämne:
|
|
|
| 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 |
|
Wedge


Medlem i: 2928 dagar Från: Järfälla
Status: Offline
#453903
|
Skrivet: 2007-01-23 11:09
Ämne:
|
|
|
| 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 |
|
dr_ll
Medlem i: 3045 dagar
Status: Offline
#458348
|
Skrivet: 2007-02-07 15:44
Ämne:
|
|
|
| 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 |
|
Icecube

Medlem i: 2163 dagar Från: Rävlanda
Status: Offline
#458400
|
Skrivet: 2007-02-07 18:36
Ämne:
|
|
|
| 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 |
|
therin

Medlem i: 1648 dagar Från: Uppsala
Status: Offline
#462047
|
Skrivet: 2007-02-19 12:37
Ämne:
|
|
|
Tänkte dela med mig av funktionsvarianten av detta finfina antispam
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
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.
1: 2: <input id = "phone" name = "<?php echo $_SESSION['fields']['phone']; ?>" type = "text" />
3:
|
|
|
|
_________________ therin.se |
| Till toppen på sidan |
|
FredrikForsberg
Medlem i: 2798 dagar Från: Sundbyberg - Sthlm
Status: Offline
#463134
|
Skrivet: 2007-02-23 12:39
Ämne: objektorienterat
|
|
|
Nice. Då väntar man bara på den objektorienterade php5-komponenten då . PHP är ju för guds skull objektorienterat nu för tiden.
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 |
|
ErikW

Medlem i: 1302 dagar Från: Linköping
Status: Offline
#463157
|
Skrivet: 2007-02-23 14:53
Ämne:
|
|
|
Kommer nog få användning av detta  |
|
|
_________________ Www.superstart.inc.se |
| Till toppen på sidan |
|
therin

Medlem i: 1648 dagar Från: Uppsala
Status: Offline
#463203
|
Skrivet: 2007-02-23 18:21
Ämne: Re: objektorienterat
|
|
|
| FredrikForsberg skrev: |
Nice. Då väntar man bara på den objektorienterade php5-komponenten då . PHP är ju för guds skull objektorienterat nu för tiden.
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 |
|
|