V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
XiaoFaye
V2EX  ›  程序员

最近做模拟登陆发现的一个奇怪的问题,希望有大神能来解释一下

  •  
  •   XiaoFaye · 2017-09-07 06:41:01 +08:00 · 3527 次点击
    这是一个创建于 2668 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在做一个网站的模拟登陆,基本步骤如下:
    先打开登陆页,从页面的 Hidden Field 里面找到随机 Token,然后和用户名密码一起 Post 过去。

    首先我用.NET Core 2.0 去实现,先用 HttpWebRequest 打开页面,拿到 Token,然后再开一个新的 HttpWebRequest 把数据 Post 过去,测试一切正常,登陆成功!

    后来因为某些原因,我开始实现 Linux 下面的 Curl 版本。
    步骤也差不多,先用 Curl 拿到页面 Token,然后再把数据 Post 过去。

    现在问题就是 Curl 版本怎么也不成功,已经检查过拿到的 Token 是对的。

    后来作对比的时候发现,用.NET 下面的 HttpWebRequest 拿到的页面 Token,再放 Curl 里面直接 Post 过去,登陆就成功了。。。。

    现在困扰我的就是.NET 下面用 HttpWebRequest Get 跟 Curl 的 Get 有什么区别吗?为什么 Curl 拿到的 Token 是错的?
    第 1 条附言  ·  2017-09-07 10:44:41 +08:00
    代码我也放上来吧,网站大家随便去注册一个账号就行:

    前面一大段是拿到 form_key 和 frontend 两个 token, 一个在页面里,一个在 cookie 里,但是 cookie 不需要带到 POST 请求去,只要放 Header 里面就行。

    [email protected]
    PWD=password
    URL="http://www.buyanz.com/customer/account/loginPost/"

    strindex() {
    x="${1%%$2*}"
    [[ "$x" = "$1" ]] && echo -1 || echo "${#x}"
    }

    OUTPUT="$(curl -s -c cookie.txt http://www.buyanz.com/customer/account/login/ | grep form_key)"

    #OUTPUT="$(cat test.txt | grep form_key)"

    index1="$(strindex "${OUTPUT}" "form_key")"
    let "index1+=48"
    form_key="$(echo "${OUTPUT}" | cut -c"${index1}"-433)"

    echo "${form_key}"

    OUTPUT2="$(cat cookie.txt | grep frontend)"
    index2="$(strindex "${OUTPUT2}" "frontend")"
    let "index2+=10"
    frontend="$(echo "${OUTPUT2}" | cut -c"${index2}"-100)"
    echo "${frontend}"

    rm cookie.txt

    # login
    curl -s -c cookie.txt --user-agent Mozilla/5.0 -H "Accept: text/html,application/xhtml+xml,*/*" -H "Content-Type: application/x-www-form-urlencoded" -H "Cookie: CACHED_FRONT_FORM_KEY=${form_key};retina=no_retina;knockPopup=true;VIEWED_PRODUCT_IDS=19%2C767%2C22%2C1744%2C2612; frontend=${frontend}" -d "login[username]=${UID}&login[password]=${PWD}&form_key=${form_key}" -X POST ${URL} > login.log
    13 条回复    2017-09-07 16:46:34 +08:00
    e9e499d78f
        1
    e9e499d78f  
       2017-09-07 06:43:00 +08:00 via iPhone
    cookiejar
    LevineChen
        2
    LevineChen  
       2017-09-07 06:44:44 +08:00 via iPhone
    curl 没带 cookie 吧
    XiaoFaye
        3
    XiaoFaye  
    OP
       2017-09-07 06:55:23 +08:00
    带了,两个版本都带了。但是 Curl 下面 Post 返回的关键 Cookie 都变成 deleted 了。。。
    0TSH60F7J2rVkg8t
        4
    0TSH60F7J2rVkg8t  
       2017-09-07 08:37:13 +08:00 via iPhone
    指定了 User Agent 了吗?
    HYSS
        5
    HYSS  
       2017-09-07 08:42:14 +08:00
    photomjs
    yy1193889747
        6
    yy1193889747  
       2017-09-07 09:03:35 +08:00
    Curl 拿到的 token 到底是正确还是错误呢
    XiaoFaye
        7
    XiaoFaye  
    OP
       2017-09-07 10:30:23 +08:00
    @yy1193889747 @ahhui

    Token 是正确的,至少从 Curl 拿到的网页源代码对比就知道了。
    User-agent 没有任何影响。只要从 HttpWebRequest 请求的页面里拿 Token,那就百分百会 POST 成功。
    dsg001
        8
    dsg001  
       2017-09-07 11:05:22 +08:00
    抓包 curl、HttpWebRequest,对比下看看有木有区别
    Patrick95
        9
    Patrick95  
       2017-09-07 11:42:14 +08:00
    后面的 curl 方案应该是 post 的时候没有把 cookie 传过去。

    可以考虑第一次拿 token 的时候从 header 里把 cookie 分离出来,然后 post 的时候给 CURLOPT_COOKIE 赋值带上 cookie,不用 CookieJar 了。
    XiaoFaye
        10
    XiaoFaye  
    OP
       2017-09-07 13:21:37 +08:00
    @Patrick95 在.NET 方案里,Post 的时候不需要带第一个页面的 Cookie,我只是 assign 了一个新的 CookieContainer 给它。就算我带了,Curl 也 Post 不成功。
    lieh222
        11
    lieh222  
       2017-09-07 14:55:44 +08:00
    抓包,对比报文,下一。。下一 ti 不让发了
    dbj1991
        12
    dbj1991  
       2017-09-07 15:00:05 +08:00
    @HYSS 先把单词拼对了再回复吧
    HYSS
        13
    HYSS  
       2017-09-07 16:46:34 +08:00
    @dbj1991 最近生活不顺?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3028 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:00 · PVG 19:00 · LAX 03:00 · JFK 06:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.