要使用 curl 模拟登录 Flask 网站并获取 Cookie,需根据网站是否有 CSRF 保护选择不同方法。以下是详细步骤:
方法一:无 CSRF 保护的登录
如果 Flask 未启用 CSRF 保护(如 WTF_CSRF_ENABLED = False ):
复制代码 隐藏代码
curl -X POST \
-d "username=你的用户名&password=你的密码" \
-c cookies.txt \
http://example.com/login
方法二:有 CSRF 保护的登录(推荐)
大多数 Flask 应用使用 Flask-WTF 提供 CSRF 保护,需先获取 Token:
步骤 1:获取 CSRF Token
复制代码 隐藏代码
curl -s -c cookies.txt http://example.com/login > login.html
token=$(grep 'name="csrf_token"' login.html | sed 's/.*value="\([^"]*\)".*/\1/')
步骤 2:携带 Token 登录
复制代码 隐藏代码
curl -X POST \
-b cookies.txt \
-d "username=你的用户名" \
-d "password=你的密码" \
-d "csrf_token=$token" \
-c session_cookies.txt \
http://example.com/login
关键参数说明
参数 |
作用 |
-X POST |
指定 POST 方法 |
-d "key=value" |
发送表单数据 |
-c 文件 |
将响应中的 Cookie 保存到文件 |
-b 文件 |
发送请求时携带文件中的 Cookie |
-s |
静默模式(不显示进度) |
验证登录
检查 session_cookies.txt 文件内容。若成功,会看到类似:
复制代码 隐藏代码
.example.com TRUE / FALSE 1699999999 session eyJ1c2VyIjoiYWRtaW4ifQ.YZPhfg.dE4GzLz...
使用 Cookie 访问受保护页面
复制代码 隐藏代码
curl -b session_cookies.txt http://example.com/dashboard
常见问题排查
-
CSRF Token 提取失败
检查登录页面的 <form> 中是否包含类似字段:
复制代码 隐藏代码
<input type="hidden" name="csrf_token" value="TOKEN_VALUE">
调整 grep/sed 命令匹配实际 HTML 结构。
-
登录后重定向
添加 -L 参数跟随重定向:
复制代码 隐藏代码
curl -L -b session_cookies.txt http://example.com/dashboard
-
JSON API 登录
如果登录接口使用 JSON:
复制代码 隐藏代码
curl -X POST -H "Content-Type: application/json" \
-d '{"username":"admin", "password":"123"}' \
-c cookies.txt \
http://example.com/api/login
提示:实际参数需通过浏览器开发者工具(Network 标签)查看真实请求格式。
|