在看别人表单代码时,中间出现了个formhash的东西,并且赋值每次都不一样,有点像验证码一样。后来自己就研究了下,把我的个人理解分享给大家。
没有formhash官方名词解释。先解释下hash:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。
formhash是一种验证表单提交的技术,主要用在论坛,帖子上,防止刷帖,灌水,模拟提交等等。原理和验证码原理是一样的。
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事务要解决的事。