我正在制作一个表单,我希望只有在提交表单时才能访问提交的PHP页面,从而阻止对我的PHP页面的自定义请求。
这是我的form.html:
<html>
<head>
<title>Name/Surname form</title>
</head>
<body>
<form id="form1" method="POST" action="processData.php">
Name: <input type="text" id="name" name="name"><br>
Surname: <input type="text" id="surname" name="surname"><br>
<input type="submit" value="Submit form">
</form>
</body>
</html>
然后我的processData.php:
<?php
if(!isset($_POST['name'],$_POST['surname'])) die;
include ("config.php");
//connect
$mysqli = new mysqli($dbhost, $dbuser, $dbpassword, $dbname); //variables from config.php
//check connection
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if ($stmt = $mysqli->prepare("INSERT INTO name_surname_table (name, surname) values (?, ?)")) {
//bind
$stmt->bind_param('ss', $name, $surname);
//set
$name=$_POST['name'];
$surname=$_POST['surname'];
//execute
$stmt->execute();
//close
$stmt->close();
}
else {
//error
printf("Prepared Statement Error: %s\n", $mysqli->error);
}
?>
问题是,如果我在上一页中没有提交表单的情况下执行自定义发布请求,则数据会提交给数据库,这意味着自动程序可以在我的数据库中放入任何需要的内容...我可以阻止这个吗?
谢谢!
答案 0 :(得分:4)
您可以通过多种方式阻止机器人自动提交表单:
使用Captcha或一些简单的计算字段(例如What gives 3 + 2 ?
)
使用令牌
使用$_REQUEST变量进行检查
令牌可以像这样完成:
session_start();
//generate a unique string
$token = uniqid(rand(), true);
//Store the token
$_SESSION['token'] = $token;
//Store the token_time
$_SESSION['token_time'] = time();
向表单添加隐藏的输入:
<input type="hidden" name="token" id="token" value="<?php echo $token;?>"/>
而不是在将表单提交到数据库之前:
session_start();
//If token exists
if(isset($_SESSION['token']) && isset($_SESSION['token_time']) && isset($_POST['token']))
{
//If it's the same as the posted one
if($_SESSION['token'] == $_POST['token'])
{
//For example 15 mins ago
$old_time = time() - (15*60);
//If token hasn't expired
if($_SESSION['token_time'] >= $old_time)
{
//Do your queries here
}
}
}
答案 1 :(得分:0)
您可以在表单中包含一个隐藏字段,其中包含一个到期的密码...
生成表单时,可以通过在时间上运行哈希计算代码,或者甚至只选择一个随机数。然后将其存储在会话中并将其插入您发送的表单中。
处理表单提交时,请检查以确保密码与会话中存储的密码相同。
答案 2 :(得分:0)
您应该为表单进行基于令牌的身份验证。
在显示表单的页面中,首先使用随机代码设置会话变量。
//generate this using whatever random code generation method you prefer.
$_SESSION["token"] = "your-random-code";
在您的论坛中有一个隐藏字段,如下所示。
<input type="hidden" name="token" value="<?php echo $_SESSION['token'] ?>">
在提交处理程序php文件中,执行如下所示的检查。
if(isset($_POST['token']) && $_POST['token'] == $_SESSION['token'])
答案 3 :(得分:0)
从根本上说,您无法阻止恶意客户端向您的服务器发送“不正确”的数据。您可以自行检测该情况并正确处理错误情况。
如果只有某些用户能够提交数据,那么显然你需要某种形式的登录系统。然后,您可以信任来自登录用户的任何数据,并拒绝其他所有数据。
如果您只是想知道客户端在上一页上加载了表单,您可以添加一个包含“nonce”的隐藏字段 - 一个随机字符串,其值存储在服务器上的某个位置,例如PHP会话中。如果提交的随机数与预期值不匹配,则拒绝输入。请注意,这确实不保证用户在浏览器中与表单进行交互,只保证他们下载了表单(因为程序仍然可以提取现时并刺激提交表单)