Skip to content

Daily Study

更新: 8/11/2025 字数: 0 字 时长: 0 分钟

Daily Plan

#todo

  • [ ]

CSRF验证

核心流程

  1. 启动一个会话 (Session):使用一个支持会话的对象(而不是发单个请求),这样可以自动管理和发送 Cookies,就像浏览器一样。这是整个流程能走通的基础。

  2. 第一次请求 (GET):向目标页面(例如登录页)发送一个 GET 请求。服务器会返回这个页面,并在响应中设置必要的会话 Cookie,同时页面的 HTML 中会包含一个 CSRF 令牌。

  3. 解析页面并提取令牌 (Parse & Extract):从 GET 请求返回的 HTML 内容中,像浏览器一样“读取”并找出那个隐藏的 csrfCode (CSRF Token)。

  4. 构建并发送请求 (POST):将你要提交的数据(例如用户名、密码)和刚刚提取到的 CSRF 令牌组合在一起,向服务器发送一个 POST 请求。由于你使用的是同一个会话,请求会自动带上正确的 Cookie。

  5. 验证结果:检查 POST 请求的响应,判断操作是否成功(例如,是否登录成功并跳转到了新页面)。

所需工具

Python 库会用到:

  • requests: 用于发送 HTTP 请求和管理会话。

  • BeautifulSoup: 用于解析 HTML 并轻松地提取数据。

Go库会用到

  • net/http: Go 官方标准库,用于发送 HTTP 请求和管理客户端。其中的 http.Client 配合 net/http/cookiejar 可以实现与 Python requests.Session 同样的效果。

  • net/url: 用于构建 POST 请求中的表单数据。

  • github.com/PuerkitoBio/go-query: 一个非常流行且功能强大的库,它模仿 jQuery 的 API 来解析和操作 HTML 文档,可以看作是 Go 版本的 BeautifulSoup

Go 与 Python 实现对比

特性Python 实现 (requests + BeautifulSoup)Go 实现 (net/http + go-query)
会话管理requests.Session() 对象自动管理 Cookies。通过 net/http/cookiejar 创建 jar 并赋给 http.Client 实例。
HTTP 请求session.get() / session.post(),API 非常简洁。使用 http.NewRequest() 创建请求,再用 client.Do() 发送,更底层,步骤更明确。
HTML 解析BeautifulSoup(html_text, 'lxml'),使用 find() 等方法。goquery.NewDocumentFromReader(),使用 Find() 和类似 jQuery 的链式调用。
错误处理使用 try...except 块来捕获异常。显式地检查每个可能返回 error 的函数调用 (if err != nil)。这是 Go 的核心特性。
资源管理通常由垃圾回收器自动处理。必须手动使用 defer resp.Body.Close() 来关闭响应体,否则会导致资源泄露。
代码风格简洁,动态类型。更为冗长,静态类型,但逻辑非常清晰,且编译时能发现更多错误。

菜就多练

本站访客数 人次 本站总访问量