我正在尝试验证两件事
用于调用脚本将记录插入数据库的表单是由真实用户按下提交按钮执行的,与bot或SQL注入威胁相反。
验证所有字段是否包含数据,以防止输入一行空数据。
我现在的陈述是:
if (!$_POST['submit']) {
die('Error: ' . mysqli_error());
echo "Please complete all form fields!";
echo "<meta http-equiv='Refresh' content='3; URL=../add.php'>";
}
这个if语句假设要同时执行这两个操作,但我不确定这是否是最好的方法,而且我没有看到它正在检查/防止空字段。表单有一个提交按钮,其中包含name="submit"
。
感谢任何想法或建议。
答案 0 :(得分:2)
机器人检测中的一种技术是使用蜜罐字段,例如
<input type="text" name="check" value="" style="display:none;" />
然后检测机器人
if (!empty($_POST['check'])) { /* bot detected! */ }
这个工作得相当好的原因是因为机器人很笨。他们将尝试填写可能与成功提交相关的所有适当字段,以便他们可以避免必填字段的问题。请务必注意,type="text"
代替type="hidden"
,因为大多数机器人都知道隐藏字段不是必填字段验证的一部分。
检查$_POST['submit']
通常无效,因为很多机器人会模仿网页。
答案 1 :(得分:1)
您必须逐个检查每个字段,以确保每个字段都已填满。如果您实际点击提交按钮,则存在$_POST['submit']
条目。
if (!$_POST['name'] || empty($_POST['name'])
|| !$_POST['email'] || empty($_POST['email'])
|| ...) {
echo "Please complete all form fields!";
echo "<meta http-equiv='Refresh' content='3; URL=../add.php'>";
}
有很多方法可以重构和改进这种验证的编写。例如from W3Schools:
<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
// Sanitize every var from SQL injection, XSS and strip spaces...
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
if(empty($name) || empty($email) || empty($website) || empty($comment) || empty($gender)) {
echo "Please complete all form fields!";
echo "<meta http-equiv='Refresh' content='3; URL=../add.php'>";
}
}
function test_input($data)
{
$data = trim($data);
$data = htmlspecialchars(addslashes($data));
return $data;
}
?>
答案 2 :(得分:0)
您也可以检查用户代理,但请记住它们可能是假的。并且该机器人也可以添加正确的Submit
字段!
答案 3 :(得分:0)
你应该这样做:
if(isset($_POST['submit'])) {
foreach($_POST as $val) {
if(trim($val) == '' || empty($val)) {
//empty field, do something
...
header("Location: /add.php?error=empty_fields");
die();
}
}
//all seems to be ok
...
}
要防止SQL注入,请使用PDO,否则您将忘记它。
答案 4 :(得分:0)
第1步:客户端验证
您需要做更多的事情以确保字段不为空。我建议从使用JavaScript的客户端验证开始。有关于此的区域数量的脚本和教程,我建议这两个中的任何一个:
这将有助于确保如果用户提交表单,他们将被强制填写所有表单字段,然后才能将数据发送到服务器。
第2步:服务器端验证
如果您尝试在表单中对表单值进行全面检查,我可以执行以下操作:
$form_fields = array('email','fname','lname');
$isValid = true;
foreach($_POST as $key=>$value){
if(in_array($key,$form_fields)){
if(empty($value) {
$isValid = false;
}
}
}
if(!isValid) {
header("Location: /add.php?error=1");
die();
}
使用这种方法,您可以在脚本顶部定义所关注的所有字段名称,并只运行$_POST
对象以查看是否分配了数据/值。当然,这并不会考虑对通过的数据类型进行任何验证,我建议您考虑这样做,这样您就不会收到不良数据。如果您需要检查格式不正确的数据,则必须单独检查每个表单输入。
第3步:准备好的SQL语句
防止SQL注入的最后一个建议是在将数据插入数据库时使用prepared SQL statements。或者考虑一个为您执行此操作的ORM。为此,我建议:
可选步骤:PHP Nonce
如果您担心有人会通过处理您表单的页面提交垃圾邮件,那么您可以做的一件事就是实现一个随机数。此加密密钥将确保表单只能提交一次,任何其他提交将被拒绝。同样,我不确定您对项目的安全性,但这也是需要考虑的事项。
对于PHP中的nonce来说,这是一个非常好的库:
答案 5 :(得分:0)
这是完整的脚本,抱歉我没有在原帖中发帖:
<?php
//Form fields passed to variables
$manu = mysql_real_escape_string($_POST['inputManu']);
$model = mysql_real_escape_string($_POST['inputModel']);
$desc = mysql_real_escape_string($_POST['inputDesc']);
//Connect to database using $conn
include ('connection.php');
$sql = "INSERT INTO gear (`id`,`manu`,`model`,`desc`)
VALUES (NULL,'$manu','$model','$desc')";
//Check for empty fields
if (!$_POST['submit'])
{
die('Error: ' . mysqli_error());
echo "Please complete all form fields!";
echo "<meta http-equiv='Refresh' content='3; URL=../add.php'>";
}
//Insert record into table
elseif (!mysqli_query($conn,$sql))
{
die('Error: ' . mysqli_error($conn));
}
else
{
//echo "1 record added";
echo "Success, You added the ".$manu." ".$model."";
echo "<meta http-equiv='Refresh' content='3; URL=../index.php'>";
}
mysqli_close($conn);
?>