Предотвратить множественные представления формы, PHP
У меня есть форма, что-то вроде:
<form action="" method="post">
<label class="reg_label" for="name">Name:</label>
<input name="name" type="text" class="text_area" id="name"/>
.... etc...
</form>
Чтобы отправить форму, пользователь также должен сначала заполнить CAPTCHA. Это прекрасно работает, и позволяет отправлять формы только для идеальных совпадений. Перезагрузка страницы приведет к появлению новой капчи. Нажатие кнопки "назад" также отобразит новую капчу.
Когда пользователь отправляет форму, она проверяется с помощью javascript, и что все работает отлично, а затем она отправляется (и отправляется по электронной почте) с помощью отдельного сценария php:
<?php
include('connect_to_mysql.php');
$webMaster = 'my@email.com';
$name = mysqli_real_escape_string($db_conx, $_POST["name"]);
$phone = mysqli_real_escape_string($db_conx, $_POST["phone"]);
$email = mysqli_real_escape_string($db_conx, $_POST["email"]);
$message = mysqli_real_escape_string($db_conx, $_POST["message"]);
$emailSubject = 'Contact Form Submission';
$body = <<<EOD
Name: $name
Email: $email
Phone: $phone
Message:
$message
EOD;
$headers = "From: $email\r\n";
$success = mail($webMaster, $emailSubject, $body, $headers);
header('Location: ../thankyou.html');
?>
Все это работает, как и ожидалось, и сейчас я доволен escape-строками. Форма ловит не электронные письма, и CAPTCHA работает каждый раз. Но какой-то клоун только что прислал мне 128 ОДНОВРЕМЕННЫХ заявок, и мне интересно, как этот человек сделал это.
Каждое поле было заполнено "9999,9". Когда я пытаюсь это сделать, я получаю ошибки по имени, номеру телефона и электронной почте. Я даже не могу отправить форму с этими данными. Даже если бы я мог, я мог бы отправить его только один раз из-за CAPTCHA (PHP).
Единственная дыра, которую я вижу, и это дыра (только что попробовал), это ввести URL внешнего скрипта напрямую. Таким образом, плохой парень может написать свой собственный скрипт, назначить переменные (для POST) и затем вызвать мою функцию контакта 128 раз.
В то время как я работаю над исправлением этой ошибки, есть ли другие очевидные дыры, которые кто-то может использовать для многократного представления форм, например, в обход CAPTCHA (что такое PHP)? Очевидно, просто отключите JS, чтобы обойти проверку.
Я могу опубликовать больше кода, если это необходимо, но просто предположим, что JS выключен, оставив только проверку PHP CAPTCHA, которая не имеет ничего общего с фактическим представлением формы и изменениями в ОБАХ операциях "назад" и "перезагрузка".
Заранее спасибо.
Код капчи
captcha.php
<?php
session_start();
$rand = md5(rand(0,999));
$value = substr($rand, 10, 5);
$_SESSION['cap_key'] = $value;
... do some drawing stuff to make the CAPCHA, which is an IMAGE and cannot be read without some fancy character-recogntion code...
?>
В файле контактной формы (вызывается при отправке формы)
<?php
session_start();
if ($_POST['submit'])
{
if ($_POST['captcha'] == $_SESSION['cap_key']) // Success
{
include('scripts/contact.php');
}else if($cap != 'Eq') // If wrong captcha entered
{
... reload page after sanitizing the inputs...
}
}
?>
Но, как я уже сказал, CAPTCHA меняет каждую перезагрузку страницы.
Еще раз спасибо.