防止多表单提交,PHP

时间:2015-01-22 03:28:27

标签: javascript php html forms captcha

我有一个表格,如:

<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。这很好用,只允许表单提交完美匹配。重新加载页面将导致新的CAPTCHA。按&#34;返回&#34;按钮还将显示新的验证码。

当用户提交表单时,它通过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');

?>

这一切都按预期工作,我现在对转义字符串感到满意。表单捕获非电子邮件,CAPTCHA每次都有效。但是有些小丑刚刚给我发了 128 SIMULTANEOUS 表格,我想知道这个人是怎么做到的。

每个字段都填写完毕&#34; 9999.9&#34;。当我尝试它时,我会收到名称,电话号码和电子邮件的错误。我甚至无法提交包含该数据的表单。即使我可以,但由于CAPTCHA(PHP),我只能发送一次。

我能看到的唯一一个洞,它就是一个洞(刚试过它),就是直接输入外部脚本的URL。所以,一个坏人可以编写自己的脚本,分配变量(到POST),然后调用我的联系人函数128次。

虽然我正在努力纠正这个错误,但是有没有其他明显的漏洞可供人们用于多个表单提交,同时绕过CAPTCHA(这是PHP)?显然,只需关闭JS即可绕过验证。

如果需要,我可以发布更多代码,但只是假设JS已关闭,只留下PHP CAPTCHA检查 - 这与表单的实际提交无关,并且两者都有更改&#34;返回&# 34;并且&#34;重新加载&#34;操作

提前致谢。

CAPTCHA CODE

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 个答案:

没有答案