Enkelt sätt att undvika spam från webbformulär

Jag har på ett flertal sajter haft problem med att spam-robotar letar upp ”oskyddade” formulär och fyller i dessa med en massa junk som sedan submittas. En lösning på problemet skulle vara att använda någon slags Captcha som är ett slags turing-test som avgör om användaren är människa eller spam-bot. Men detta känns som lite väl mycket overkill för mina sajter.

En lösning som jag använt mig av är att användaren får en input box där de måste fylla i årets år, ex: 2007, för att få gå vidare. Den lösningen har fungerat bra och innebär inte särskilt mycket kod för mig som utvecklare. Men det innebär ett extra steg för användaren som kan upplevas som jobbig eller onödig. Så jag undersökte om det finns ett alternativ som innebär lite kod samt att användaren slipper mata in ytterligare uppgifter.

Den enkla lösningen är att lägga in en extra textarea-kontroll i formuläret som inte visas för användaren genom CSS. Självklart så kan inte spam-roboten hålla sig ifrån att fylla även denna med junk eftersom dom vanligtvis inte förstår sig på CSS. När formuläret sedan valideras på server-sidan så kontrollerar man om fältet är ifyllt eller inte. Om det är ifyllt så är det en spam-robot på sidan och annars är det en människa. 

I formuläret:

<textarea name=”to_adress” style=”display: none;”></textarea>

I formulär-kontrollen

if($_REQUEST[”to_adress”] == ””)
{
// Människa
} else if($_REQUEST[”to_adress”] != ””)
{
// Robot
}

Detta är en fast-and-dirty lösning och se det som en sådan. Använd Captcha eller något mer avancerat om du vill ha en mer avancerad kontroll. Men till enkla low-profile formulär så funkar detta alldeles ypperligt.

Samma lösning i .NET bör fungera enligt följande:

I formuläret:

<textarea runat=”server” id=”to_adress” name=”to_adress” style=”display: none;”></textarea>

eller

<style type=”text/css”>    .gommig {display: none;}</style>
<textbox Runat=”server” CssClass=”gommig” TextMode=”MultiLine” id=”to_adress2″></textbox>

I formulär-kontrollen;

   // Alt textarea
   if( to_adress.Value == ”” )
   {
    // Människa
   }
   else
   {
    // Robot
   }

 // Alt textbox
   if( to_adress2.Text == ”” )
   {
    // Människa
   }
   else
   {
    // Robot
   }

10 reaktioner till “Enkelt sätt att undvika spam från webbformulär”

  1. Hej
    jag undrar hur den här koden skulle se ut om den var skriven i asp i stället?
    skulle bli jättetacksam om du kunde skriva den också :-)

    mvh Nina Ringbom

  2. nina: I asp.NET så kan du lägga till en runat=”server” på textarea-kontrollen. Validera sedan detta i din code-behind i valfritt språk enligt samma princip som ovan. Det borde inte vara något större problem. Om du använder en multiline asp:textbox så gömmer du textboxen med propertyn CssClass.

  3. Hej igen och tack för det snabba svaret :-)
    Jag är inte så bra på att koda, men har lyckats få ihop min hemsida efter mycket hjälp. Dock blir jag lite förvirrad av den här koden.
    Om det är en människa så skall han göra vadå?
    och om det är en robot så skall han göra vadå? i min förvirrade hjärna så borde det hända nått där det står Robot, fast det är kanske att du menar att där får man själv skriva vad som skall ske?
    Så här har jag skrivit nu (jag anväder vanlig asp)

    ”” Then
    ’ Robot
    %>

    /Nina

  4. Oj – koden kom inte med:
    Gör ett nytt försök:

    If Request.QueryString(”to_adress”) = ”” Then
    ’ Människa
    ElseIf Request.QueryString(”to_adress”)”” Then
    ’ Robot

  5. Ja om det är en robot så behöver du ju inte göra något egentligen så det räcker om du har kvar delen av koden som är till för en människa. Den delen var mest till för att visa att man skulel kunna göra något om det var en robot. För dig blir det då bara:

    If Request.QueryString(”to_adress”) == “” Then
    ‘ Människa

  6. Hej Marcus. Jag försöker hitta vägar till att stoppa spam men inte använda captcha så då är din modell utmärkt men jag behöver lite hjälp med att applicera denna. Först så ändrade jag till ”subject” istället för ”to-adress” vilket inte ska ha någon betydelse kan jag tänka. Sen lade jag scriptet efter

    Var det rätt?

    Men sen är det det där med din kod. Vad jag förstår så identifierar den ifall det är en fysisk person som skrivit inlägget: Vad jag inte förstår är hur denna information sedan används. Är det något ytterligare ställe som jag ska lägga script på som tar hand om själva gallringen?

    Som du märker finns det lite luckor i min kunskap men jag hoppas ändå att du kanske kan hjälpa mig

    mvh Björn

  7. Björn: I det fall som du märker att det är en ”Robot” så ”gör inget”. Är det en människa så fortsätter du med din vanliga kod. Typ if(ROBOT) exit;

Lämna ett svar

E-postadressen publiceras inte. Obligatoriska fält är märkta *

Denna webbplats använder Akismet för att minska skräppost. Lär dig hur din kommentardata bearbetas.