Рейтинг@Mail.ru
 

Шаг 3

Защита от спама.

Спамеры очень часто для рассылки используют плохо написанные формы отправки почты на PHP. Дело в том, что стандарт допускает использование нескольких получателей, которые могут быть перечислены через запятую в заголовке "To", а также использование произвольного количества специальных заголовков с именем "Сс" (копия) и "Bcc" (скрытая копия). Предположим, что в вашей форме есть поле темы, которое без изменений транслируется в заголовок "Subject". Для того, чтобы отправить произвольное сообщение на тысячу адресов, спамеру достаточно в переменную $subject внести примерно такой текст:
Hello
Cc: a@yahoo.com
Cc: b@yahoo.com
..
Cc: zzzz@google.com

Таким образом отправляемое письмо будет дополнено заголовками "Cc", и почтовая программа, обнаружив все эти заголовки в тексте письма, примется рассылать его всем получателям из списка. Аналогичная ситуация и с переменными $headers и $to - любое из них при удачном стечении обстоятельств может быть использовано злоумышленниками в своих интересах.

Бороться можно двумя способами:
1. Фильтровать входящие данные на предмет опасных символов, к примеру заменяя их на пробел.
2. Кодировать всё в Base64
Второй способ предпочтительнее, так как попутно повышает надежность доставки сообщений, если в этих полях потребуется кирилица.
Но к сожалению не все сервера понимают кодированные адреса, по этому мы будем крмбинировать. Тему письма закодируем, поле "от" отфильтруем, а "кому" приведем к корректному виду с помощью регулярного выражения. Но это чуть позже.

Вот сейчас мы напишем свой почтовый класс, где все это и реализуем:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php

class Mailer 


    public 
$to;     
    public 
$subject;    
    public 
$from;
 
# Конструктор. Пока пустой.         
   
function __construct();

# Метод формирования адреса "кому"   
   
function createTo($to
   { 
   
    $this->to $to
   } 
# Метод формирования адреса "от кого"   
   
function createFrom($from
   { 
       
$this->from trim(preg_replace('/[\r\n]+/'' '$from)); 
   }    
# Метод формирования темы письма     
   
function createSubject($subject
   { 
   
    $this->subject '=?utf-8?b?'base64_encode($subject) .'?='
   } 
# Метод формирования заголовков       
   
function createHeader() 
   { 
   
    $header "Content-type: text/plain; charset=\"utf-8\"\r\n"
   
    $header .= "From: "$from ." <"$from ."> \r\n" 
   
    $header .= "MIME-Version: 1.0\r\n"
   
    $header .= "Date: "date('D, d M Y h:i:s O') ."\r\n"
    
   
    $this->headers $header
   } 
# Отправка  
   
function sendMail($message
   { 
      if(
mail($this->to$this->subject$message$this->headers'-f'$this->from )) 
      
    return true
      else 
      
    return false;   
   } 



    $to 'email@mail.ru';     
    $subject 'Табе пакет'
    $from 'email@yandex.ru';     
    $message 'Вот такое вот письмо'

     
    $mail = new Mailer(); 
    $mail -> createTo($to); 
    $mail -> createFrom($from); 
    $mail -> createSubject($subject); 
    $mail -> createHeader(); 
    $mail -> sendMail($message);


Всё, вот теперь можно действительно спать спокойно, злобный спамер не пройдет.