我们可以从 CSRF Token 的本质、获取逻辑、自动化测试中的应用 三个维度总结核心知识点:
作用:服务端用来防御 跨站请求伪造(CSRF) 的令牌,确保请求来自合法页面(而非恶意站点伪造)。
存储位置:服务端会把它嵌入到 HTML 响应中(通常是 <input type="hidden" name="csrf_token" value="xxx"> 这样的隐藏表单字段)。
本质逻辑:requests 模拟了浏览器访问页面的过程: 浏览器访问页面时,服务端会生成 csrf_token 并嵌入 HTML 返还给客户端; requests 发送 HTTP 请求(比如 GET 访问论坛首页),同样能拿到服务端返回的 HTML 响应(包含 csrf_token); 再通过正则、XPath 或解析库(如 BeautifulSoup),从 HTML 里提取 csrf_token。
(1)核心流程:“先拿 Token,再发请求”
python运行
import requests
import re
#1. 模拟访问页面,获取 CSRF Token(相当于浏览器打开页面的过程)
session = requests.Session() # 保持会话(重要!因为 Token 通常与会话绑定)
response = session.get("http://example.com/login_page") # 访问登录页
csrf_token = re.search(r'name="csrf_token" value="(.*?)"', response.text).group(1)
#2. 携带 Token 发请求(相当于浏览器提交表单)
data = {
"csrf_token": csrf_token,
"username": "xxx",
"password": "xxx"
}
session.post("http://example.com/login", data=data) # 带着 Token 登录
(2)关键注意事项:Token 拥有时效性、一次性、会话绑定性! 时效性:Token 可能有过期时间(比如 10 分钟后失效),过期后必须重新获取。 一次性:部分场景下,Token 用一次就失效(比如登录成功后,旧 Token 无法再用)。 会话绑定:Token 通常和会话(session)绑定,换个会话(新的 requests.Session())则 Token 无效。
因此,自动化测试中,每次需要提交敏感请求(如登录、发帖)前,都应该重新访问页面获取最新的 Token,而不是存起来反复用。
| 场景 | 真实浏览器 | 自动化测试(requests) |
|---|---|---|
| 获取 Token | 自动加载页面,解析 HTML 里的 Token | 通过 requests.get() 拿响应,再用正则/解析库提取 Token |
| 使用 Token | 提交表单时,浏览器自动把 Token 放进请求里 | 手动把提取的 Token 塞进请求参数(如 data 或 headers) |
| Token 更新 | 页面刷新/跳转时,自动获取新 Token | 需手动重新访问页面,再次提取 Token(因为旧 Token 可能失效) |
注意:CSRF Token 可以理解为服务端给的 “通行证”,requests 能拿到它是因为模拟了 “领通行证” 的过程;但通行证有保质期,自动化测试时得每次重新领,才能保证请求合法。
本文作者:haotian
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!