与 Web 应用程序交互时,您会遇到处理 cookie 和会话的需要。
在本教程中,您将学习如何使用卷曲命令发送、接收和管理 cookie。
The -I
option 发送 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 curl
cookie jar 使用纯文本格式。文件的每一行代表一个 cookie,并包含多个由制表符分隔的字段。
domain flag path secure expiration name value
-
Domain:这表明 cookie 有效的域。它可以是特定的子域或更高级别的域。
-
Flag:TRUE/FALSE 值,指示给定域内的所有计算机是否可以访问 cookie。通常设置为
FALSE
.
-
Path:指定 cookie 有效的域内的路径。 Cookie 通常设置为可在特定目录中访问。
-
Secure:该字段将包含单词
Secure
cookie 是否只能通过安全 (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 时,请留意这些标志并确保它们存在以提高安全性。