Avskjære spam med PHP

Avskjære spam med PHP

"Spammere", de lumske internett-brukere som liker å fylle våre innbokser, forum, gjestebøker, blogger og kommentarer med sine kommersielle annonser, synes å være overalt. De har funnet ut hvordan man kan misbruke meldingsområder og "Kontakt oss"-skjemaer for å få ut sitt budskap uten å bruke sine egne servere, penger eller båndbredde. Dette gjøres ved å utnytte feil i enkle programmer og nettsteder som finnes på nettet.

Avvskjære spam med PHP

Misbruk av kontaktskjema og websidekommentarer har en fellesnevner: HTML-skjemaer, koblet til ett server-side-program som utfører en enkel funksjon. Spammere ber om at skjemaene ikke gjør noe mer enn sine grunnleggende formål. De har funnet ut hvordan man får et "Kontakt meg" skjema til å sende e-post til mange andre mennesker, og de har utviklet "spam-boter" som skanner internett etter nettsteder med dårlig sikkerhet og fyller så opp kommentarerseksjoner på disse sidene med annonser som for eksempel reseptbelagte legemidler, boliglån eller og online kasinoer. Ved å skrive noen få linjer med kode, og legger til et par triks i sitt program gjør man det vanskeligere å misbruke skjemaet, og sjansen for å få spam reduseres betraktelig.

For å demonstrere hvor lett man kan unngå slike angrep, lager vi her et eksempel på et skjema som
ville vært aktuelt for en blogg, gjestebok, kontaktskjema ol.

Navn: <input type="text" name="name"> <br> 
E-post: <input type="text" name="email"> <br> 
Tittel / Emne: <input type="text" name="subject"> <br> 
URL: <input type="text" name="url"> <br> 
Kommentar: <br> 
<textarea name="comment"> </ textarea> 

Skjemaet gir brukerene muligheten til å legge inn navn, epost, emne, url og en kommentar.

Validere innsendt informasjon

E-postadresse og webadresse, har begge et definert format de er bygget opp på. E-postadresser har et brukernavn og et domenenavn, atskilt med et "@", webadressen må også følge standarden for formatering. Dessuten kan hver av dem beskrives som et 'ord' og de kan ikke inneholde mellomrom. Først vil vi ta inn data, og ta ut bare det første "ordet" foran hvert blanke tegn (mellomrom).

$rawemail = $_REQUEST [ "epost"]; 
$rawurl = $_REQUEST [ "url"]; 
$temp = explode ( "", $rawemail); 
$cleanemail = $temp [0]; 
$temp = explode ( "", $rawurl); 
$cleanurl = $temp [0]; 

Videre må vi få bekreft at e-postadressen er formatert riktig og er en adresse som faktisk finnes på internett, dette kan gjøres ved å sjekke at den har ett punktum og at domenenavnet har en godkjent DNS oppføring.

$temp = eksplodere ("@", $cleanemail); 
if (! checkdnsrr ($temp [1]) | | $temp [1] == "") ( 
$error + = 10; ) 

På dette stadiet kan vi anta at brukeren har tastet inn en gyldig epostadresse. Hvis valideringen ikke skulle gå bra må vi lagre dette i $error variabelen, denne vil bli viktigere senere i koden. Nå kan vi bekrefte at nettadressen er en gyldig webadresse ved hjelp parse_url og checkdnsrr:

$temp = parse_url ($cleanurl); 
if (! checkdnsrr ($temp [ 'host']) | | $temp [ 'host'] == "") ( 
$error + = 10; 
) 

Samme som med e-postadressen vil vi på dette stadiet kunne anta at adressen til den besøkende har angitt er en gyldig URL.

Funksjonen strip_tags i PHP er svært effektiv til å fjerne HTML fra brukerens innlegg. Dersom du ønsker at besøkende skal kunne legge inn bestemte html-koder (fet, kursiv, osv.) kan du legge til denne funksjonen som et unntak, men i dette eksempelet tar vi å fjerner all HTML-kode fra brukerens skjema.

$rawname = $_REQUEST [ "name"]; 
$rawcomment = $_REQUEST [ "kommentar"]; 
$rawsubject = $_REQUEST [ "subject"]; 
$cleanname = strip_tags ($rawname); 
$cleancomment = strip_tags ($rawcomment); 
$cleansubject = strip_tags ($rawsubject); 

Fjerne epost misbruk

Epost spammere opplyser om at de er i stand til å sende millioner av e-poster fra tusenvis av datamaskiner, umerkbart og uten å eie en eneste server. Flertallet av disse påstandene skyldes feil i "kontakt oss"-skjemaer eller andre type skjemaer som gjør det mulig for besøkende på nettstedet ditt å skrive inn uønsket "kode" i skjemaet.

Den beste måten å kapre en epostskjema er å legge til flere headere til epost-melding. Legge til tekst i brødteksten i meldingen vil være ubrukelig, fordi dette blir ignorert av epostbehandlingsprogrammer. E-postadresse, navn og emnelinje er de største utnyttede smutthullene fordi innholdet sendes til epostbehandleren via epost headers.

Ved å bare aksepterer den første epostadressen sendt via skjemaet og bekrefter at den er gyldig vil vi kunne luke vekk en god del ondsinnet bruk. Men emnelinjen og besøkendes navn er litt lettere å lure, fordi de ikke har noe strukturelt format, og de kan derfor inneholde alt av tegn. Endrer man emnefeltet til radioknapper eller en rullgardin-boks, med forhåndsdefinerte verdier, ville man fullstendig eliminere faren for ondsinnet koden i emnefeltet. Verdiene som sendes til serveren bør ikke være den faktiske emnelinjens verdi fordi da kan ondsinnede programmer fortsatt sende usikre data som feltets verdi. Hvis radioknappene eller en rullgardin-boks brukes, skal deres verdier være referansenøkler som er satt opp av server. Hvis ugyldige data blir sendt på emnelinjen, vil $error variabelen økes hensiktsmessig.

Noen bedrifter kan ønske at de besøkende skal ha friheten til å sende inn sine egne emnelinjer, og at de har muligheten til å sende inn navn. Dette kan implementeres så lenge som forsøk på å sende flere epost-headere ikke er mulig.

Ved å opprette et HTML-skjema med <INPUT TYPE=TEXT> koden, kan man fort tro at det er umulig å sende mer enn en tekstlinje. Imidlertid kan en spammer lage sin egen kode, slik at nesten ubegrenset data kan sendes. Nøkkeltegnet som disse spammerne vil bruke er et linjeskift "\ n" fra PHPs synspunkt. Hver header linje i en e-post ender med en "\n", så hvis en spammer skriver inn sitt navn slik: "Frank Hansen\nbcc: ola@online.no", vil meldingen bli tolket som om det blir sendt til " ola@online.no ". Hvis spammeren tvinger inn en eller flere BCC, og deretter plasserer deres annonse i kommentarkroppen, vil alle BCCene og den hardkodede mottaker av kontaktskjemaet motta spammeldingen. På samme måte som vi delte opp e-post og nettadresser ved henholdsvis mellomrom, kan vi med navn og emnelinjer, eliminere all tekst etter første linjeskift:

$temp = eksplodere ( "\ n", $cleanname); 
$cleanname = $temp [0]; 
$temp = eksplodere ( "\ n", $cleansubject); 
$cleansubject = $temp [0]; 

For bedre sikkerhet, bør vi også eliminere eventuelle forsøk på å legge til ytterligere e-postadresser ved å fjerne tegnene "cc:". Dette vil stoppe spammer fra å sende en kopi (cc:) eller en blind kopi ("bcc:") av e-posten. Fordi headeren er generelt uavhengig av store eller små bokstaver, må vi gjøre rede for begge tilfeller:

$cleanname = str_replace ( "cc:", "", $cleanname); 
$cleansubject = str_replace ( "cc:", "", $cleansubject); 
$cleanname = str_replace ( "CC:", "", $cleanname); 
$cleansubject = str_replace ( "CC:", "", $cleansubject); 

Vurdere graden av spamming

Vi har til nå lagret en numerisk verdi som grunnlag for å sjekke lovligheten. Det er mulig at nettstedets besøkende er uheldig å setter inn et mellomrom i epostadressen, eller har glemt å starte nettadressen med "http://", men hvis mange feil er funnet er det rimelig å anta at meldingen er spam. Du har kanskje lagt merke til at de faktiske data som sendes via skjemaet er lagret i variabler indikert med "raw" i deres navn. Formålet med å lagre den opprinnelige informasjon er å sammenligne størrelsen, før og etter vår filtrering. En vanlig bruker, som angi en gyldig epostadresse og nettadresse, og unngår HTML eller epost headere i sin kommentar, skal linjelengden samsvare ganske bra. Hvis uakseptable data hadde vært sendt, vil variabelen "clean" være vesentlig kortere enn den "raw". Verdien til $error skal økes basert på forskjellen mellom de to.

$emaildif = strlen ($rawemail) / strlen ($cleanemail); 
$urldif = strlen ($rawurl) / strlen ($cleanurl); 
$namedif = strlen ($rawname) / strlen ($cleanname); 
$commentdif = strlen ($rawcomment) / strlen ($cleancomment); 
$subjectdif = strlen ($rawsubject) / strlen ($cleansubject); 

Jo større forskjell i lengde, desto større "dif" variabler vil det bli. Denne verdien kan vi nå bruke til å øke feilverdi. Snarere enn å legge til, vil vi multiplisere, slik at forskjeller vil bli forsterket jo større de er. Hvis de ikke har forårsaket en feil til nå og multipliseringen vil resultere i 0, vil vi legge til 10 til gjeldende feilverdien.

$error = ($error + 10) * $emaildif * $urldif * $namedif * $commentdif;

Hvis halvparten av hvert felt hadde blitt fjernet under filtreringen, vil $error begynne å dobles eksponentielt. En perfekt verdi, ville på dette tidspunkt, være 10: gyldig e-post, gyldig nettadresse, og ingen uønsket tekst eller HTML i alle felt. Eventuelle filtrert innhold kan ha en feilverdi fra 10 til flere tusen.

I testingen bør koden bli vurdert for følsomheten sin ved å prøve å legge ut spam kommentarer eller andre uønsket kode for å finne riktig nedre terskelen for avvisning av data. Før eventuelle data blir lagret eller epost blir sendt, bør verdien av $error være under denne terskelen:

if ($error> 25) ( 
spam_error (); 
exit (); 
)
else
( 
commit ($navn, $email, $url, $subject, $comment);
)

Å fange opp en spammer

Mange epost spammere blir oppdaget eller blokkert ved å undersøke epost headere og finne den opprinnelige IP-adressen i meldingen. Det kan være lurt å ta vare på ipadressen til besøkende som legger igjen innlegg på din webside.

$user_ip = $_SERVER['REMOTE_ADDR']

Ved å lagre disse i et eget felt i databasen kan man enkelt lage et svartelistesystem. De som ikke overholder reglene vil bli lagret i en egen svarteliste. Denne listen kan brukes som et filter for å filtrere bort historiske innlegg og eller sperre brukeren ute.

Sammendrag

Interaktiv kommunikasjon er hjørnesteinen i World Wide Web, men spammere har lært å utnytte smutthull i utvikling av nettsteder til å reklamere for sine egne produkter og tjenester. Ved å legge til skjemavalidering, spesielt laget for misbruk eller manipulasjon, kommentarspam, gjestebokspam og epost-spam kan spammen reduseres til et nesten ubetydelig nivå.

Kommentarer

Logg inn eller opprett brukerkonto for å kommentere.

eZ Publish™ copyright © 1999-2010 eZ Systems AS