|
|
|
Injektion i PHP funktionen mail()I denna guide lär vi dig om mail() injektion samt hur du skyddar dig mot dennaMail() funktionen är en inbyggd funktion i PHP som tar ett antal parametrar och skickar email(s) med de specificerade inställningarna.Varje mail()-anrop innehåller mottagare, rubrik, headers, samt innehåll, bland annat bestämmer de:
Problemet med mail()Anledningen till att injektion fungerar i funktionen är att headern kan anges multipla gånger d.v.s även om du redan kodat ett fast värde för headern så innebär ändå ett nytt värde att headern utökas.Input elementen i ditt forumlär kan alltså användas till att göra en header injektion, och även ett nytt meddelande. Mail() injektionens användareSå, vem använder sig då av injektion i PHP funktionen mail(), jo, spammers!De skickar ut spam och ibland rentav virus genom ditt formulär och låter på så vis dig utföra arbetet samt ännu värre, ta den juridiska smällen för detta. Om ditt fomulär spammar kommer du garanterat stängas av från din ISP och möjligen möta juridiska problem, spam är olagligt och i deras ögon är det du som är boven! InjektionsexempelHär är ett exempel på hur en injektion kan ske, vi har formuläret som följer:<form method="POST"> Till: exempel@domän.se Från: <input type="text" name="avsandare"> Rubrik : <input type="text" name="rubrik"> Meddelande : <textarea name="meddelande" rows="12" cols="80"></textarea> <input type="submit" name="skicka" value="skicka"> </form> <?php $to = "Mottagar_adressen@exempel.se"; $avsandare = $_POST['avsandare']; mail($to,$_POST['rubrik'],$_POST['meddelande'],"From: $avsandare\n") ?>Detta är hur funktionen vanligast används, och vid första anblicken syns inga fel, $to är ju oberoende av användarens inmatning så vad kan egentligen gå fel? Jo, som nämnts tidigare, headern kan uppdateras och få multipla värden. Skickas en ny To: till headern så gäller då även denna, vårt strikt kodade skript kan alltså fortfarande utsättas för injektion! Såhär enkelt kan en ny To: paramter skickas vid inmatning av fältet "avsändare": avsandare@exempel.se%0ATo:offer@exempel.se För denna guide är ytterligare exempel på injektion överflödiga, denna guide skall inte lära ut injektion, utan hur du skyddar dig. Skydda dig från injektionerRegexp (Regular Expressions) kan användas för att hitta mönster i strängar, med hjälp av dessa skall vi nu hitta injektioner.Mönster som förekommer i injektioner är:
Vi lägger in en eregi() i en if-sats som letar efter våra förbjudna strängar och skickar emailet om inget hittats:
$to="Mottagar_adressen@exempel.se";
$avsandare=$_POST['avsandare'];
if(!(eregi("(Content-Type)|(MIME-Version)|(Content-Disposition)|(\n)|(%0A)|(0x0A)
|(\r)|(0x0D)|(%0D)",$_POST['rubrik'].$_POST['meddelande'].$_POST['avsandare'])))
mail($to,$_POST['rubrik'],$_POST['meddelande'],"From: $avsandare\n");
else echo "Fy på dig! PHP mail() injektionen upptäcktes!";
Observera att detta är ett för hårt regexp för meddelandetexten då det inte tillåter radbyten, men för enkelhetens skull anväder alla input-värderna samma regexp i exemplet. Kom ihåg, tänk på vad dina formulär skall innehålla, avsändare t.ex. som skall vara en email kan ej innehålla t.ex tecknet ':', genom att se till att endast tillåta korrekta värden för dina fält innan mail() anropas kan du se till att maximera din säkerhet. Tillåt aldrig överflödiga tecken som input, dessa kan komma att stå dig dyrt om ditt formulär utsätts för en injektion och din PHP mail() funktion spammar tusentals, kanske miljoner användare! Se fler PHP guider Kommentarer Antal 0 Medelpoäng 0/10Bli medlem för att kunna skriva kommentarer! Logga in om du redan är medlem. |
|
|
|
![[XML]](/images/xml.gif)
Svenska webhosts:
Använd gärna denna länk för att länka till oss: