访问需要从其他页登录的页的 CURL

我有2页: xyz.example/axyz.example/b。我只能访问 xyz.example/b当且仅当我先登录到 xyz.example/a。如果访问 xyz.example/b而不通过其他,我只是获得访问拒绝(没有重定向登录)通过浏览器。一旦我登录 xyz.example/a,我就可以访问另一个。

我的问题是使用 curl 命令执行此操作。我可以使用 curl 成功地登录到 xyz.example/a,但是如果尝试使用 xyz.example/b,则访问被拒绝。

我使用以下方法:

curl --user user:pass https://xyz.example/a  #works ok
curl https://xyz.example/b #doesn't work

我试过在第二行中加上 & 而不加上用户/密码部分,但仍然不起作用。两个页面使用相同的 CA,所以这不是问题。

287194 次浏览

在谷歌了一下之后,我发现了这个:

curl -c cookie.txt -d "LoginName=someuser" -d "password=somepass" https://oursite/a
curl -b cookie.txt https://oursite/b

不知道有没有用,但可能会指引你正确的方向。

网站可能使用 饼干来存储您的会话信息

curl --user user:pass https://xyz.example/a  #works ok
curl https://xyz.example/b #doesn't work

curl在两个独立的会话中运行两次。因此,当第二个命令运行时,第一个命令设置的 cookie 不可用; 这就好像您在一个浏览器会话中登录到页面 a,并试图在另一个浏览器会话中访问页面 b

您需要做的是 拯救第一个命令创建的 cookie:

curl --user user:pass --cookie-jar ./somefile https://xyz.example/a

然后在运行第二个时再读回来:

curl --cookie ./somefile https://xyz.example/b

或者,您可以尝试在同一个命令中下载这两个文件,我认为这将使用相同的 cookie。

你也可以通过浏览器登录,获得包括 cookies 在内的所有头信息的命令:

打开开发工具的网络标签,登录,导航到所需的页面,使用“复制为 cURL”。

screenshot

我的回答是来自@JoeMills 和@user 的一些先前回答的模块。

  1. 获取登录服务器的 cURL命令:

    • 加载网站登录页面并打开“开发人员工具”的“网络”窗格
      • 在 Firefox 中,右键单击页面,选择“检查元素(Q)”,然后单击“网络”选项卡
    • 进入登录表单,输入用户名、密码和登录
    • 登录后,返回“网络”窗格并滚动到顶部以查找 POST 条目。右键单击并选择 Copy-> Copy as CURL
    • 将其粘贴到文本编辑器,并在命令提示符下尝试该命令,以查看是否有效
      • 有可能一些站点已经加强,将阻止这种类型的登录欺骗,这将需要更多的步骤下面绕过。
  2. 修改 cURL 命令,以便能够在登录后保存会话 cookie

    • 删除入口 -H 'Cookie: <somestuff>'
    • -c login_cookie.txt开始时在 curl后面加
    • 尝试运行这个更新的 curl 命令,您应该会在同一个文件夹中获得一个新文件 'login_cookie.txt'
  3. 使用这个需要您登录的新 cookie 调用一个新的网页

    • curl -b login_cookie.txt <url_that_requires_log_in>

我已经在 Ubuntu20.04上试过了,效果非常好。