2013-04-17 4 views
9

Mi sento un po 'imbarazzante, perché sto generando un corpo di posta con PHP senza sfuggire alle variabili. In HTML sto usando htmlspecialchars() o funzioni simili, per le righe di comando escapeshellarg(), ma per le e-mail? Per esempio qualcosa di simile:Variabili/escape di variabili nel corpo della posta

<?php 
$usercontent = $_GET['usercontent']; 
mail("[email protected]", "My Subject", "My body with $usercontent included"); 
?> 

Cosa potrebbe un possibile aggressore che fare con uno script come quello di cui sopra e come avrei potuto proteggere da un attacco del genere? O è PHP mail() salvare e perché?

Aggiornamento

Si prega di vedere l'esempio:

  • il corpo è influenzato solo (nessuna intestazione!)
  • Content-Type è text/plain
  • qualche prova al risposta sarebbe carino
  • MTA è un sendmail postfix con "/ usr/sbin/sendmail -t -i"
+0

L'uso più rischioso della funzione di posta elettronica è il 4 ° parametro e, finché non lo utilizzi con contenuti generati dagli utenti, penso che tu sia abbastanza sicuro per utilizzarlo. Ad ogni modo, consiglierei di usare una libreria di terze parti come Swiftmailer http://swiftmailer.org/ – arraintxo

+0

Per i problemi di sicurezza che riguardano il 4 ° parametro, puoi anche dare un'occhiata qui: http://stackoverflow.com/questions/ 4834337/phps-mail-what-are-potential-issues-to-watch-out-for – arraintxo

+0

Grazie per i commenti, sui problemi di sicurezza degli altri parametri, sono ben consapevole, sono solo interessato al corpo come iniettare mail multi-parte o qualcosa del genere. – Trendfischer

risposta

0

Non è protetto contro XSS atack perché se la tua posta contiene HTML qualcuno può iniettarlo nella posta.

Il buon comportamento è verificare e dati validi che si prevede di avere. Se fossi in te, sfuggirei a questa stringa. Non costa nulla e non devi preoccuparti delle conseguenze del non utilizzo.

+0

Sì, questa sarebbe la risposta che mi sarei dato ;-) Ma quale tipo di fuga sarebbe appropriato? – Trendfischer

0

Buona domanda. Non credo che sia necessario sfuggire al testo del corpo, ma so che è possibile aggiungere intestazioni a una posta (come un BCC a migliaia di indirizzi) se si consente all'utente di inserire un indirizzo. Quindi, se si inseriscono delle variabili, verificare definitivamente le nuove righe (\n e \r) per assicurarsi che non vengano aggiunte intestazioni aggiuntive.

+0

Anch'io ho pensato di sfuggire a newline, ma le variabili non sono all'inizio del corpo. Come si dovrebbe aggiungere ulteriori intestazioni con esso. La mia preoccupazione è più nella comprensione del problema, ma grazie per la risposta. – Trendfischer

+0

Quindi penso che tu stia bene senza fuggire personalmente. – Rijk

3

Il corpo del messaggio di posta elettronica di base è testo normale. Se si desidera un tipo diverso come HTML o un messaggio a più parti, è necessario utilizzare l'estensione MIME e specificare il tipo di conseguenza utilizzando Content-Type (ad esempio text/html per HTML o per un messaggio composto da più parti).

Quindi dal punto di vista della sicurezza, non c'è modo di iniettare qualcosa di dannoso (almeno non secondo le specifiche). Anche i caratteri non ASCII devono essere gestiti correttamente nonostante la mancata dichiarazione della codifica dei caratteri utilizzati.

Tuttavia, ci possono ancora essere alcuni difetti nei client di posta elettronica che possono essere sfruttati in questo modo. Ma ne dubito.

+0

Imho, questa è la migliore risposta finora. Content-Type text/html dovrebbe essere chiaro, multipart/... potrebbe essere pericoloso. Anche se, il mio dubbio non è ancora soddisfatto. Che cosa è con un singolo "." in una riga, come "\ r \ n. \ r \ n"? Potrebbe essere pericoloso? – Trendfischer

0

Pensate al corpo dell'email in questo modo: "Destinazione top secret della missione sconosciuta". Potremmo non sapere che tipo di client leggerà il messaggio, ma possiamo supporre che non vogliamo che l'HTML live, fornito dall'utente, senza caratteri di escape, venga visualizzato in esso. Dal momento che molti clienti leggono la posta in HTML, la cosa migliore da fare sarebbe il htmlentities() il corpo della e-mail fornito dall'utente.

Un metodo dalla mia classe escaper.

<?php 
class escaper 
{ 
    public function superHtmlEntities($string) 
    { 
     return htmlentities($string, ENT_QUOTES | ENT_HTML5, 'UTF-8', true); 
    } 
} 
?> 

========================================

Come minimo, prendi in considerazione qualcosa come questo e altro come fai la tua ricerca.

<?php 
$esc = new Escaper(); 

$usercontent = $_GET['usercontent']; 
mail("[email protected]", "My Subject", $esc->superHtmlEntities("My body with $usercontent included")); 
?> 
+0

L'escape di HTML dovrebbe essere il minimo. Concordato. Almeno a content-type 'text/html'. Ma fai attenzione con il set di caratteri e assicurati che la doppia codifica sia ok. Su alcune librerie di convalida, hai già un input codificato. – Trendfischer