2012-08-14 10 views
8

Czy możesz mi doradzić, w jaki sposób mogę zapobiec blokowaniu email injection w PHP mail() bez utraty oryginalnych danych wiadomości? Na przykład. jeśli muszę zezwolić użytkownikowi na używanie \r\n, To, CC itd., więc nie chcę całkowicie odciągać ich od wiadomości - nadal chcę, aby były dostarczane, ale bez dodawania żadnych dodatkowych nagłówków lub w jakiś sposób umożliwiających wstrzyknięcie poczty.Właściwe zapobieganie wstrzykiwaniu poczty w PHP

Większość porad w Internecie sugeruje całkowite usunięcie tych danych - ale nie chcę tego robić.

Wysyłam wiadomości w formacie tekstowym (bez HTML) za pomocą funkcji PHP mail().

Co byś poradził?

+0

'to:' i 'CC:' są nagłówki - nie można utrzymać funkcjonalność usuwając je. Nie jestem pewien, o co tu pytasz. Podaj próbkę swojego pierwszego pomysłu, a my postaramy się skierować Cię we właściwym kierunku :-). – Matt

+0

Gdzie używasz danych dostarczanych przez użytkownika? Tylko w treści wiadomości? – FtDRbwLXw6

+0

@drrcknlsn Dane dostarczone przez użytkownika znajdują się w treści wiadomości i adresie e-mail odbiorcy. – Atm

Odpowiedz

7

Aby filtrować ważne e-maile do zastosowania w dziedzinie e-mail odbiorcy, spojrzeć na filter_var():

$email = filter_var($_POST['recipient_email'], FILTER_VALIDATE_EMAIL); 

if ($email === FALSE) { 
    echo 'Invalid email'; 
    exit(1); 
} 

To sprawi, że tylko użytkownicy dostarczają liczbie pojedynczej, ważne e-maile, które można następnie przekazać do mail() funkcjonować. O ile mi wiadomo, nie ma sposobu na wstrzyknięcie nagłówków poprzez treść wiadomości przy użyciu funkcji PHP mail(), więc dane nie powinny wymagać specjalnego przetwarzania.

Aktualizacja:

Według the documentation for mail(), kiedy to mówi bezpośrednio do serwera SMTP, trzeba będzie zapobiec kropki w treści wiadomości:

$body = str_replace("\n.", "\n..", $body); 

Aktualizacja # 2:

Podobno możliwe jest również wstrzyknięcie przez ten temat, ale ponieważ nie ma FILTER_VALIDATE_EMAIL_SUBJECT, musisz wykonać filtrowanie siebie:

$subject = str_ireplace(array("\r", "\n", '%0A', '%0D'), '', $_POST['subject']); 
+0

Dziękuję, ale w Internecie mówi, że możliwe jest wstrzykiwanie nagłówków do treści wiadomości za pomocą funkcji mail(). – Atm

+0

Jednak dziękuję za funkcję filter_var. Zamierzam go użyć zamiast zwykłego wyrażenia, którego używam. – Atm

+2

@Atern Uwaga filter_var ma pewne ograniczenia co do tego, na jakie wiadomości e-mail pozwala, dlatego nadal używam wyrażenia regularnego do sprawdzania poprawności poczty e-mail, używam: http://www.dominicsayers.com/isemail – Sammaye

3

Załóżmy, że chcesz umieścić adres e-mail użytkownika w polu nagłówka opcjonalnym tak:

$headers = "From: $visitorEmailAddress"; 

Jednak jeśli

$ visitorEmailAddress

zawiera

"[email protected] \ n \ NBCC: [email protected]"

zrobiłeś sobie mnóstwo spamu, otwierając drzwi do wstrzykiwań mail. To jest bardzo prosty przykład, ale twórczy spamerzy i złośliwi hakerzy mogą przekradać potencjalnie szkodliwe skrypty do wiadomości e-mail, ponieważ poczta e-mail jest wysyłana jako plik w postaci zwykłego tekstu. Nawet załączniki są przekształcane w zwykły tekst i mogą z łatwością wysyłać załączniki, dodając linię treści typu MIME.

Jeśli weryfikacja formularza dla pól Z i/lub DO jest poprawna, należy sprawdzić poprawność formularza dla treści wiadomości e-mail.Pozbyłbym się znaków "- =" i "= -" i uniemożliwiałbym użytkownikom wpisywanie zwykłego kodu HTML za pomocą strip_tags().

0

Użyj wyznaczone biblioteki email mim, jak Mail_Mime:

<?php 
include 'Mail.php'; 
include 'Mail/mime.php' ; 

$mime = new Mail_mime(); 

$mime->setTXTBody("Message goes here"); 
$hdrs = $mime->headers(array(
    'From' => '[email protected]', 
    'Subject' => 'Test mime message' 
)); 
$body = $mime->get(); 

$mail = &Mail::factory('mail'); 
$mail->send('[email protected]', $hdrs, $body); 

?> 
Powiązane problemy