http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 9089|回复: 9

[求助] 关于csrf验证提交的问题

[复制链接]
发表于 2016-10-17 15:18:58 | 显示全部楼层 |阅读模式
做模拟登陆一个网站,提交的数据和浏览器开发者工具抓到的内容都是一模一样的。
cookie也是一模一样的。
但是网页方式就能正确登陆,post方式就不行。

收到的结果是 “Unable to verify your data submission”

上网搜索,发现最接近的原因是对方采用的是YII2。里面的csrf验证没有通过。


Web网页访问的时候form表单中会有对应的一个隐藏input:_csrf进行了验证才可以正常进行访问;
而非网页访问方式(不通过Web表单)是无法通过csrf验证的。


这种是不是就彻底没办法通过非网页访问方式模拟登陆了呢?有没有搞过的大牛给个提示?




1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2016-10-17 15:26:21 | 显示全部楼层
input:_csrf先访问一次网页获取到这个值,然后带上cookie提交就行了吧。网页的实现也是这样的原理
 楼主| 发表于 2016-10-17 16:40:50 | 显示全部楼层
站长苏飞 发表于 2016-10-17 15:26
input:_csrf先访问一次网页获取到这个值,然后带上cookie提交就行了吧。网页的实现也是这样的原理

我首先GET了这个登陆的页面。获得里面的内容,里面有一行
<input type="hidden" name="_csrf-frontend" value="WGFYcktTaUppKy8QOxUICTcPNB4Tfl57HSIdQgYbGCYiLwooPgQ7Ew==">  
这种的。我就提取了WGFYcktTaUppKy8QOxUICTcPNB4Tfl57HSIdQgYbGCYiLwooPgQ7Ew==这个值。

然后提交的时候也是把_csrf-frontend=这个参数加进来的。对提取到的值也是经过URL编码了。cookie就是用GET时候获得的cookie登陆的。

唯一一点跟浏览器抓到的内容不太一样的地方就是,浏览器抓到的提交cookie里面还多了两个值
_ga=GA1.2.492247020.1476693061; _gat=1
这俩值不清楚是干啥的,也不知道什么时候发过来的。我提交的时候没有带这俩值。会是因为这个?
这俩值是我按了登陆按钮以后自动添加到cookie里面提交的。之前的数据交互从来没看到过
发表于 2016-10-17 16:42:48 | 显示全部楼层
zdking 发表于 2016-10-17 16:40
我首先GET了这个登陆的页面。获得里面的内容,里面有一行
  
这种的。我就提取了WGFYcktTaUppKy8QOxUIC ...

是不是你试试就明白了,加上和不加上看看会不会影响结果,从字面意思就是你提交的数据是非法的,格式不对,或者是验证信息不对。具体这个真不好说,需要测试
 楼主| 发表于 2016-10-17 17:24:06 | 显示全部楼层
站长苏飞 发表于 2016-10-17 16:42
是不是你试试就明白了,加上和不加上看看会不会影响结果,从字面意思就是你提交的数据是非法的,格式不对 ...

这个我查了查好像是谷歌的数据分析代码自己加上的。以前网站看到过这类的cookie。一般忽略掉也能正常运行。这次这个网站的这种情况还真是第一次碰到。
发表于 2016-10-17 17:31:50 | 显示全部楼层
再检查一下参数吧,应该还是参数问题,看提示信息来分析,就是参数不对,没有通过验证
 楼主| 发表于 2016-10-18 00:03:24 | 显示全部楼层
站长苏飞 发表于 2016-10-17 17:31
再检查一下参数吧,应该还是参数问题,看提示信息来分析,就是参数不对,没有通过验证

不是那俩cookie的问题。提交的时候不要那俩cookie一样是正确的。
参数也仔细对过了,跟网页提交的规则是一模一样的。。。真是见了鬼了。。。
我再想想其他办法吧
多谢飞哥了
发表于 2016-10-18 08:27:47 | 显示全部楼层
应该还是有所不同的,检查问题的时候不要太相信自己的代码,要对自己的代码有疑心。呵呵。或者你方便的话贴出来包我看看
 楼主| 发表于 2016-10-18 21:17:35 | 显示全部楼层
站长苏飞 发表于 2016-10-18 08:27
应该还是有所不同的,检查问题的时候不要太相信自己的代码,要对自己的代码有疑心。呵呵。或者你方便的话贴 ...

浏览器抓到的:
General
Request URL:https://www.mdnsonline.com/customer/login
Request MethodOST
Status Code:302 Found
Remote Address:203.135.139.118:443
===============================================
Request Headers:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,ja;q=0.2,ko;q=0.2
Cache-Control:no-cache
Connection:keep-alive
Content-Length:166
Content-Type:application/x-www-form-urlencoded
Cookie: _csrf-frontend=5e84f0fb85d48aa83f28325ac4480ef68c8ab5491948a61b4a227fa4fc8b6ee9a%3A2%3A%7Bi%3A0%3Bs%3A14%3A%22_csrf-frontend%22%3Bi%3A1%3Bs%3A32%3A%22dnZTOwxwIGE3geJE32xBz6gg0OHU9lyI%22%3B%7D; mdnsonline=8rfs3erh01jbsjampv3r5pc170;
DNT:1
Host:www.mdnsonline.com
Origin:https://www.mdnsonline.com
Pragma:no-cache
Referer:https://www.mdnsonline.com/customer/login
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36
=========================================
Form Data:
_csrf-frontend:TkZiRENmQXoqKDgQDBE5DQcBJ3ckAws/fXQaBjlQJh1.CSoRego4Mw==
CustomerLoginForm[email]:username@qq.com
CustomerLoginForm[password]:password

其中cookie是之前GET这个网页获得的,token的值是GET页面里面的一个参数

用框架的代码:
string csrf_token = Regex.Match(loresult.Html, @"(?<=name=""csrf-token"" content="").*?(?=\"">)").ToString();// 从之前GET的页面获取这个token的值

                sb.Append("_csrf-frontend="); sb.Append(System.Web.HttpUtility.UrlEncode(csrf_token)); sb.Append("&");
                sb.Append("CustomerLoginForm%5Bemail%5D="); sb.Append(taskDetails.tbUserName); sb.Append("&");
                sb.Append("CustomerLoginForm%5Bpassword%5D="); sb.Append(taskDetails.tbPwd);
                myPostData = sb.ToString();
                sb.Length = 0;
                string filename = System.AppDomain.CurrentDomain.BaseDirectory + "sup.cer";
                loitem = new HttpItem()
                {
                    URL = "https://www.mdnsonline.com/customer/login",
                    Method = "OST",
                    Postdata = myPostData,
                    Timeout = 100000,//连接超时时间     可选项默认为100000  
                    ReadWriteTimeout = 30000,//写入Post数据超时时间     可选项默认为30000   
                    UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36",//用户的浏览器类型,版本,操作系统     可选项有默认值  
                    Host = "www.mdnsonline.com",
                    Referer = "https://www.mdnsonline.com/customer/login",
                    ContentType = "application/x-www-form-urlencoded",
                    Accept = "text/html,application/xhtml+xml,*/*",
                    CookieCollection = cc_cookie,
                    //Expect100Continue = true,
                    CerPath = filename,
                    Allowautoredirect = true,
                };
                loitem.Header.Add("ragma", "no-cache");
                loitem.Header.Add("Cache-Control", "no-cache");
                loitem.Header.Add("Upgrade-Insecure-Requests", "1");
                //loitem.Header.Add("Connection", "keep-alive");
                //得到HTML代码
                loresult = lohttp.GetHtml(loitem);

其中,myPostData的数据跟Form Data的内容已经是一模一样了。

整个登录过程只有这一个post。
成功登录的话是302
我上面的代码登录就是返回badrequest。。

飞哥要是不嫌麻烦的话就帮我看看。要是忙的话就算了。
 楼主| 发表于 2016-10-18 22:15:12 | 显示全部楼层
站长苏飞 发表于 2016-10-18 08:27
应该还是有所不同的,检查问题的时候不要太相信自己的代码,要对自己的代码有疑心。呵呵。或者你方便的话贴 ...

飞哥,不用了。我找到原因了。。
cookie = HttpHelper.GetSmallCookie(cookie);

http://www.sufeinet.com/thread-10019-1-1.html
自己解决后逛坛子发现有此一贴。最后一句真是写进心缝里去了。。。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-4-27 07:13

© 2014-2021

快速回复 返回顶部 返回列表