PHP表单欺骗代码
我有以下代码,可以防止表单欺骗。令牌用于匹配并确保提交的表单来自该页面PHP表单欺骗代码,php,forms,security,spoofing,Php,Forms,Security,Spoofing,我有以下代码,可以防止表单欺骗。令牌用于匹配并确保提交的表单来自该页面 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>',
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
}
}
添加了一个隐藏字段,该字段与提交后会话开始时创建的令牌相匹配:
<input name="token" id="token" value="<?php echo md5(time()); ?>" type="hidden">
以下是一个您可以尝试的示例,它希望在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>
你也应该考虑在你的哈希中添加一个盐,因为你的方法是有人能够找到脚本运行的时间,他们可以只需要一个散列并欺骗你的令牌。添加盐后,他们还需要知道盐的种类
md5(time()+53498238923);
任何随机数都可以。何时生成$\u会话['token']
?您是否可以在比较旧令牌之前在页面加载时生成新令牌?echo$\u POST['token']
和$\u SESSION['token']
以查看它们的价值。时间太早,而且我没有足够的咖啡来查看它是什么。一定要尝试Siamak建议的调试,我还建议您使用!==(身份而不是平等)。您认为这将如何防止表单欺骗?我仍然可以抓取有效的令牌并发送我想要的任何东西。您在这两个页面上都启动了会话吗?我将尝试这个。谢谢。我收到“表单欺骗错误!”提交后的消息和表单也已提交。也许有什么帮助吗?谢谢。也许你有一个会话问题,你应该检查你的会话是否正常。好的,如果我亲自发送给你的话,请你看一下我的文件。。如果可以的话?谢谢
md5(time()+53498238923);