php使用令牌Token防止表单重复提交原理在于生成一个随机字符串放在session里,提交表单后来验证这个字符串,可以做到防止他人自己写form来欺骗提交,重复提交或者双击提交。
<?php
/*
* PHP使用token防止表单重复提交
* 此处理方法纯粹是为了给初学者参考
*/
session_start();
function set_token() {
$_SESSION[\'token\'] = md5(microtime(true));
}
function valid_token() {
$return = $_REQUEST[\'token\'] === $_SESSION[\'token\'] ? true : false;
set_token();
return $return;
}
//如果token为空则生成一个token (作者:码农教程 http://www.manongjc.com )
if(!isset($_SESSION[\'token\']) || $_SESSION[\'token\']==\'\') {
set_token();
}
if(isset($_POST[\'test\'])){
if(!valid_token()){
echo \"token error\";
}else{
echo \'成功提交,Value:\'.$_POST[\'test\'];
}
}
?>
<form method=\"post\" action=\"\">
<input type=\"hidden\" name=\"token\" value=\"<?php echo $_SESSION[\'token\']?>\">
<input type=\"text\" name=\"test\" value=\"Default\">
<input type=\"submit\" value=\"提交\" />
</form>
上面的比较简单一点的方法,下面的代码更加安全一点。
Token.php
<?php
function getToken($len = 32, $md5 = true) {
# Seed random number generator
# Only needed for PHP versions prior to 4.2
mt_srand((double) microtime() * 1000000);
# Array of characters, adjust as desired
$chars = array (\'Q\',\'@\',\'8\',\'y\',\'%\',\'^\',\'5\',\'Z\',\'(\',\'G\',\'_\',\'O\',\'`\',\'S\',\'-\',\'N\',\'<\',\'D\',\'{\',\'}\',\'[\',\']\', \'h\',\';\',\'W\', \'.\',\'/\',\'|\',\':\', \'1\',\'E\',\'L\',\'4\',\'&\',\'6\',\'7\',\'#\',\'9\',\'a\',\'A\',\'b\',\'B\',\'~\', \'C\',\'d\',\'>\',\'e\',\'2\',\'f\',\'P\',\'g\',\')\',\'?\',\'H\',\'i\',\'X\',\'U\',\'J\',\'k\',\'r\',\'l\',\'3\',\'t\');
# Array indice friendly number of chars;
$numChars = count($chars) - 1;
$token = \'\';
# Create random token(作者:码农教程 http://www.manongjc.com/article/1549.html )
for ($i = 0; $i < $len; $i++)
$token .= $chars[mt_rand(0, $numChars)];
# Should token be run through md5?
if ($md5) {
# Number of 32 char chunks
$chunks = ceil(strlen($token) / 32);
$md5token = \'\';
# Run each chunk through md5
for ($i = 1; $i <= $chunks; $i++)
$md5token .= md5(substr($token, $i * 32 - 32, 32));
# Trim the token
$token = substr($md5token, 0, $len);
}
return $token;
}
?>
form.php
<?php
include_once(\"token.php\");
$token = getToken();
session_start();
$_SESSION[\'token\'] = $token;
?>
<form action=\"action.php\" method=\"post\"
<input type=\"hidden\" name=\"token\" value=\"<?=$token?>\" />
<!-- 其他input submit之类的 -->
</form>
action.php
<?php
session_start();
if($_POST[\'token\'] == $_SESSION[\'token\']){
unset($_SESSION[\'token\']);
echo \"这是一个正常的提交请求\";
}else{
echo \"这是一个非法的提交请求\";
}
?> 继续阅读与本文标签相同的文章
上一篇 :
数万头部作者、大V撑台,十岁微博少了什么?
下一篇 :
php如何防止图片盗用/盗链的两种方法
-
五大网络威胁应对挑战
2026-05-14栏目: 教程
-
能“生”的机器人,这不是玩笑!这只是机器拟人化的一小步
2026-05-14栏目: 教程
-
辉煌的背后,华为何时补齐短板?任正非给出新目标
2026-05-14栏目: 教程
-
全球首条“5G自动微公交”示范线路乌镇开通
2026-05-14栏目: 教程
-
未来十年,最为吃香的4个大学专业,毕业后就是香饽饽!
2026-05-14栏目: 教程
