Как правильно проверить адрес электронной почты в поле ввода html формы?
Для начала я не эксперт, когда дело доходит до PHP. Недавно я внедрил форму электронной почты для нашего сайта, используя PHP. Он имеет три поля ввода Имя, Электронная почта и Сообщение. Все они обязательны для заполнения. В поле ввода Email необходимо ввести адрес электронной почты, в этом поле может быть только один адрес электронной почты, и он должен иметь символ @. Затем только сценарий публикует поля для отправки по электронной почте.
Ниже приведена HTML-форма:
Ниже приведен HTML-код для формы:
<form action="somescript.php" method="POST">
<input type="text" name="name" id="name" placeholder="Name" required>
<input type="email" name="email" id="email" placeholder="Email" required>
<textarea name="message" id="message" placeholder="Message" rows="5" required></textarea>
<br>
<?php
require_once('recaptchalib.php');
$publickey = "LONG STRING";
echo recaptcha_get_html($publickey);
?>
<br>
<ul class="actions">
<li><input name="submit" type="submit" class="button alt" value="Send Message" /></li>
</ul>
</form>
Ниже приведен подлинный скрипт, который отправляет нам электронное письмо.
<?php
session_start();
if(isset($_POST['submit'])) {
// check reCAPTCHA information
require_once('recaptchalib.php');
$privatekey = "LONG STRING";
$resp = recaptcha_check_answer ($privatekey,
$_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
// if CAPTCHA is correctly entered!
if ($resp->is_valid) {
$name = $_POST['name'];
$visitor_email = $_POST['email'];
$message = $_POST['message'];
if (IsInjected($visitor_email)){
$_SESSION['caperror']="Please enter a valid email address.";
header('Location: Contact-Us.php');
} else {
$email_from = 'Website';//<== update the email address
$email_subject = "Website email from $name";
$email_body = "$message";
$to = "some-dude@some-company.com";//<== update the email address
$headers = "From: $email_from \r\n";
$headers .= "Reply-To: $visitor_email \r\n";
//Send the email!
mail($to,$email_subject,$email_body,$headers);
//done. redirect to thank-you page.
header('Location: thank-you.html');
}
} else {
// handle the CAPTCHA being entered incorrectly
$_SESSION['caperror']="You have entered CAPTCHA incorrectly. Try again.";
header('Location: Contact-Us.php');
}
} else {
// handle the form submission error somehow
echo "error; you need to submit the form!";
}
// Function to validate against any email injection attempts
function IsInjected($str)
{
$injections = array('(\n+)',
'(\r+)',
'(\t+)',
'(%0A+)',
'(%0D+)',
'(%08+)',
'(%09+)'
);
$inject = join('|', $injections);
$inject = "/$inject/i";
if(preg_match($inject,$str))
{
return true;
}
else
{
return false;
}
}
?>
Что касается поля электронной почты, у вас может быть только один адрес электронной почты, и он должен иметь символ @. Однако, после просмотра электронного письма, которое я получил сегодня утром от посетителя сайта, я запутался как черт. Адрес электронной почты, который они вводят в форму, добавляется в заголовок "Reply-To" адреса электронной почты. Ниже приведен фактический заголовок Reply-To, который я получил для адреса электронной почты, который я считаю НЕВОЗМОЖНЫМ. Как они этого добились? Я пытаюсь воспроизвести эту ошибку, и я не могу этого сделать.
Итак, как этот посетитель смог это сделать, и у меня возник вопрос: как правильно и правильно проверить адрес электронной почты в поле ввода электронной почты?
3 ответа
В качестве альтернативы вы можете просто использовать HTML5 email
тип ввода:
<input type="email" name="email">
Как говорится в документации Mozilla Developer Network
электронная почта: поле для редактирования адреса электронной почты. Перед отправкой проверяется, что входное значение содержит либо пустую строку, либо один действительный адрес электронной почты. CSS: псевдоклассы : valid и : invalid применяются соответствующим образом.
Есть также официальная документация, но ее может быть немного трудно прочитать.
РЕДАКТИРОВАТЬ
Просто заметил, что вы на самом деле используете email
вход.
Если вам нужно проверить, является ли это действительный адрес электронной почты от PHP, то, на мой взгляд, проще всего будет установить библиотеку, которая сделает это за вас. Я бы предложил использовать библиотеку валидаторов Zend Framework.
Чтобы установить его, запустите следующую команду из корня вашего проекта:
composer require zendframework/zend-validator
После этого просто создайте экземпляр валидатора и передайте ему значение:
use Zend\Validator\EmailAddress;
$validator = new EmailAddress();
$valid = $validator->isValid($yourValue);
Он сделает всю работу за вас, и вы также можете указать дополнительные опции, если вам нужно, как описано здесь.
Вы должны использовать встроенную функцию PHP filter_var
<?php
$email_a = 'joe@example.com';
$email_b = 'bogus';
if (filter_var($email_a, FILTER_VALIDATE_EMAIL)) {
echo "This ($email_a) email address is considered valid.";
}
if (filter_var($email_b, FILTER_VALIDATE_EMAIL)) {
echo "This ($email_b) email address is considered valid.";
}
?>
Вы, кажется, на самом деле не проверяете, является ли отправка действительным адресом электронной почты, вы только проверяете введенный код через isInjected
функция. Таким образом, до тех пор, пока кто-то публикует какую-либо строку, у которой нет этого кода, ваш код предполагает, что это настоящий адрес электронной почты, что, конечно, не соответствует действительности.
Попробуйте также, используя следующий код перед отправкой электронного письма:
if (! filter_var($email, FILTER_VALIDATE_EMAIL)) {
// Handle the invalid e-mail somehow
exit("Invalid e-mail!");
}