php使用cookie防止重复提交是不安全的
2010年3月20日
没有评论
最近在做一php项目时遇到需要检查重复提交的情况,搜索了一下发现一种做法是使用cookie来防止,起初一看还觉得可行,但细想以下发现在某些情况下是无法达到目标的。
cookie这个东西是属于客户端的,在设置了cookie后每次访问浏览器都会将设置的cookie发送给服务器。用cookie来防止重复提交的做法是在访问需要提交信息的页面时设置一个cookie值,在接收的页面验证这个cookie值是否满足规则。
如下面的测试代码:
test0.php
< ?php sleep(2);//模拟有延迟比较大的情况 if($_COOKIE['onlypost'] == 't'){ setcookie("onlypost", 'f'); if (isset ( $_POST ['msg'] )) { mysql_connect ( 'localhost', 'root', 'root' ); mysql_select_db ( 'test' ); mysql_query ( "insert into t_msg(msg) values('" . $_POST ['msg'] . "')" ); } echo 'submit ok'; }else{ echo 'submit error!'; } ?> |
test1.php
< ?php setcookie("onlypost", 't'); ?> <form action="test0.php" method="post"> msg:<input type="text" name="msg"/><input type="submit"/> </form> |
测试数据表
CREATE TABLE `t_msg` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `msg` VARCHAR(50) , PRIMARY KEY (`id`) ) |
在访问test1.php时,如果用户的延迟比较大,填写信息后连续两次或多次点击提交按钮。因为在第一次提交后服务器还没有返回信息重设cookie,浏览器接下来发送的请求数据包中cookie的值始终是一样。
阅读全文…