2011-11-09 4 views
20

Certo, quando si usa MySQL si usa mysqli_real_escape_string() e si controlla che il tipo di input ricevuto sia del tipo che si aspetta (stringa, numero, ecc.) E si può essere certi di poterlo usare come input per mysqli_query() abbastanza sicuro ... giusto?Stringa di escape da usare in mail()

Ebbene, le domande sono:

  • Qual è il modo migliore per sfuggire a una stringa che sta per essere utilizzati in mail()?
  • Se il destinatario dell'email sarà l'indirizzo e-mail inserito in un campo di testo, quali sono le cose che dovrei fare attenzione per evitare iniezioni o exploit?

Ho una buona idea di come farlo, ma sto scavando nelle migliori pratiche su questo argomento per sapere se mi manca qualcosa, o se c'è un modo migliore.


EDIT: L'idea di questa domanda è non avere LA risposta, ma per fare un elenco completo di collaborazione di tutte le cose per prendersi cura di quando si fa e-mail con PHP.

+1

Mi vengono in mente gli attacchi XSS e iniezioni di intestazione può essere; quindi sanityze il tuo html (se stai usando quel tipo MIME), e assicurati che nessuno inserisca il codice personalizzato nelle intestazioni della tua posta –

+0

Elimina qualsiasi carattere non stampabile, usa la codifica US-ASCII. Rimuovi anche i caratteri \ r \ n. Converti tabulazioni in spazi. – hakre

+1

Ottima domanda. Vorrei solo non aver esaurito il mio patetico limite di voto per quel giorno. –

risposta

12

L'idea alla base dell'invio di e-mail è che l'attaccante inserisce il line feed (LF) nelle intestazioni delle e-mail e quindi aggiunge tutte le intestazioni che desidera. Spulciare questi feed ti proteggerà da questo attacco. Per informazioni dettagliate, controllare http://www.phpsecure.info/v2/article/MailHeadersInject.en.php

La procedura consigliata è fare affidamento su un codice ben scritto, aggiornato di frequente e ampiamente utilizzato. Per questo suggerirei di usare PEAR_MAIL O Zend_Mail

Se non si desidera caricare quei moduli o è necessario mantenere le cose molto semplici. È possibile estrarre la funzionalità di filtro da questi moduli. Anche se raccomando di usarli e aggiornare frequentemente la libreria in modo che se in futuro verrà visualizzato un nuovo attacco, sarà sufficiente aggiornare la libreria (Pear o Zend) e il gioco è fatto.

Questa è la funzione che sterilizzare le intestazioni in Pera pacchetto Mail:

function _sanitizeHeaders(&$headers) 
{ 
    foreach ($headers as $key => $value) { 
     $headers[$key] = 
      preg_replace('=((<CR>|<LF>|0x0A/%0A|0x0D/%0D|\\n|\\r)\S).*=i', 
         null, $value); 
    } 
} 

Zend_Mail utilizza filtro diverso per la posta elettronica, nome e altri campi:

function _filterEmail($email) 
{ 
    $rule = array("\r" => '', 
        "\n" => '', 
        "\t" => '', 
        '"' => '', 
        ',' => '', 
        '<' => '', 
        '>' => '', 
    ); 

    return strtr($email, $rule); 
} 

function _filterName($name) 
{ 
    $rule = array("\r" => '', 
        "\n" => '', 
        "\t" => '', 
        '"' => "'", 
        '<' => '[', 
        '>' => ']', 
    ); 

    return trim(strtr($name, $rule)); 
} 

function _filterOther($data) 
{ 
    $rule = array("\r" => '', 
        "\n" => '', 
        "\t" => '', 
    ); 

    return strtr($data, $rule); 
} 
+0

Penso che ci sia un altro attacco che consente di aggiungere più messaggi dopo ogni corpo, tuttavia non è ben documentato. [Suhosin] (http://www.hardened-php.net/suhosin/) protegge PHP dall'iniezione di intestazione della posta – hakre

+0

Sembra una libreria molto interessante. è la prima volta che lo vedo.Ma come possiamo assicurarci che non abbia alcun effetto collaterale sul PHP stesso, ho controllato il suo codice sorgente che gioca con gli interni di PHP. Viene utilizzato in alcuni siti Web di grandi dimensioni e affidabili? –

+0

Bene, viene fornito per default con PHP su Debian;) – hakre