蓝盟诗人[LUC]蓝客联盟

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

2010-10-13 23:47 作者: 来源: 本站 浏览: 2,869 views 我要评论 字号:

formhash是一种类似验证码的东西,用来防止从我们网站外部提交数据,但不需要我们手动输入。
它在页面打开时就已经生成了,存在一需要提交数据用到的地方的隐藏input里(比如登录、发布文章)。比如,在UCHOME的登录页面模板里,我们可以看到这样的:

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

$_POST['formhash'] == formhash()

知道流程了,现在我们就来看看原理。
formhash()定义在uchome的include/function_common.php。转到这个函数,
可以看到:
$_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,就无法远程提交数据了。
PS:sitekey是通过一个function mksitekey()生成的,具体怎么生成请自行看代码。

打印
分享到:
复制链接

发表评论

*

* (保密)

Ctrl+Enter 快捷回复

会员登录关闭

记住我 忘记密码

注册会员关闭

小提示: 您的密码会通过填写的"电子邮箱"发送给您.