使用 Linux curl 命令管理 Cookie

2023-10-25

与 Web 应用程序交互时,您会遇到处理 cookie 和会话的需要。

在本教程中,您将学习如何使用卷曲命令发送、接收和管理 cookie。

 

 

手动发送 Cookie 标头

The -Ioption 发送 HEAD 请求,仅返回响应中的标头。在标头中,如果服务器设置了 cookie,您会注意到Set-Cookie header.


curl -I https://www.example.com/login
  

The Set-Cookie来自服务器的标头表明它想要客户端(在本例中,curl)来存储cookie。

该 cookie 通常包含键值对、过期时间和其他属性。

如果您需要手动设置此标头,可以按如下方式操作:


curl -H "Cookie: name=value" https://www.example.com/dashboard
  

随着-H选项,您可以手动设置请求中的任何标头。在上面的命令中,您手动设置Cookie具有特定 cookie 值的标头。

 

存储从服务器接收到的 Cookie

使用curl -c选项,您可以将这些 cookie 存储在文件中以供将来使用。


curl -c session_cookie.txt -d "username=john&password=secret" https://www.example.com/login
  

该命令尝试使用指定的用户名和密码登录,如果成功,服务器的会话cookie将保存在session_cookie.txt.

查看存储的 Cookie

您可以使用简单的命令查看保存的 cookie 文件的内容cat命令:


cat saved_cookies.txt
  

输出将以结构化格式提供 cookie 列表。

 

通过请求发送 Cookie

您可以使用-b将保存的 cookie 发送回服务器的选项:


curl -b cookies.txt https://www.example.com/user-profile
  

在此命令中,curl读到cookies.txt文件并包含请求中所有存储的 cookie。这对于维护多个会话特别有用curl命令。

发送单独的 Cookie

对于您只想发送特定 cookie 的情况:


curl -b "username=john_doe" https://www.example.com/settings
  

在这里,您发送一个名为username与价值john_doe.

发送多个单独的 Cookie

要发送多个 cookie 而不引用 cookie 文件:


curl -b "token=abc123; session_id=456xyz" https://www.example.com/dashboard
  

在这种情况下,您将发送两个单独的 cookie (token and session_id)及其各自的值到服务器。

当您使用-b选项,curl自动设置Cookie请求中的 HTTP 标头。

 

在请求之间更新 Cookie 值

在动态 Web 应用程序中,由于会话更新、刷新身份验证令牌或只是更新用户首选项,cookie 可能会在请求之间发生变化。

With curl,您可以在请求之间更新 cookie 值。

如果您想维护单个 cookie 文件并不断用新值更新它:


curl -b cookies.txt -c cookies.txt https://www.example.com/modify-session
  

通过为两者指定相同的文件-b and -c,初始 cookie 被发送到服务器,并且来自服务器的任何更新都会覆盖原始条目。

 

处理超时和重新验证

检测会话超时通常涉及检查服务器的响应。这可能是 HTTP 状态代码、特定错误消息或登录页面的重定向。


response=$(curl -b session_data.txt -o /dev/null -w "%{http_code}" https://www.example.com/dashboard)
if [ "$response" == "401" ]; then
    echo "Session has expired."
fi
  

在上面的代码片段中,您正在检查 HTTP 401(未经授权)状态代码,这通常表示会话已过期或无效。

自动重新验证

当检测到超时时,立即尝试重新验证:


if [ "$response" == "401" ]; then
    curl -c session_data.txt -d "username=john&password=secret" https://www.example.com/login
fi
  

在这里,如果会话过期,您将发出登录请求以更新会话数据。

处理多个超时

对于长时间运行的脚本,可能会遇到多个会话超时。实现一个循环来检查会话有效性并根据需要重新进行身份验证:


for attempt in {1..3}; do
    response=$(curl -b session_data.txt -o /dev/null -w "%{http_code}" https://www.example.com/action)
    if [ "$response" != "401" ]; then
        break
    else
        echo "Re-authenticating attempt $attempt..."
        curl -c session_data.txt -d "username=alice&password=secret" https://www.example.com/login
    fi
done
  

如果检测到会话超时,此循环将尝试重新验证最多 3 次。

避免快速会话超时

某些 Web 服务的会话持续时间可能非常短,特别是如果它们是为高安全性而设计的。在这种情况下,定期发送“保持活动”或“心跳”请求可以帮助:


while true; do
    curl -b session_data.txt https://www.example.com/heartbeat
    sleep 300  # send a request every 5 minutes
done
  

这每 5 分钟发送一次请求,这可以防止短暂的会话超时。

 

将多个域 Cookie 保存在 Cookie Jar 中

curl可以在单个文件中存储和管理多个域的 cookie。

首先创建一个 cookie jar,它本质上是一个文件,其中curl将存储所有cookie:


curl -c cookie_jar.txt https://www.example.com
  

检查饼干罐

cookie jar 文件具有标准格式,每一行代表一个 cookie:


# Netscape HTTP Cookie File
.example.com    TRUE    /   FALSE   1694496488  USER_TOKEN  abc123xyz
.another-domain.com FALSE   /   FALSE   1694497488  AUTH_ID def456uvw
  

此格式显示域、路径、cookie 名称和值以及其他属性。

 

了解 Cookie Jar 格式

The curlcookie jar 使用纯文本格式。文件的每一行代表一个 cookie,并包含多个由制表符分隔的字段。


domain flag path secure expiration name value  
  • Domain:这表明 cookie 有效的域。它可以是特定的子域或更高级别的域。
  • Flag:TRUE/FALSE 值,指示给定域内的所有计算机是否可以访问 cookie。通常设置为FALSE.
  • Path:指定 cookie 有效的域内的路径。 Cookie 通常设置为可在特定目录中访问。
  • Secure:该字段将包含单词Securecookie 是否只能通过安全 (HTTPS) 连接传输。
  • 有效期:该数值表示 cookie 到期时的 UNIX 时间戳。如果 cookie 是会话 cookie(浏览器关闭时过期),则该字段将为零。
  • Name:cookie 的名称或键。
  • Value:与 cookie 名称关联的实际内容或值。

让我们分解一个示例条目:


.example.com TRUE / FALSE 1694496488 USER_TOKEN abc123xyz  
  • Cookie 的有效期为.example.com.
  • 域内的机器无法普遍访问 cookie。
  • 它对根路径有效(/).
  • 不限于安全连接。
  • 在 UNIX 时间戳到期1694496488.
  • 饼干的名字是USER_TOKEN.
  • Cookie 的值为abc123xyz.

 

安全考虑

Cookie 通常封装用户会话、首选项和身份验证数据。暴露或处理不当可能会导致:

  • 会话劫持:恶意行为者可以使用会话数据来冒充用户,从而获得对帐户或敏感信息的未经授权的访问。
  • 跨站脚本 (XSS) 攻击:如果 cookie 没有得到适当的保护,它们可能会成为 XSS 攻击的目标,入侵者会诱骗用户的浏览器运行恶意脚本。
  • 数据泄露:如果 cookie 存储或提供对个人数据的访问,它们的暴露可能会导致更广泛的数据泄露。

两个关键属性可以增强 cookie 的安全性:

安全标志:设置有此标志的 cookie 可确保它仅通过安全的 HTTPS 通道传输。因此,即使攻击者正在侦听,他们也无法通过不安全的通道拦截 cookie。


.example.com    TRUE    /   FALSE   1694496488  USER_TOKEN  abc123xyz   Secure
  

仅 Http 标志:带有此标志的 cookie 可确保浏览器中运行的 JavaScript 无法访问它,从而降低 XSS 攻击的风险。


.example.com    TRUE    /   FALSE   1694496488  USER_TOKEN  abc123xyz   HttpOnly
  

当您检查 jar 或 HTTP 标头中的 cookie 时,请留意这些标志并确保它们存在以提高安全性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Linux curl 命令管理 Cookie 的相关文章

  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 如何更改 Ubuntu 14.04 上的 php-cli 版本?

    我是 Linux 新手 在篡改时破坏了一些 php 设置 如果我执行一个包含以下内容的 php 脚本 phpinfo 它显示 php 版本为 5 6 但通过命令行 如果我运行php v它返回 7 0 版本 我想让两个版本匹配 我怎样才能修复
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • 大多数 Linux 系统头文件与 C++ 兼容吗?

    大多数 Linux 系统头文件 API C 兼容吗 今天我试图做这样的事情 include
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • 在哪里可以找到并安装 pygame 的依赖项?

    我对 Linux 比较陌生 正在尝试安装 python 的 pygame 开发环境 当我运行 setup py 时 它说我需要安装以下依赖项 我找到并安装了其中之一 SDL 然而 其他人则更加难以捉摸 Hunting dependencie
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https

随机推荐

  • 如何在 Debian 9 上设置 Apache 虚拟主机

    在本教程中 我们将引导您了解如何在 Debian 9 上设置 Apache 虚拟主机 Apache 虚拟主机允许您在一台计算机上托管多个域 使用虚拟主机时 您可以为每个域或子域指定不同的文档根 包含网站文件的目录 创建单独的安全策略 使用不
  • 如何在 CentOS 8 上安装 R

    R 是一种开源编程语言和免费环境 专门从事统计计算和图形表示 它由 R 统计计算基金会支持 主要供统计学家和数据挖掘人员用于开发统计软件和执行数据分析 本文介绍如何在 CentOS 8 上安装 R 先决条件 在继续本教程之前 请确保您已满足
  • 如何更改 SFTP 端口

    SFTP SSH 文件传输协议 是一种安全文件协议 用于通过加密连接在两台主机之间传输文件 它还允许您对远程文件执行各种文件操作并恢复文件传输 SFTP 可用作旧版 FTP 协议的替代品 它具有 FTP 的所有功能 但连接更安全 本文介绍如
  • 如何在 Ubuntu 18.04 上设置或更改时区

    在 Ubuntu 上 系统的时区是在安装过程中设置的 但以后可以轻松更改 使用正确的时区对于许多与系统相关的任务和流程都很重要 例如 cron 守护进程使用系统的时区来执行 cron 作业 并且日志文件中的时间戳基于相同的时区 本教程演示如
  • 如何在 Debian 9 上安装 Yarn

    Yarn 是一个与 npm 兼容的 JavaScript 包管理器 它的创建是为了解决 npm 的一系列问题 例如通过并行操作加快软件包安装过程并减少与网络连接相关的错误 在本教程中 我们将指导您如何安装Yarn在 Debian 9 系统上
  • 如何在 Ubuntu 18.04 上安装 Django

    Django 是一个免费开源的高级 Python Web 框架 旨在帮助开发人员构建安全 可扩展和可维护的 Web 应用程序 有不同的方法来安装 Django 具体取决于您的需要 它可以在系统范围内安装 也可以使用 pip 安装在 Pyth
  • 如何在 Linux 中添加目录到 PATH

    当您在命令行上键入命令时 您基本上是在告诉 shell 运行具有给定名称的可执行文件 在Linux中 这些可执行程序就像ls find file和其他文件 通常位于系统上的几个不同目录中 存储在这些目录中的任何具有可执行权限的文件都可以从任
  • 如何在 CentOS 8 上设置或更改时区

    使用正确的时区对于许多与系统相关的任务和流程至关重要 例如 cron 守护进程使用系统的时区来执行 cron 作业 并且日志文件中的时间戳基于同一系统的时区 在 CentOS 上 系统的时区是在安装过程中设置的 但以后可以轻松更改 本文介绍
  • Python range() 函数

    蟒蛇rangetype 通过定义范围的起点和终点来生成整数序列 它通常与for循环迭代数字序列 range 在 Python 2 和 3 中的工作方式有所不同 在Python 2中 有两个函数可以让你生成整数序列 range and xra
  • Linux 中的正常运行时间命令

    在本教程中 我们将介绍uptime命令 顾名思义 uptime命令显示系统已经运行了多长时间 它还显示当前时间 登录用户数以及过去 1 5 和 15 分钟的系统负载平均值 如何使用正常运行时间命令 uptime 命令的语法如下 uptime
  • 如何在 CentOS 7 上使用 VSFTPD 设置 FTP 服务器

    FTP 文件传输协议 是一种标准的客户端 服务器网络协议 允许用户在远程网络之间传输文件 有多种可用于 Linux 的开源 FTP 服务器 最流行和最广泛使用的是PureFTPd ProFTPD and vsftpd 在本教程中 我们将在
  • Python while 循环

    循环是编程语言的基本概念之一 当您想要多次重复特定的代码块直到满足给定条件时 循环会很方便 Python中有两种基本的循环结构 for and while loops 本教程涵盖了以下基础知识whilePython 中的循环 我们还将向您展
  • NumPy loadtxt 教程(从文件加载数据)

    在之前的教程中 我们讨论过NumPy 数组 我们看到了它如何使读取 解析和对数字数据执行操作的过程变得轻而易举 在本教程中 我们将讨论 NumPy loadtxt 方法 该方法用于解析文本文件中的数据并将其存储在 n 维 NumPy 数组中
  • Linux Bash 脚本编写第 3 部分 – 参数和选项

    到目前为止 您已经了解了如何编写无需用户输入即可完成工作的 Linux bash 脚本 今天我们将继续我们的 Linux bash 脚本系列 如果您想了解我们在谈论什么 我建议您查看之前的帖子 Bash 脚本基础知识 Bash 脚本 For
  • Pythonnamedtuple(将元组提升到一个新的水平)

    在本教程中 我们将深入研究命名元组 它们是什么 如何创建和操作它们 以及何时使用它们 或不使用它们 命名元组是Python内置的一部分收藏模块 并且它们提供了一种将数据捆绑在一个名称下的便捷方法 它们是 Python 内置元组数据类型的子类
  • 使用 Python 处理 CSV:综合教程

    CSV 逗号分隔值 文件是存储和共享表格数据的最常见方法之一 这些文件由行和列组成 其中每行代表一个记录 列包含由分隔符 通常是逗号 分隔的值 Python 提供了多种内置方法来处理 CSV 文件 使您可以高效地读取 写入和操作数据 本教程
  • Linux Bash 脚本编写第 5 部分 – 信号和作业

    在上一篇文章中 我们谈到了输入 输出和重定向在 bash 脚本中 今天我们将学习如何在Linux系统上运行和控制它们 到目前为止 我们只能从命令行界面运行脚本 但这并不是运行 Linux bash 脚本的唯一方法 这篇文章描述了控制 Lin
  • 使用curl命令的SSL/TLS:安全连接指南

    卷曲命令是一种发出网络请求的工具 它在通过 HTTPS 与安全服务器通信时使用 SSL TLS 默认情况下 curl尝试在可用时使用安全连接 但了解如何控制和诊断这些连接至关重要 目录 hide 1 使用客户端证书 2 指定证书类型 3 使
  • 如何使用 tqdm 创建 Python 终端进度条?

    进度条是估算和显示任务所需时间的宝贵工具 这些也可以添加到您的 Python 脚本或代码块中 以指示代码执行所需的时间 Python 中有多种可用的库 例如progressbar and tqdm可以用于此目的 目录 hide 1 什么是
  • 使用 Linux curl 命令管理 Cookie

    与 Web 应用程序交互时 您会遇到处理 cookie 和会话的需要 在本教程中 您将学习如何使用卷曲命令发送 接收和管理 cookie 目录 hide 1 手动发送 Cookie 标头 2 存储从服务器接收到的 Cookie 3 通过请求