2016-02-24 1 views
1

Я хотел бы остановить спам людей, используя специальные символы, используемые для ввода почты в php. Например, \n и \r используются для объединения нескольких заголовков и поэтому также с %0A и %0D. Поэтому я написал регулярное выражение для их соответствия. Но я подозреваю, что мое регулярное выражение не так эффективно ... что-то заставляет меня думать, что я пишу что-то непригодное ... Помогите мне исправить это, пожалуйста.Предотвращение отправки почты в php, перехватывая некоторые символы

Вот простой пример того, что я хотел бы сделать ...

if ((!preg_match('/^[^\s]./', stripslashes($_POST['subject']))) || (preg_match('/(%0A|%0D|\\n+|\\r+|;|mime-version:|content-type:|content-transfer-encoding:|subject:|to:|cc:|bcc:)/i', stripslashes($_POST['subject']))) || !(strpos($_POST['subject'],'\r') === false) || !(strpos($_POST['subject'],'\n') === false)) { 
    exit("Warning: this mail contains illegal characters! This mail will not be sent!"); 
    // obvious validate name too 
    // obvious validate mail too 
    // obvious validate message too 
} else { 
    // if all fields are well validated send mail... 
    $fname = stripslashes($_POST['fname']); 
    $fmail = stripslashes($_POST['fmail']); 
    $subject = stripslashes($_POST['subject']); 
    $message = stripslashes($_POST['message']); 
    mail($mail, $subject, $message, $headers, "-f$fmail") { 
    exit("Your Mail is sent! Thanks!"); 
} 

Для того, чтобы соответствовать \n, \r, %0A и %0D как я должен написать свое регулярное выражение?

И !(strpos($_POST['subject'],'\r') === false) и !(strpos($_POST['subject'],'\n') === false) неплохие?

Спасибо.

Решенный! https://stackoverflow.com/a/35606845/4432311

+0

Взгляните на [это] (http://php.net/manual/en/filter.examples.sanitization.php), о полевой дезинфекции – Asur

+0

Я проверяю почтовый адрес, используя это мое регулярное выражение: 'if (! preg_match ('/^[A-Za-Z0-9] + ([_ \\ .-] [A-Za-Z0-9] +) *'. '@ ([A-Za-Z0-9 ] + ([\ .-] [a-zA-Z0-9] +)) + $/', stripslashes ($ _ POST [' fmail ']))) {'спасибо, мне нужно исправить свое регулярное выражение в моей теме , Меня не интересует 'FILTER_SANITIZE_EMAIL'. – Alessandro

+0

Если 'stripslashes()' означает, что у вас есть магические кавычки, у вас есть ужасно устаревший сервер. У вас, вероятно, есть проблемы, о которых стоит беспокоиться. В любом случае отправкой электронной почты сложно (действительно!), И обычно это не стоит того, чтобы делать это самостоятельно. Просто установите стороннюю библиотеку, например Swift Mailer или PhpMailer. - –

ответ

1

Решенный! Я сделал тест. Результат теста - это успех! Я проверил мое регулярное выражение пытается непосредственно в локальном хосте с разными строками:

<?php 
$test = "the dog \n was \r sleeping on the floor"; 
if (preg_match_all('/(%0A|%0D|\\n+|\\r+|;|mime-version:|content-type:|content-transfer-encoding:|subject:|to:|cc:|bcc:)/i', $test, $tmp)) { 
    echo "I found this character: '"; 
    print_r($tmp[1]); 
    echo "'"; 
} else { 
    echo "I cannot find any string searched"; 
} 
?> 

Результат:

I found this character: 'Array ([0] => [1] =>) ' 

Глядя на источник, я могу видеть \ п и \ г

I found this character: 'Array 
(
    [0] => 

    [1] => 
) 
' 

Я думаю, что регулярное выражение хорошо построено.

Последний тест, который я сделал с:

if !(strpos($_POST['subject'],'\n') === false)) { 

терпит неудачу в одинарные кавычки, в то время как находит \ п двойные кавычки ...

if !(strpos($_POST['subject'],"\n") === false)) { 

Так что я решил мой вопрос ... спасибо.

0

Я не очень тщательно с регулярным выражением, но я могу помочь вам, предоставив альтернативное решение для вашей проблемы.

Вы можете использовать следующий код, чтобы решить вашу цель.

<?php 

function sanitize_strings($raw_string) { 
    return preg_replace("/[^0-9a-zA-Z_\-\\\%]+/", "", $raw_string); 
} 

if($raw_string == sanitize_strings($raw_string)) 
{ 
    echo "No illegal characters found."; 
} 
else 
{ 
    echo "Illegal characters found."; 
} 

?> 

Надеюсь, это сработает для вас. :)

+0

Извините! Это не то, что я ищу. Но спасибо! – Alessandro

+0

hmm .. ok .. gud luck –

Смежные вопросы