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

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

0 ответов

Другие вопросы по тегам