javascript — предотвращение отправки нескольких форм, переполнение стека

У меня есть форма, что-то вроде:

<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 меняет каждую перезагрузку страницы.

Еще раз спасибо.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector