php防止重复提交-php表单添加Token,避免重复提交

谈论代币

Token就是代币,它最大的特点就是随机性和不可预测性。 一般的黑客或软件很难猜测。

那么,Token有哪些作用呢? 原理是什么?

Token通常用在两个地方——防止表单重复提交和防CSRF攻击(跨站请求伪造)。

原则上两者都是通过会话令牌实现的。

当客户端请求页面时,服务器会生成一个随机数Token,将Token放入Session中,然后将Token发送给客户端(通常通过构造隐藏表单的方式)。

下次客户端提交请求时,Token会连同表单一起提交给服务器。

那么,如果应用于“防csrf攻击”,服务器会验证Token值,判断是否与会话中的Token值相等。 如果相等,则可以证明该请求是有效的并且不是伪造的。

但如果应用于“防止表单重复提交”,服务器端第一次验证相同后,session中的Token值就会被更新。 如果用户重复提交,第二次验证判断会失败,因为用户提交的表单中的Token没有改变,但是服务器端会话中的Token已经改变了。

上面的session应用比较安全,但是也比较复杂。 同时,当请求多个页面、多个请求时,必须同时生成多个Token,占用较多资源,降低执行效率。

因此,也可以使用cookie来代替session Token来存储认证信息。 例如,处理“重复提交”时,第一次提交时,将已经提交过的信息放入cookie中。 当第二次提交时php防止重复提交,因为cookie已经有提交记录,所以第二次提交会失败。

然而php防止重复提交,cookie存储有一个致命的弱点。 如果cookie被劫持(XSS攻击可以轻松获取用户cookie),那么就会再次gameover。

黑客会直接实施CSRF攻击。

<?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
if(!isset($_SESSION['token']) || $_SESSION['token']=='') {
set_token();
}
if(isset($_POST['test'])){
if(!valid_token()){
echo "token error";
}else{
echo '成功提交,Value:'.$_POST['test'];
echo "
"
;

echo "token:".$_SESSION['token'];
}
}
?>
<form method="post" action="">
<input type="hidden" name="token" value="">
<input type="text" name="test" value="Default">
<input type="submit" value="提交" />
</form>