编辑
2025-08-20
测试
00
请注意,本文编写于 108 天前,最后修改于 103 天前,其中某些信息可能已经过时。

目录

1. CSRF Token 是什么?
2. 为什么 requests 能拿到 CSRF Token?
3. 自动化测试中如何用 CSRF Token?
4. 对比真实浏览器 vs 自动化测试

我们可以从 CSRF Token 的本质、获取逻辑、自动化测试中的应用 三个维度总结核心知识点:

1. CSRF Token 是什么?

作用:服务端用来防御 跨站请求伪造(CSRF) 的令牌,确保请求来自合法页面(而非恶意站点伪造)。 存储位置:服务端会把它嵌入到 HTML 响应中(通常是 <input type="hidden" name="csrf_token" value="xxx"> 这样的隐藏表单字段)。

2. 为什么 requests 能拿到 CSRF Token?

本质逻辑:requests 模拟了浏览器访问页面的过程: 浏览器访问页面时,服务端会生成 csrf_token 并嵌入 HTML 返还给客户端; requests 发送 HTTP 请求(比如 GET 访问论坛首页),同样能拿到服务端返回的 HTML 响应(包含 csrf_token); 再通过正则、XPath 或解析库(如 BeautifulSoup),从 HTML 里提取 csrf_token。

3. 自动化测试中如何用 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,而不是存起来反复用。

4. 对比真实浏览器 vs 自动化测试

场景真实浏览器自动化测试(requests)
获取 Token自动加载页面,解析 HTML 里的 Token通过 requests.get() 拿响应,再用正则/解析库提取 Token
使用 Token提交表单时,浏览器自动把 Token 放进请求里手动把提取的 Token 塞进请求参数(如 data 或 headers)
Token 更新页面刷新/跳转时,自动获取新 Token需手动重新访问页面,再次提取 Token(因为旧 Token 可能失效)

注意:CSRF Token 可以理解为服务端给的 “通行证”,requests 能拿到它是因为模拟了 “领通行证” 的过程;但通行证有保质期,自动化测试时得每次重新领,才能保证请求合法。

本文作者:haotian

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!