使用 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 的相关文章

  • 如何在 Vim 中突出显示 Bash 脚本?

    我的 Vim 编辑器自动突出显示 PHP 文件 vim file php HTML 文件 vim file html 等等 但是当我输入 vim file在里面写一个Bash脚本 它不会突出显示它 我如何告诉 Vim 将其突出显示为 Bas
  • 如何通过 makefile 在 Linux 上安装程序? [复制]

    这个问题在这里已经有答案了 可能的重复 Linux Unix make install 应该包含什么 https stackoverflow com questions 528399 what should linux unix make
  • 我想在 Red Hat Linux 服务器中执行 .ps1 powershell 脚本

    我有一个在窗口中执行的 ps1 powershell 脚本 但我的整个数据都在 Linux 服务器中 有什么可能的方法可以让我在红帽服务器中执行 powershell 脚本 powershell脚本是 Clear Host path D D
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • 如何获取与 shell 中的文件名模式匹配的所有文件的总文件大小?

    我正在尝试仅使用 shell 来计算与文件名模式匹配的所有文件 在目录树中 的总大小 以字节为单位 这是我到目前为止所拥有的 find name undo exec stat c s awk 总计 1 END 打印总计 有没有更简单的方法来
  • 在 scapy 中通过物理环回发送数据包

    我最近发现了 Scapy 它看起来很棒 我正在尝试查看 NIC 上物理环回模块 存根上的简单流量 但是 Scapy sniff 没有给出任何结果 我正在做的发送数据包是 payload data 10 snf sniff filter ic
  • Bash:将字符串添加到文件末尾而不换行

    如何将字符串添加到文件末尾而不换行 例如 如果我使用 gt gt 它将添加到文件末尾并换行 cat list txt yourText1 root host 37 echo yourText2 gt gt list txt root hos
  • Ruby:在 Ubuntu 上安装 rmagick

    我正在尝试在 Ubuntu 10 04 上安装 RMagick 看起来here https stackoverflow com questions 1482823 is there an easy way to install rmagic
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • 使用 libusb 输出不正确

    我用libusb编写了一个程序 我怀疑输出是否正确 因为所有条目都显示相同的供应商和产品 ID 以下是代码 include
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • 正则表达式删除块注释也删除 * 选择器

    我正在尝试使用 bash 从 css 文件中删除所有块注释 我有以下 sed 命令的正则表达式 sed r s w s w d 这可以很好地去除块注释 例如 This is a comment this is another comment
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe

随机推荐

  • 如何在 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 通过请求