我有一个简单的PHP表单,我希望改进验证,以帮助从机器人提交空表格提交。
我有以下数组,其中包含来自另一页的输入名称。
$expected = array('Project-Inquiry','Name','Company-Name','Phone-Number','Email');
我想验证这些元素实际上是否包含内容,因为它们已经在上一页用JS验证过了。 JS只有在启用时才会很好,所以我想在这里添加额外的验证层,以便在它被禁用时使用。
我尝试了以下内容:
$expected = array_filter($expected);
if (!empty($expected)) {
// Do Something
}
我也尝试了以下内容:
$error = false;
foreach($expected as $field) {
if (empty($_POST[$field])) {
$error = true;
}
}
if ($error) {
// Do Something
}
我似乎不尽如人意。有什么建议吗?
答案 0 :(得分:0)
如果你想打击机器人
创建人类看不到的隐藏输入,机器人会填充它。在做任何事情之前,您需要检查输入。如果输入填充,则表示机器人发送的表格不是人。
在您显示表单时创建一个当前时间的会话,发布时检查时差。如果它小于3秒,那就是机器人。
使用验证码系统。
如果您想验证输入
不要像你在问题上所做的那样进行验证。您应该尝试使用适当的验证方法验证每一个。例如,您应该如何验证电子邮件与名称完全不同。
例如,对电子邮件执行此操作:
$email = (isset($_POST['email']) && is_string($_POST['email']))? trim($_POST['email']) : '';
$email_error = (filter_var($email,FILTER_VALIDATE_EMAIL))? true : false;
名称的是不同的:
$name = (isset($_POST['name']) && is_string($_POST['name']))? trim($_POST['name']) : '';
$name_error = (strlen($name)>20 || strlen($name)<3)? true : false;
您可以为我的示例添加更多过滤器。
答案 1 :(得分:0)
让您的预期数据为数组
$expected = ['name', 'email', 'mobile'];
让表单帖子值为$ _POST
foreach($_POST as $key => $value) {
if (empty($value) && in_array($key, $expected)) {
if ($value=='') {
echo $key. ' is should not be empty'."<br/>";
}
}
}
您可以按预期获得结果
HTML表格
<form action="" method="post">
Name <input type="text" name="name"><br>
email <input type="text" name="email"><br>
mobile<input type="text" name="mobile">
<input type="submit" value="Submit">
</form>
答案 2 :(得分:0)
您是否考虑过使用库进行验证?
我建议你使用https://laravel.com/docs/5.5/validation,这样你就可以验证更复杂的规则,而且非常清楚。