Förhindra php mail injection

PHP’s mail-funktion (mail) ska man använda med viss försiktighet eftersom spambot’ar relativt enkelt kan utnyttja en inbyggd svaghet/feature/”kalla-det-vad-du-vill”. Det farliga är att många som utvecklar i php inte vet vad som kan hända med svaga osäkrade webbside-formulär som använder denna funktionalitet. Om en spambot hittar och utnyttjar ”svagheten” på dina webbsidor så kan du på ett ögonblick bli en storspammare och får då stå för konsekvenserna då du förr eller senare blir uppsökt av din internetleverantör eller webbhotell.

Vanligtvis har man ”kontakta oss” eller andra sidor där användare får skriva in sitt namn, e-postadress, ämne samt meddelande. Då man sedan skriver koden som ska maila till den som ska ha informationen så kontrollerar man vanligtvis  att e-postadressen är riktig samt att några av fälten inte är tomma. Eventuellt filtrerar man även meddelandet och tar bort html, konstiga tecken eller liknande. Då man processat variablerna så skickar man in dessa i mail-funktionen som skickar ut mail till den/de som ska få det.

Mail-funktionen anropas enligt följande:

bool mail ( string $to, string $subject, string $message [, string $additional_headers [, string $additional_parameters]] )

Exempel på användning:

$to = ”kontakt@person.se”
$subject = $[Ämne från webbformuläret];
$message = $[Meddelande från webbformuläret];
$additional_headers = ”From:”.$[sändaradress från webbformuläret];
mail($to,$subject,$message,$additional_headers);

Eftersom man hårdkodar mottagaradressen så kan man tro att det enbart är den personen som kommer att få mailet. Men så är INTE fallet utan mejlet kan skickas till ett mycket stort antal personer utan din vetskap (om du nu inte läst detta innan) med så kallad mail injection. Detta nämner inte php-manualen utan kodaren måste själv veta hur mail skickas och hur mail är formaterade. Med tanke på att nivån på php-programmerare varierar kraftigt så är det viktigt att man har koll på något sånt här.

Hur fungerar då detta?
Spambot’arna injicerar ytterligare mottagare i parametern för additional_header som kommer från formulärets sändaradress-input ruta. Genom att lägga till fler mottagare genom CC samt BCC i oskyddade formulär så agerar ditt webbformulär som en spam-proxy.

Exempel på mail injection av sändaradress:

sender@anonymous.www%0ACc:recipient@someothersite.xxx %0ABcc:somebloke@grrrr.xxx,someotherbloke@oooops.xxx

Lösning
Använd rigorösa kontroller även på simpla formulär. Kontrollera att det inte går att injicera mail headers. Använd exempelvis en mail-class som har skydd mot denna typ av problem eller något reguljärt uttryck.

Länkar
mailinjection.com – Mailinjection – Mer om problemet
SecurePhp – Email injection – Beskrivning av problemet och lösningar
Hardened PHP – Suhosin patch – Patch som bl.a används av freebsd ports

2 reaktioner till “Förhindra php mail injection”

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.