解释formhash是什么以及什么时候用
2017-07-20| 程成| 2730| 1| PHP技术

在看别人表单代码时,中间出现了个formhash的东西,并且赋值每次都不一样,有点像验证码一样。后来自己就研究了下,把我的个人理解分享给大家。


一,formhash是什么


没有formhash官方名词解释。先解释下hash:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。


formhash是一种验证表单提交的技术,主要用在论坛,帖子上,防止刷帖,灌水,模拟提交等等。原理和验证码原理是一样的。



二、forhash具体怎么做


1、首先服务器端生成一个formhash值,传递到前台并保存起来(memcache或redis或数据库都行)


<?php
$id = 1;
$formhash = md5('this is a key'.date('Y-m-d H-i-s').$id);
$this->redis->set($id,$formhash);
?>



2、前台一般把这个formhash值存在<input type='hidden' />中


<input type='hidden' name='formhash' value='<?php echo $formhash;?>' />
<input type='hidden' name='id' value='<?php echo $id;?>' />



3、前台提交表单后,后台取出这个formhash值和前台接受的formhash值进行验证,如果相同,则删除保存在后台的这个formhash值;不相同则拒绝执行后面代码


<?php
$id = $_POST['id'];
$view_formhash = $_POST['formhash'];
$back_formhash = $this->redis->get($id);
if($view_formhash == $back_formhash){
    $this->redis->del($id);
    //继续执行后面的表单提交操作
    ...
}
?>


原理和验证码如出一辙,很实用的做法。


注:forhash不能解决并发问题,比如两个人同时购买同一个商品引起的并发库存问题,那个是sql事务要解决的事。



×
作者:程成
QQ:492245711