2013-08-25 2 views
3

У меня есть следующий код, который отправляет электронные письма.Как защитить форму, которая отправляет электронные письма

Является ли это хорошим/безопасным для производственной среды. то есть он остановит ботов, скручивает скрипты, отправляя спам, используя его, и останавливает электронные инъекции и т. д. и т. д.?

<?php 

    require_once('recaptchalib.php'); 
    $privatekey = "private keys goes here"; 
    $resp = recaptcha_check_answer ($privatekey, 
            $_SERVER["REMOTE_ADDR"], 
            $_POST["recaptcha_challenge_field"], 
            $_POST["recaptcha_response_field"]); 

    if (!$resp->is_valid) { 

     // What happens when the CAPTCHA was entered incorrectly 
     die ("The reCAPTCHA wasn't entered correctly. Go back and try it again. " . 
      "(reCAPTCHA said: " . $resp->error . ")"); 

    } else { 

     require 'class.phpmailer.php'; 

     //Create a new PHPMailer instance 
     $mail = new PHPMailer(); 

     //Set who the message is to be sent from 
     $mail->SetFrom('[email protected]'); 

     //Set who the message is to be sent to 
     $mail->AddAddress($_POST['email']); 

     //Set the subject line 
     $mail->Subject = 'subject goes here'; 

     //Replace the plain text body with one created manually 
     $mail->Body = $_POST['message']; 

     //Send the message, check for errors 
     if(!$mail->Send()) { 

      die ("Mailer Error: " . $mail->ErrorInfo); 

     } else { 

      echo "Message sent!"; 

     } 

    } 

?> 

Поэтому в основном то, что я спрашиваю, это выше код достаточно безопасен, достаточно безопасный, достаточно для производственной среды?

ответ

3

Для тех, кто не знает, какая инъекция заголовка (называемая инъекцией электронной почты OP): Даже если мы предполагаем, что captcha не подлежит проверке, человек может заполнить вашу форму, добавить комментарий к спаму и вставить заголовок BCC с тысячами адресов электронной почты, и ваш сценарий отправит их.

Таким образом, вы не должны допускать никаких новых строк в любом из заголовков (к, теме)

PHPMailer заботится об этом, вот соответствующая часть кода:

$name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim 
if (!$this->ValidateAddress($address)) { 
    $this->SetError($this->Lang('invalid_address').': '. $address); 

Recaptcha является хрупким , и некоторый спам можно отправить. Вы эффективно ограничиваете спам, но если важно не разрешать спам, тогда вам нужен фильтр спама в содержимом электронной почты, так как вы никогда не можете гарантировать, что форма не будет отправлена ​​человеком, который хочет для отправки сообщений о спаме. Или вы можете добавить ограничение на отправку сообщений с заданного IP-адреса в час, чтобы эффективно ограничить количество спам-сообщений, которые могут быть отправлены, даже если трек-трекинг или кто-то заполняет его. И вы можете добавить проверку, чтобы одно и то же содержимое сообщения не могло быть отправлено на более чем X-адреса. Это если это популярный сервер, и очень важно защитить его от отправки спам-сообщений; для общего использования ваш код достаточно хорош.

0

reCaptcha - хороший скрипт для защиты от спама. Для ботов электронной почты проверьте источник своей страницы, чтобы скрыть любые сообщения электронной почты, которые можно читать для ботов, например: Encrypt mailto email addresses with inline JavaScript

+0

ReCaptcha является неэффективным, поскольку это раздражает. Слишком слабый, и боты смогут его разобрать. Слишком сильный, и ваши пользователи не будут. Кроме того, сегодня есть компании, которые легко предлагают ** человеческие решения ** captcha решения. Так что ваши captchas ничего полезного в этом случае –

0

Да, ваш код должен работать, у вас есть captcha, поэтому нет простого способа, чтобы бот или скрипт мог отправлять спам через него, а PHPMailer уже защищен от инъекций заголовков электронной почты, поэтому вы можете быть защищены от злоумышленников, злоупотребляющих вашей формой контакта, чтобы спамить других людей.

Однако ничто не мешает людям вручную заполнять карты и рассылать вам спам, к сожалению, вы не можете сделать это против вас (возможно, ограничивая количество сообщений на каждый IP-адрес в день, чтобы даже ручной спамер мог только для отправки нескольких сообщений в день).

На мой взгляд, лучший способ сделать это - съесть спам и затем фильтровать его с помощью чего-то вроде SpamAssassin, таким образом вы можете удалить капчу (добавьте honeypot fields, чтобы поймать большинство ботов) и улучшить свой пользователь но при этом фильтрует большую часть спама.

+1

reCaptcha был взломан (и исправлен) несколько раз. Например, в 2012 году: http://arstechnica.com/security/2012/05/google-recaptcha-brought-to-its-knees/ – Andy

4

Я не использовал PHP почтовую программу раньше, но он должен позаботиться о безопасности, спасаясь и т.д.
Ваш код выглядит хорошо, однако:

  • Я хотел бы улучшить сценарий, добавив проверку кодирования перед тем отправка - например, как это:

    iconv("UTF-8", "UTF-8//IGNORE", $subject_or_message_or_any_string); 
    
  • также не будет отображать информацию, если почта не удалось отправить вместо того, что я предпочел бы использовать что-то вроде:

    if (!$mail->Send()) 
    { 
        LogErrorMessage("Mailer Error: %s", $mail->ErrorInfo); 
        die ("Sorry, mail could not be sent"); 
    } 
    
  • Далее я пришлю или зарегистрирую IP-адрес пользователя, который отправил форму электронной почты - для случаев, когда он любит спам, вы можете легко его заблокировать.

4

Я хотел бы предложить еще 2 варианта:

I.) Вы можете поместить дополнительный вход TXT полей в вашей отправки формы, , а затем сделать их скрытыми (невидимыми) для пользователя со стилями CSS, Fe

<input type="text" id="commentary" style="display: none;"> 
<!-- OR --> 
<input type="text" id="commentary" style="opacity: 0;"> 
<!-- OR --> 
<input type="text" id="commentary" style="position: absolute; left: -100px; top: -100px;"> 

<!-- 
The trick is, user won't see these forms and WILL NOT FILL THEM. 
And bot will, so you can easily filter them without even using CAPTCHA. 
--> 

II.) Вы можете создать список пользователей (с их IP-адресов, имен, Cookie-идентификаторы, пользователем идентификаторы, если они отправлены по электронной почте, когда было разрешено на месте и т.д.) и предотвратить их от отправки аналогичная электронная почта несколько раз подряд (за короткий промежуток времени). Вы также можете реализовать некоторые правила для фильтрации спам-ботов. F.e., если пользователь пытается отправить слишком часто, тогда он может быть заблокирован. Другой вариант - иметь «белый список» авторизованных пользователей, которые смогут отправлять письма с большей свободой и более широкими ограничениями.

+0

Тактика Great HoneyPot – Frank

0

Если вы все еще чувствуете, что это небезопасно, вы можете добавить к нему дополнительную безопасность.
в форме добавления:

<input name="url" style="display:none"> 

затем после этого изменить код:

else if($_REQUEST['url']){ 

    require 'class.phpmailer.php'; 

    //Create a new PHPMailer instance 
    $mail = new PHPMailer(); 

    //Set who the message is to be sent from 
    $mail->SetFrom('[email protected]'); 

    //Set who the message is to be sent to 
    $mail->AddAddress($_POST['email']); 

    //Set the subject line 
    $mail->Subject = 'subject goes here'; 

    //Replace the plain text body with one created manually 
    $mail->Body = $_POST['message']; 

    //Send the message, check for errors 
    if(!$mail->Send()) { 

     die ("Mailer Error: " . $mail->ErrorInfo); 

    } else { 

     echo "Message sent!"; 

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