Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6256
  • 博文数量: 4
  • 博客积分: 125
  • 博客等级: 入伍新兵
  • 技术积分: 45
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-11 19:08
个人简介

Here waiting for you

文章分类

全部博文(4)

文章存档

2013年(1)

2012年(2)

2011年(1)

我的朋友
最近访客

分类: Python/Ruby

2012-03-03 18:35:30

折腾了半天的问题,终于发现这个救命稻草

这个问题出现在:当你用模拟登陆的方法登陆了discuz论坛后,进行回复或与此类似的操作时,会出现这项提示:您的请求来路不正确,无法提交。出现这项提示的原因是多种多样的,但是对于一个模拟登陆的程序而言,主要的可能是这样一种情况:在post时,未设置formhash。

这个formhash的值可以在论坛的任意页面获得,只要用正则表达式简单匹配一下即可,以python为例:

formhash = re.findall(‘formhash=([1-9a-e]*)’,page)

formhash的值是一个长度为8的字符串,以16进制表示。如: 58a4c7db。以我的经验来看,在一次的登陆过程中,formhash值是不会变的,不过为保险起见,你可以在每次进行新的相关操作时,均获取一遍该hash值。

既然你会通过搜索引擎来到这里,想必也是走了不少弯路,如果我这里的文章仍然不能解决你的问题,我想你应该通过这样的方法继续探索真相:我们知道,出现”您的请求来路不正确,无法提交”是因为在dz\templates\default\messages.lang.php文件中定义了:’submit_invalid’ => ‘您的请求来路不正确,无法提交。’,而引用submit_invalid的代码位于:dz\include\global.func.php的函数submitcheck()中。导致出现这一提示的判断来自于这句话:

if($allowget || ($_SERVER['REQUEST_METHOD'] == ‘POST’ && $GLOBALS['formhash'] == formhash() && empty($_SERVER['HTTP_X_FLASH_VERSION']) && (empty($_SERVER['HTTP_REFERER']) ||
   preg_replace(“/https?:\/\/([^\:\/]+).*/i”, ““, $_SERVER['HTTP_REFERER']) == preg_replace(“/([^\:]+).*/”, ““, $_SERVER['HTTP_HOST']))))

正是这里的判断让你得到了那样的提示。从这个判断我们可以知道,你最好使用post方法,提交的formhash正确,且http_referer字段的值最好和主机名能够保持一致,这个应该不难吧?

转自:python牛,独自呓语 
阅读(2195) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~