Я создаю простую контактную форму для веб-сайта. Он не подключается к базе данных, он просто отправляет электронное письмо. Будет ли этот код мешать спамерам использовать инъекции заголовков? Есть ли какие-либо уязвимости, которых я не вижу?
//create short variable names $name= filter_var($_POST['Name'],FILTER_SANITIZE_STRING); $email= filter_var($_POST['Email'],FILTER_SANITIZE_STRING, FILTER_VALIDATE_EMAIL); $subject= filter_var($_POST['Subject'],FILTER_SANITIZE_STRING); $message= filter_var($_POST['Message'],FILTER_SANITIZE_STRING); //set up some static information $toaddress = 'blah@localhost.com,blahblah@localhost.com'; $mailcontent = "Customer name: ".$name."\n". "Customer email: ".$email."\n". "Subject: ".$subject."\n\n". $message; $fromaddress = "From:" . $email; //invoke mail() function to send mail mail($toaddress, "Website Contact Form",$mailcontent, $fromaddress); ?>
Вставка заголовка зависит от возможности вставки дополнительных строк в переменные заголовка, что делает строку похожей на новый заголовок.
Например, разрешающая предметное значение Testing\nCc: spamrecipient@example.com\n\nSome body text
приведет к заголовку сообщения, содержащему:
Subject: Testing Cc: spamrecipient@example.com Some body text
т.е. злоумышленник не только добавил дополнительных получателей, но и смог предоставить собственный текст тела.
Однако в вашем случае $toaddress
является постоянным, и даже если $toaddress
был предоставлен пользователем, он должен быть правильно дезинфицирован функцией mail()
.
Заголовок заголовка аналогичен константе
Переменная $message
безопасна, поскольку по определению это основной текст и отправляется только после реальных заголовков.
Это оставляет только $fromaddress
, и вы уже используете FILTER_VALIDATE_EMAIL
на том, что должно также отвергать что-либо с новой строкой в нем.
Однако вы должны строго проверить результат этого теста и прервать все это, если результат FALSE
. Поскольку это происходит, если проверка не выполняется, mail()
будет жаловаться на получение пустого адреса From:
но там нет возможности вбрасывания заголовков.
Насколько я могу судить, этот код действительно безопасен.
Кроме того, IMHO, вы не должны отправлять электронные письма с предоставленного пользователем электронного адреса. Это может испортить механизмы защиты от спама, такие как SPF.
Вы должны использовать константу From:
значение, принадлежащее вашему собственному домену. Если вам нравится, вы можете использовать правильно обработанное значение в заголовке Reply-To
чтобы упростить последующий ответ на нужный адрес.
IMHO, ваш код небезопасен, так как вы пропускаете символы \r
и \n
. filter_var()
только убивает их, если FILTER_SANITIZE_STRING
используется вместе с FILTER_FLAG_STRIP_LOW
, который также отфильтровывает любые символы ниже ASCII 32:
$message= filter_var($_POST['Message'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
Кроме того, FILTER_VALIDATE_MAIL
вернет значение true или false, которое вы также не учитываете. Я рекомендую проверить этот отличный источник для filter_var()
, так как основное руководство по PHP очень мало информации.
Обновление: Как отметил Алнитак, с помощью \n\n
в коде это фактически не имеет значения.
Нет, это не санирует ничего.
Было бы очень легко подделать эту почтовую программу.
Я могу добавить что-либо в значение сообщения (которое вы читаете), чтобы манипулировать почтовой программой.