• 请不要在回答技术问题时复制粘贴 AI 生成的内容
XiaoFaye
V2EX  ›  程序员

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

  •  
  •   XiaoFaye · Sep 7, 2017 · 4586 views
    This topic created in 3353 days ago, the information mentioned may be changed or developed.
    最近在做一个网站的模拟登陆,基本步骤如下:
    先打开登陆页,从页面的 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 是错的?
    Supplement 1  ·  Sep 7, 2017
    代码我也放上来吧,网站大家随便去注册一个账号就行:

    前面一大段是拿到 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 replies  •  2017-09-07 16:46:34 +08:00
    e9e499d78f
    e9e499d78f
    Sep 7, 2017 via iPhone
    1
    cookiejar
    Enivel
    Enivel
    PRO
    Sep 7, 2017 via iPhone
    2
    curl 没带 cookie 吧
    XiaoFaye
    XiaoFaye
    OP
    Sep 7, 2017
    3
    带了,两个版本都带了。但是 Curl 下面 Post 返回的关键 Cookie 都变成 deleted 了。。。
    0TSH60F7J2rVkg8t
    0TSH60F7J2rVkg8t
    Sep 7, 2017 via iPhone
    4
    指定了 User Agent 了吗?
    HYSS
    HYSS
    Sep 7, 2017
    5
    photomjs
    yy1193889747
    yy1193889747
    Sep 7, 2017
    6
    Curl 拿到的 token 到底是正确还是错误呢
    XiaoFaye
    XiaoFaye
    OP
    Sep 7, 2017
    7
    @yy1193889747 @ahhui

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

    可以考虑第一次拿 token 的时候从 header 里把 cookie 分离出来,然后 post 的时候给 CURLOPT_COOKIE 赋值带上 cookie,不用 CookieJar 了。
    XiaoFaye
    XiaoFaye
    OP
    Sep 7, 2017
    10
    @Patrick95 在.NET 方案里,Post 的时候不需要带第一个页面的 Cookie,我只是 assign 了一个新的 CookieContainer 给它。就算我带了,Curl 也 Post 不成功。
    lieh222
    lieh222
    Sep 7, 2017
    11
    抓包,对比报文,下一。。下一 ti 不让发了
    dbj1991
    dbj1991
    Sep 7, 2017
    12
    @HYSS 先把单词拼对了再回复吧
    HYSS
    HYSS
    Sep 7, 2017
    13
    @dbj1991 最近生活不顺?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4660 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 58ms · UTC 06:25 · PVG 14:25 · LAX 22:25 · JFK 01:25
    ♥ Do have faith in what you're doing.