discuz/uchome等康盛产品formhash()浅析

formhash是一种类似验证码的东西,用来防止网站外部提交数据。
它在页面打开时就已经生成了,存在一需要提交数据用到的地方的隐藏input里(比如登录、发布文章)。

比如,在UCHOME的登录页面模板里,我们可以看到这样的:

HTML代码
  1.     
  2. <input type="hidden" name="formhash" value="<!--{eval echo formhash();}-->" />  

formhash这个值是来自formhash()这个函数的。在我们(登录)提交表单时,同时也会把这个formhash值传到服务器,然后验证formhash值是否正确,如果不正确,则判断为非法提交数据。
验证过程在submitcheck()这个函数里,在uchome的include/function_common.php。

PHP代码
  1.     
  2. $_POST['formhash'] == formhash()  

知道流程了,现在我们就来看看原理。
在formhash()函数中可以看到:

PHP代码
  1.     
  2. $_SGLOBAL['formhash'] = substr(md5(substr($_SGLOBAL['timestamp'], 0, -7).'|'.$_SGLOBAL['supe_uid'].'|'.md5($_SCONFIG['sitekey']).'|'.$hashadd), 8, 8);  

formhash就是这么得来的:
首先,substr($_SGLOBAL['timestamp'], 0, -7),截取时间戳前3位。(保证formhash在一定的时间里生效且不变,截取前3位,大概是115天),然后跟用户UID、md5后的siteke​y等连接得出字符串,然后再md5,并截取字符串的8位。由于sitekey是唯一的,再加上UID,而且都是MD5的,破解的机会几乎是0(不排除MD5以后​会被完全破解)。别人无法仿造FORMHASH,就无法远程提交数据了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值