我有一个表格,如:
<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会改变页面的每次重新加载。
再次感谢。