"您的请求来路不正确或表单验证串不符"的另类解决办法

[php]
function submitcheck($var, $allowget = 0, $seccodecheck = 0, $secqaacheck = 0) {
if(!getgpc($var)) {
return FALSE;
} else {
global $_G;
if($allowget || ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_G['gp_formhash']) && $_G['gp_formhash'] == formhash() && empty($_SERVER['HTTP_X_FLASH_VERSION']) && (empty($_SERVER['HTTP_REFERER']) ||
preg_replace("/https?:\/\/([^\:\/]+).*/i", "\\1", $_SERVER['HTTP_REFERER']) == preg_replace("/([^\:]+).*/", "\\1", $_SERVER['HTTP_HOST'])))) {
if(checkperm('seccode')) {
if($secqaacheck && !check_secqaa($_G['gp_secanswer'], $_G['gp_sechash'])) {
showmessage('submit_secqaa_invalid');
}
if($seccodecheck && !check_seccode($_G['gp_seccodeverify'], $_G['gp_sechash'])) {
showmessage('submit_seccode_invalid');
}
}
return TRUE;
} else {
showmessage('submit_invalid');
}
}
}
[/php]

从这个函数可以看出,DZ在检查用户的请求时,有判断HASH值和来路。
判断Hash值能检查用户请求的合法性,实际运用中也很有用,那强制检查肯定是非常有用的。
再看REFERER检查,我个人觉得多此一举,因为要做模拟POST,浏览器头是很容易就能模拟出来的,再加有部份网站做了负载均衡,或者使用代理服务器的话,就会出现“您的请求来路不正确或表单验证串不符,无法提交。请尝试使用标准的web浏览器进行操作。”的错误。

在部署代理服务器以后,Discuz的代码要改成这样:
[php]
function submitcheck($var, $allowget = 0, $seccodecheck = 0, $secqaacheck = 0) {
if(!getgpc($var)) {
return FALSE;
} else {
global $_G;
if($allowget || ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_G['gp_formhash']) && $_G['gp_formhash'] == formhash() && empty($_SERVER['HTTP_X_FLASH_VERSION']) && (empty($_SERVER['HTTP_REFERER']) ||
preg_replace("/https?:\/\/([^\:\/]+).*/i", "\\1", $_SERVER['HTTP_REFERER']) == preg_replace("/([^\:]+).*/", "\\1", $_SERVER['HTTP_HOST']) ||
'www.a.com' == preg_replace("/([^\:]+).*/", "\\1", $_SERVER['HTTP_HOST'])
))) {
if(checkperm('seccode')) {
if($secqaacheck && !check_secqaa($_G['gp_secanswer'], $_G['gp_sechash'])) {
showmessage('submit_secqaa_invalid');
}
if($seccodecheck && !check_seccode($_G['gp_seccodeverify'], $_G['gp_sechash'])) {
showmessage('submit_seccode_invalid');
}
}
return TRUE;
} else {
showmessage('submit_invalid');
}
}
}
[/php]

其中,www.a.com是被代理服务器的真实域名。

发表评论

评论列表(1)

  • iminfx

    2010.11.27 20:11

    请问这段代码在什么位置改

    全局搜索 “function submitcheck”

    回复