Injektion i PHP funktionen mail()

I denna guide lär vi dig om mail() injektion samt hur du skyddar dig mot denna

Mail() 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:
  • Mottagare
  • Avsändaren
  • Rubriken
  • Typ av innehåll
  • Meddelandetexten
  • Eventuella bifogade filer

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ändare

Så, 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!

Injektionsexempel

Hä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 injektioner

Regexp (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:

  • Content-Type, MIME-Version, Content-Disposition, \n, %0A, 0x0A, \r, 0x0D, %0D
I PHP finns funktionen eregi() som letar efter ett regexp och returnerar true för hittat och false för ej hittat.
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



kommenteraKommentarer    Antal 0    Medelpoäng 0/10

Bli medlem för att kunna skriva kommentarer!
Logga in om du redan är medlem.


Copyright © 2005 webbdesign.info    Cookies    Gratis statistik till hemsida    sitemap Webbdesign sitemap icon
Använd gärna våra RSS feeds:

Artikel Feed
[XML]
Forum Feed
[XML]

Svenska webhosts:
Svenska Webhotell

Använd gärna denna länk för att länka till oss:

Ny översättning:
Swedish affiliate programs

Är du medlem och vill synas här?
Hör av dig i vårt forum