Я попробовал свои силы в написании PHP-скрипта для связи с нами. Я придумал следующее. Сначала разметка, затем небольшая проверка на стороне клиента, а затем сценарий электронной почты. Мне просто нужно знать, можно ли использовать этот код.
Я фактически дошел до того, что могу зарабатывать деньги на разработке веб-сайтов. Мне просто нужно знать, действительно ли это
HTML
function validateContactForm() {
var valid = true;
$(".info").html("");
$(".input-field").css('border', '#e0dfdf 1px solid');
var userName = $("#userName").val();
var userEmail = $("#userEmail").val();
var subject = $("#subject").val();
var content = $("#content").val();
if (userName == "") {
$("#userName-info").html("Required.");
$("#userName").css('border', '#e66262 1px solid');
valid = false;
}
if (userEmail == "") {
$("#userEmail-info").html("Required.");
$("#userEmail").css('border', '#e66262 1px solid');
valid = false;
}
if (!userEmail.match(/^([w-.]+@([w-]+.)+[w-]{2,4})?$/)) {
$("#userEmail-info").html("Invalid Email Address.");
$("#userEmail").css('border', '#e66262 1px solid');
valid = false;
}
if (subject == "") {
$("#subject-info").html("Required.");
$("#subject").css('border', '#e66262 1px solid');
valid = false;
}
if (content == "") {
$("#userMessage-info").html("Required.");
$("#content").css('border', '#e66262 1px solid');
valid = false;
}
return valid;
}
<form name="frmContact" id="frmContact" method="post" action="" enctype="multipart/form-data" onsubmit="return validateContactForm()">
<div class="input-row">
<label style="padding-top: 20px;">Name</label> <span id="userName-info" class="info"></span><br />
<input type="text" class="input-field" name="userName" id="userName" />
</div>
<div class="input-row">
<label>Email</label> <span id="userEmail-info" class="info"></span><br /> <input type="text" class="input-field" name="userEmail" id="userEmail" />
</div>
<div class="input-row">
<label>Subject</label> <span id="subject-info" class="info"></span><br /> <input type="text" class="input-field" name="subject" id="subject" />
</div>
<div class="input-row">
<label>Message</label> <span id="userMessage-info" class="info"></span><br />
<textarea name="content" id="content" class="input-field" cols="60" rows="6"></textarea>
</div>
<div>
<input type="submit" name="send" class="btn-submit" value="Send" />
<div id="statusMessage">
<?php if (!empty($message)) { ?>
<p class="<?php echo $type; ?>Message">
<?php echo $message; ?>
</p>
<?php } ?>
</div>
</div>
</form>
PHP
<?php if (!empty($_POST['send'])) {
$name = $_POST['userName'];
$email = $_POST['userEmail'];
$subject = $_POST['subject'];
$content = $_POST['content'];
$toEmail="neilmeyermusic@gmail.com";
$mailHeaders="From: " . $name . '<' . $email . ">rn";
if (mail($toEmail, $subject, $content, $mailHeaders)) {
$message="Your contact information is received successfully.";
$type="success";
}
}
require_once "contact-view.php";
?>
1 ответ
Скрипт очень простой, но мне кажется, что он тоже небезопасен. Я видел похожий код, который уязвим для инъекции заголовка, поэтому спамеры могли добавить заголовок BCC и вместо этого спамить других людей через ваш сервер (и в результате ваш IP-адрес попадет в черный список).
Даже опытный класс вроде phpmailer пострадал неприятные ошибки безопасности. Еще одна статья, которая затрагивает этот вопрос: Почему mail () опасен в PHP
Поскольку $ mailHeaders является инъекционным, я могу указать адрес электронной почты, например:
someone@attacker.com@rnBcc: someone@victim.com
и я смогу рассылать спам на адрес something@victim.com с вашей невольной помощью.
Проверка полей формы в Javascript недостаточна, она также должна выполняться на стороне сервера. Javascript полезен для мгновенной проверки на стороне клиента, чтобы избежать обмена данными с сервером, но не может считаться функцией безопасности, поскольку вы не контролируете клиента и не можете ему доверять.
Это только вопрос времени, пока ваша форма не будет проиндексирована спам-ботами, которые начнут обстреливать ваш сервер. Ботов не волнует Javascript. Ваш сценарий их не остановит. Таким образом, в основном все, что вы написали на JS, должно быть реализовано на стороне сервера в PHP. Проверка JS — это хорошо, но необязательно.
Поскольку похоже, что вы используете Bootstrap, вы могли бы воспользоваться Проверка доступные варианты. Затем вы также можете избавиться от встроенного стиля CSS, например: $("#userEmail").css('border', '#e66262 1px solid');
.
Вы также можете использовать required
в обязательных элементах управления HTML. Затем браузер запросит пользователя, если некоторые поля пусты, и не отправит форму. Это небольшая дополнительная плата и ничего не стоит.
Подводя итог, я предлагаю вам немного прочитать об инъекции заголовка и не изобретать велосипед. Для такого рода задач доступен зрелый сторонний код с открытым исходным кодом. Это будет более безопасно, чем ваша домашняя попытка.
Я, кажется, помню, что есть также возможность инъекция нулевого байта но не могу вспомнить детали прямо сейчас.