Avatar billede and.vang Nybegynder
26. juni 2006 - 18:25 Der 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:

<?php
function Sendmail($ToName, $ToEmail, $FromName, $FromEmail, $Subject, $Body)
{
$smtp = fsockopen("MINSERVER", 25);

$InputBuffer = fgets($smtp, 1024);

fputs($smtp, "HELO ETDOMÆNE.DK\n");
$InputBuffer = fgets($smtp, 1024);
fputs($smtp, "mail From: $FromEmail\n");
$InputBuffer = fgets($smtp, 1024);
fputs($smtp, "RCPT To: $ToEmail\n");
$InputBuffer = fgets($smtp, 1024);
fputs($smtp, "DATA\n");
$InputBuffer = fgets($smtp, 1024);
fputs($smtp, "From: $FromName <$FromEmail>\n");
fputs($smtp, "To: $ToName <$ToEmail>\n");
fputs($smtp, "Subject: $Subject\n\n");
fputs($smtp, "$Body\r\n.\r\n");
fputs($smtp, "QUIT\n");
$InputBuffer = fgets($smtp, 1024);

fclose($smtp);
}

Sendmail("MITNAVN","MINEMAIL","$navn","$mailadr","$emne","$indhold");
?>

Mvh
Anders
Avatar billede jakobdo Ekspert
26. juni 2006 - 18:59 #1
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.
Avatar billede and.vang Nybegynder
26. juni 2006 - 19:24 #2
Tak for svar

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...? :)
Avatar billede fangel Nybegynder
26. juni 2006 - 21:10 #3
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

From: $navn <en@address.dk> \r\n
Bcc: Offer <uskyldigt@offer.dk> \r\n

Og mailen vil nu blive videresent til hr. Offer også...
--

Derfor skal man ikke tillade \r, \n eller en kombi af disse...

Nåh, det var vidst det for denne gang...

-fangel
Avatar billede jakobdo Ekspert
26. juni 2006 - 21:42 #4
Razor.dk har lavet en god check_email funktion her: http://www.razor.dk/php/funktioner/
Avatar billede and.vang Nybegynder
26. juni 2006 - 22:39 #5
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!
Avatar billede fangel Nybegynder
26. juni 2006 - 22:58 #6
jeg behøver ingen point.. har sku' nok af dem.. ;)

Ud fra den funktion du har vidst burde det ikke være muligt at overskrive "lokale" filer... det hul må ligge et andet sted...

-fangel
Avatar billede and.vang Nybegynder
26. juni 2006 - 23:36 #7
Så må vi se om jakobdo vil ha' dem...

Nej, der har været mange andre huller, men som nævnt er dette kun en del af en større bearbejdning.
Avatar billede jakobdo Ekspert
27. juni 2006 - 07:58 #8
Du får lige et svar her.
Avatar billede jakobdo Ekspert
27. juni 2006 - 07:59 #9
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.
Avatar billede and.vang Nybegynder
27. juni 2006 - 14:25 #10
Ja, som sagt - der har været mange huller som nu er rettet. Mail-problemet var blot en del af det...
Avatar billede jakobdo Ekspert
27. juni 2006 - 18:05 #11
Ok.
Takker for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester