宝哥软件园

php表单添加令牌防止重复提交的方法分析

编辑:宝哥软件园 来源:互联网 时间:2021-09-07

本文说明了在php表单中添加Token以防止重复提交的方法。分享给大家参考,如下:

论代币

Token是一种令牌,具有随机性和不可预测性的特点。一般黑客或者软件都猜不到。

那么,Token是做什么的?原理是什么?

Token一般用在两个地方——防止重复提交表单和反csrf攻击(跨站点请求伪造)。

原则上,两者都是通过会话令牌实现的。当客户端请求页面时,服务器将生成一个随机数Token,将Token放入会话中,然后将Token发送给客户端(通常通过构建隐藏表单)。下次客户端提交请求时,令牌将与表单一起提交给服务器。

然后,如果应用于“反csrf攻击”,服务器将验证Token值,并判断它是否等于会话中的Token值。如果相等,则可以证明请求有效,没有伪造。

但是,如果应用它来“防止重复提交表单”,会话中的Token值将在服务器端的第一次身份验证相同后更新。如果用户重复提交,第二次认证判断会失败,因为用户提交的表单中的Token没有发生变化,但是服务器端会话中的Token发生了变化。

上述会话应用相对安全,但也称之为繁琐。同时,当存在多个页面和多个请求时,必须采用同时生成多个Token的方法,占用资源较多,降低了执行效率。因此,cookie可以用来存储身份验证信息,而不是会话令牌。例如,在处理“重复提交”时,提交的信息将在第一次提交后写入cookie,第二次提交将失败,因为cookie已经有提交记录。

然而,cookie存储有一个致命的弱点。如果cookies被劫持(xss攻击很容易得到用户的cookies),那就又是gameover了。黑客会直接实施csrf攻击。

因此,安全和效率是相对的。让我们来处理具体的问题。

向php表单添加令牌以防止重复提交

原理是生成一个随机字符串放在会话中,提交表单后再验证字符串,可以防止别人写表单作弊提交、重复提交或双击提交。

简单的php代码如下:

?Php/** PHP只是使用token来防止表单的重复提交*这个处理方法纯粹是给初学者参考的*/session _ start();函数set _ token(){ $ _ SESSION[' token ']=MD5(micro time(true));} function valid _ token(){ $ return=$ _ REQUEST[' token ']==$ _ SESSION[' token ']?真:假;set _ token();return $ return}//如果token为空,则生成一个tokenif(!isset($ _ SESSION[' token '])| | $ _ SESSION[' token ']==' '){ set _ token();} if(isset($ _ POST[' test ']){ if(!valid _ token()){ echo“token error”;}else{ echo '成功提交,值: '。$_POST['测试'];}}?form method=' post ' action=' input type=' hidden ' name=' token ' value='?php echo $_SESSION['token']?输入类型=' text ' name=' test ' value=' default '输入类型=' submit ' value=' submit '//形成上面更简单的方法和下面更安全的代码。

Token.php

?php/* *创建于2013-3-25 * *要更改此生成文件的模板,请转到* Window-Preferences-phpeclipse-PHP-Code Templates */function getToken($ len=32,$md5=true) { # Seed随机数生成器#仅适用于4.2 mt_srand之前的服务器端编程语言(Professional Hypertext Preprocessor的缩写)版本((double)micro time()* 1000000);#字符数组,根据需要调整$chars=数组(' q ',' @ ',' 8 ',' y ',' % ','^',' 5 ',' z ','(',' g ',' _ ',' o ','`',' s ','-',' n ',' d ',' { ',' } ','[',']',' h ',' w ',' .'/',' | ',' : ',' 1 ',' E ',' L ',' 4 ',' 6 ',' 7 ',' # ',' 9 ',' A ',' A ',' B ',' ~ ',' C ',' d ',' E ',' 2 ',' f ',' P ',' g ','),'?',' H ',' I ',' X ',' U ',' J ',' k ',' r ',' l ',' 3 ',' t ',' M ',' n ','=',' o ',' p ',' F ',' q ','!‘K’、‘R’、‘s’、‘c’、‘m’、‘T’、‘V’、‘j’、‘u’、‘V’、‘w’、‘s’、‘x’、‘I’、‘$’、‘Y’、‘z’、‘*);#数组指示友好的字符数;$numChars=计数($ chars)-1;$ token=#为($i=0)创建指定长度的随机令牌;$ i $ len$i ) $token .=$chars[mt_rand(0,$ NumChars)];#令牌应该通过讯息摘要5运行吗?if($ MD5){ # 32个字符块的数量$ chunks=ceil(strlen($ token)/32);$ md5token=#通过讯息摘要5为($i=1)运行每个块;$ i=$ chunks$i ) $md5token .=md5(substr($token,i * 32 - 32,32));# Trim token $ token=substr($ MD5 token,0,$ len);}返回$ token}?form.php

?phpinclude _ once(' token。PHP’);$ token=getToken();session _ start();$ _ SESSION[' token ']=$ token;表单操作='action.php '方法='post '输入类型='隐藏'名称=“令牌”值='?=$token?/!-其他输入提交之类的- /formaction.php

?PHP session _ start();if($ _ POST[' token ']==$ _ SESSION[' token ']){ unset($ _ SESSION[' token ']);"回声"这是一个正常的提交请求;}else{ echo '这是一个非法的提交请求;}?更多关于服务器端编程语言(专业超文本预处理器的缩写)相关内容感兴趣的读者可查看本站专题: 《php程序设计安全教程》 、 《php安全过滤技巧总结》 、 《PHP运算与运算符用法总结》 、 《PHP网络编程技巧总结》 、 《PHP基本语法入门教程》 、 《php操作office文档技巧总结(包括word,excel,access,ppt)》 、 《php面向对象程序设计入门教程》 、 《php字符串(string)用法总结》 、 《php+mysql数据库操作入门教程》 及《php常见数据库操作技巧汇总》

希望本文所述对大家服务器端编程语言(专业超文本预处理器的缩写)程序设计有所帮助。

更多资讯
游戏推荐
更多+