Jazyková verzia

Overenie domény

overiť, či je doména voľná

Hlavné menu

Zneužívanie PHP funkcie mail()

V poslednej dobe sme zaznamenali pokusy o zneužívanie klientských PHP skriptov na rozposielanie nevyžiadanej elektronickej pošty (SPAM, alebo tiež UCE).
Je veľa spôsobov ako poslať anonymnú poštu. Niektoré falšujú identitu odosielateľa a niektoré odosielajú poštu anonymne.
Zneužívané sú väčšinou skripty, ktoré obsahujú HTML formulár napr. kontaktný, mailový. Takéto webové, mailové formuláre sú v prevažnej miere spracovávané PHP skriptom, ktorý využíva PHP funkciu 'mail()' na odosielanie pošty. Ak sú vstupné dáta z webových formulárov programátorsky nedostatočne ošetrované, funkcia umožňuje odosielať emaily obsahujúce hlavičky s IP adresou servera, na ktorom skript beží. Takýto skript potom umožňuje anonymné odosielanie emailov a webová aplikácia sa stáva otvorenou bránou na rozposielanie nevyžiadanej pošty.

Funkcia 'mail()' má tieto parametre: mail([TO], [SUBJECT], [MESSAGE], [EXTRA_HEADERS])
[TO] - adresa príjemcu
[SUBJECT] - predmet správy
[MESSAGE] - telo správy
[EXTRA_HEADERS] - doplňujúce hlavičky

Veľa PHP programátorov pevne do funkcie zakóduje email adresu príjemcu [TO], príp. [SUBJECT] v domnienke, že email je doručovaný práve iba na adresu definovanú v [TO], čo je CHYBA!

Typickým príkladom môže byť súbor 'send.php':
<?php
if ($_POST['send'])
{
    $to = 'webmaster@moja-domena.xx';
    $subject = $_POST['predmet'];
    $message = $_POST['sprava'];
    $from = $_POST['email'];
    $headers = "From: " . $from . "n";
    if (mail($to, $subject, $message, $headers))
    {
        echo "sprava odoslana";
    }
    else
    {
        echo "sprava neodoslana";
    }
}
?>
<form method="POST" action="<?=$_SERVER['PHP_SELF'];?>">
Prijemca: webmaster@moja-domena.xx<br />
E-mail odosielatela: <input type="text" name="email"><br />
Predmet spravy: <input type="text" name="predmet"><br />
Sprava: 
<textarea name="sprava" rows="10" cols="60" lines="20">
</textarea><br />

<input type="submit" name="send" value="Odoslat">
<input type="send" value="true">
</form>

Funkcia 'mail()' v súbore 'send.php' môže 'vyprodukovať' takýto výstup:
To: webmaster@moja-domena.xx
Subject: Ahoj
From: navstevnik@domena.xx

Ahoj,
paci sa mi Vasa stranka.

Zo skriptu 'send.php' je zrejmé, že najzaujímavejší parameter je [FROM], ktorým sa priamo dajú modifikovať, alebo pridať hlavičky mailu.
Takýmito hlavičkami môžu byť napr. 'Cc:', 'Bcc:'.
Ako zo špecifikácie podľa RFC 822 (http://www.faqs.org/rfcs/rfc822.html) vyplýva, hlavičky sú oddeľované 'line feed' <LF> a jeho hexa hodnota 0x0A. Takže mailový formulár môže byť modifikovaný napr. takto:

$_POST['email'] = "anonym@anonymous.xxx%0A0ABcc:skrytyprijemca@domena.xxx";

výstup z 'mail()' funkcie bude vyzerať potom takto:
To: webmaster@moja-domena.xx
Subject: predmet
From: anonym@anonymous.xxx
Bcc: skrytyprijemca@domena.xxx

sprava

Takýmto spôsobom sa úspešne podarí odoslať anonymný email na iné email adresy.
Postup SPAMerov je v praxi ešte omnoho sofistikovanejší. Môžu modifikovať viaceré hlavičky a aj obsah správy.

Ako zamedziť takémuto neoprávnenému, anonymnému rozposielaniu mailov?

Heslo je: "Nikdy nedôveruj vstupným dátam od užívateľov!"

Je nutné dôkladne kontrolovať a ošetrovať vstupné dáta z webových formulárov.
Zásady, ktoré by ste mali dodržovať:
- kontrolovať formát email adresy
- dáta by nemali mať neobmedzenú veľkosť
- ošetriť vstupy, ktoré idú priamo do hlavičiek emailu
napr.:
<?php
$from = $_POST['email'];
if (eregi("(r|n)", $from))
{
    die("nespravny format email adresy!");
}
?>

Ďalšia možnosť je nepoužívať PHP funkciu 'mail()' na odosielanie pošty. Môžete využiť viacero 'open source' projektov nahradzujúcich funkčnosť funkcie 'mail()':
email() - http://poss.sourceforge.net/email/
PEAR mail() - http://pear.php.net/package/Mail
PHPMailer - http://phpmailer.sourceforge.net/
Attachment Mailer class - http://www.finalwebsites.com/snippets.php?id=41

--
EuroNET Slovakia s.r.o.