Вы можете защитить свою форму с помощью ключей формы техника:
- При отображении формы пользователю, генерируйте случайный идентификатор («ключ формы») только для этой единственной отправки формы. Сохраните ключ формы в переменной сеанса. Отправьте «ключ формы» в скрытом поле ввода.
- На стороне отправки проверьте отправленный ключ формы по сравнению с ключом, сохраненным в переменной сеанса. Немедленно аннулируйте это после использования. (удалить его из сеанса)
Без капчи или чего-либо подобного невозможно действительно защитить форму от злоупотребления.
Однако, используя эту технику, злонамеренный спамер должен будет
- запрос формы через HTTP для каждой отдельной отправки формы для получения действительного уникального ключа
- анализ дерева DOM / HTML-кода для получения ключа формы
- отправить в правильном формате
Насколько мне известно, ни один автоматический поисковик контактной формы не делает этого.
Этот метод также защищает вашу форму от нескольких случайных представлений.
Вот пример кода:
<?php
session_start();
if (isset($_POST['form_submit'])) {
// do stuff
if (isset($_POST['formkey']) && isset($_SESSION['formkeys'][$_POST['formkey']])) {
echo "valid, doing stuff now ... "; flush();
// delete formkey from session
unset($_SESSION['formkeys'][$_POST['formkey']]);
// release session early - after committing the session data is read-only
session_write_close();
// do whatever you like with the form data here
send_contact_mail($_POST);
}
else {
echo "request invalid or timed out.";
}
}
else {
// show form with formkey
$formkey = md5("foo".microtime().rand(1,999999));
// put current formkey into list of valid form keys for the user session
if (!is_array($_SESSION['formkeys']) {
$_SESSION['formkeys'] = array();
]
$_SESSION['formkeys'][$formkey] = now();
?>
<html>
<head><title>form key</title></head>
<body>
<form method="POST">
<input type="hidden" name="PHPSESSID" value="<?=session_id()?>">
<input type="text" name="formkey"
value="<?= $formkey ?>">
<input type="submit" name="form_submit" value="Contact us!">
</form>
</body>
</html>
<?php } ?>