我有以下代码可以防止表单欺骗。令牌用于匹配并确保提交的表单来自该页面。
if (isset($_POST['Submit'])) {
if (!isset($_POST['token']) || $_POST['token'] != $_SESSION['token']) {
// error, form spoofing, return to users' page or do something else
echo '<script>',
'alert("Form spoofing error!! Please Try again later")',
'</script>';
} else {
//Continue with submission
}
}
每次提交表单时都会显示错误,只有在存在安全风险时才需要显示错误。
感谢。
编辑:在页面开头添加以下代码:
$_SESSION['token'] = md5(time());
添加一个隐藏字段,该字段与提交后在会话开始时创建的令牌匹配:
<input name="token" id="token" value="<?php echo md5(time()); ?>" type="hidden">
每次提交表单后都会出现PHP欺骗错误,不允许我提交表单。
答案 0 :(得分:0)
下面是一个你可以尝试的例子,它希望页面在POST请求之前至少加载一次,同时也为了好玩而对标记键进行哈希处理:
<?php
session_start();
if ($_SERVER['REQUEST_METHOD']=='POST') {
if (!isset($_SESSION['token_key']) ||
!isset($_SESSION['token']) ||
!isset($_POST[$_SESSION['token_key']]) ||
$_POST[$_SESSION['token_key']] != $_SESSION['token']) {
echo 'Form spoofing error!';
} else {
//Continue with validation ect
echo 'alls good!';
}
}
//set after any checks on previous values
$_SESSION['token_key'] = sha1(microtime(true));
$_SESSION['token'] = sha1(microtime(true)+1);
?>
<form method="POST" action="">
<input type="hidden" name="<?php echo $_SESSION['token_key'];?>" value="<?php echo $_SESSION['token'];?>" />
<p><input type="text" name="yada" size="20">
<input type="submit" value="Submit" name="B1"></p>
</form>
希望有所帮助
答案 1 :(得分:0)
你还应该考虑在你的哈希中添加一个salt,因为你的方法是有人能够找到脚本运行的时间,他们可以只是对它进行哈希并欺骗你的令牌。添加盐后,他们还需要知道盐。
md5(time()+53498238923);
任何随机数都可以做到这一点。