26. juni 2006 - 18:25Der er
10 kommentarer og 1 løsning
Sikkert email-system vha. PHP
Pga. flere hacker-angreb er jeg nu igang med en større bearbejdning af et websted for at øge sikkerheden. Jeg har i den forbindelse brug for et sikkert system til afsending af emails fra webstedet (fra en formular etc.). Den eksisterende kan ses herunder. Jeg har planer om at validere navn, emne samt e-mailadresse (vha. preg_match og visse parametre), men ved feltet indhold går jeg i stå. Jeg vil nødig afskrive brugeren fra at bruge tegn som ; _ @ . , - ( ) $ og hvad man ellers kunne forestille sig en hacker kunne have gavn af. Derfor går det ikke umiddelbart at validere sig ud af brugen af disse tegn...
Skal jeg finde den gyldne middelvej mellem sikkerhed og brugervenlighed, eller er der en smart løsning? (Færdige systemer der bare virker er også meget velkomne - kan Flash måske være en hjælp?)
Koden i mail.php, som jeg henviser til fra formularen:
Hvorfor bruger du ikke "bare" mail() til at sende med? Der burde du ikke være bange for hvad beskeden indeholder. Det du bør sikre dig, er at emne ikke kan indeholde \r\n eller linie skift generelt. Ligeledes bør du have til-emailen hardcoded, så den ikke kan ændres. Hvis du laver en preg_match på email from, evt. tjekker om det er validt domæne, så er du godt på vej.
Har tidligere oplevet problemer med mail(), hvorfor jeg fandt ovenstående løsning. Men vil bestemt gøre forsøget igen. Til-email'en er hardcoded - her er den blot ændret så uvedkommende ikke ved hvilket websted det drejer sig om.
Men kan det passe at en evt. hacker ikke vil kunne lave tricks med indhold-feltet - det er trods alt en php-variabel der udveksles mellem to sider, og kan man ikke forestille sig man vha. inddragelsen af noget kode i denne, kan sætte et angreb ind mod andre processer?
Med validt domæne mener du vel et domæne der eksisterer, right? Hvordan tjekker jeg egentlig det vha. php...? :)
jeg skal lige lufte lidt "brok" her - feel free to skip, but you might learn something
din Sendmail funktion er lidt af en basard-funktion, og tager ikke højde for standarderne.. linjeskift skal altid skrives som "\r\n", så linjer som:
fputs($smtp, "To: $ToName <$ToEmail>\n"); bør være fputs($smtp, "To: $ToName <$ToEmail>\r\n");
Det er standarden som defineret for mange mange år siden. At det har virket har været fordi du har været heldig at have en tilgivende mail-server... Grunden til at det er \r\n er for at sende instrukserne "carriage return" og "newline" (eller "line feed" (derfor ofte forkortet <CR><NL> eller <CR><LF>). For at kunne huske det så husk tilbage på skrivemaskiner: For at komme ned til en ny linje skal man 2 ting: 1) flytte papiret en linje op 2) flytte "vognen" tilbage til venstre side. Dette svare til "carriage return" (vogn retur") og "new line" (papir-flytning). For at huske på rækkefølgen så tænk lidt på hastigheden.. Man kan godt flytte papiret mens vognen er på vej tilbage, og da vogn-retur tager længst tid er det derfor optimalt at starte med det.. Detfor i denne rækkefølge 1) vogn-retur 2) papir-flytning Eller: \r\n
Desuden bør du faktisk tjekke hvad mail-serveren svare tilbage bare for en sikkerheds skyld, men dette er nu ikke påkrævet...
---
Nu til lidt mere konstruktivt: Det jeg gætter på at problemet har været ("Pga. flere hacker-angreb" er ikke så forklarende) er at du har oplevet at der er blevet sendt spam-mails gennem dit script.
Dette virker via "header-injection", et lille eksempel: -- En mail består af 2 dele, headers og body. Headers kommer først, så 2 linje-skift og så body'en. Hver header er adskildt af et linje-skift.
En mail kan altså ligne: To: Dig <dig@selv.dk> \r\n From: Mig <mig@selv.dk> \r\n Subject: Emne \r\n \r\n Tekst
Hvilket også svare til det du har i dit script...
Hvis du tillader folk at ændret på tekst oppe i headerne (fx fra-email) så kan folk ofte tilsætte ekstre headers. Overvej hvis du har
From: $navn <$email> \r\n
Og $email indeholder "en@addresse.dk>\r\nBcc: Offer <uskyldigt@offer.dk" så vil mailen komme til at indeholder
Din kritik er jo meget konstruktiv så du skal endelig brokke dig! :) Jeg er ikke selv helt klar over omfanget af angrebene, men véd kun at det bl.a. indebar at index-siden blev erstattet med en helt anden af slagsen. Men der kan sagtens have været tale om spam-misbrug - udbyderen har snakket om overbelastede servere som grund til lukning af webstedet, men som sagt ved jeg ikke noget mere specificeret.
Mange tak for gode svar - med de nævnte løsninger skulle systemet være forsvarligt sikret. Post et svar begge to!
Det med at rette forsiden, det kan de ikke gøre via en email funktion. (det kommer selvfølgelig an på hvordan du laver din email funktion) Men for at rette forsiden, skal de have skrive rettigheder til din side, evt. via et dårligt kode script af dig eller et modul du bruger på din side.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.