CSRF 跨站请求伪造,与 XSS 不同,XSS 是利用站内信任用户而 CSRF 是伪装信任用户(当网站使用 cookie 标明身份时,在用户没有登出该网站的情况下访问其他危险网站,危险网站使用其在该网站上的 cookie 伪装成用户发起请求)。

所以前提是:本地生成 Cookie, 不登出就访问危险网站

# GET

例子:

1752389235192

# POST

大多 CSRF 用的都是 <img>,<iframe>,<script > 这种带 src 属性的标签,这类标签只能发出一次 GET 请求。

所以如果是使用 POST 方法进行传参的网站:

在后端的参数是_$REQUEST 时,参照 GET

是_$POST 时:

使用 JS 提交表单:(表单也可以用 GET)

<form action=" / register" id="register" method="post" >
<input type=text name="username" value="" />
<input type=password name="password" value="" />
<input type=submit name="submit" value="submit" />
</form>
<--下面是用于自动提交的JS-->
<script>
var f = document.getElementById ( "register");
f.inputs [0].value = "test";
f.inputs [1].value = "passwd" ;
f.submit ();
</script>

可以将其隐藏在不可见的 <iframe> 里,让用户不可见

# 判定

1. 不存在 Referer 字段和 token

2. 去掉 Referer 字段,提交仍然有效

3. 使用工具一把梭

# 关于 token 与 cookie

键值对:sessionID (用于标识后端的 session, 对应其中的数据,本身只是服务器生成的随机字符串), 用户偏好等

控制属性:有效期,作用范围等

# token

存在于 session 中,在后端是 Session["csrf_token"]

注意:session 本身不会传递到客户端,其内容是用户登录状态等敏感数据。

token 的实际使用就是在每次提交数据时必须显式附带上 token

dcfafcc3787181847ec6fe751a3786ed

token 被直接渲染到界面上的的(这使得动态生成页面的只能用额外的逻辑加上 token,不能通过一开始的 js 遍历 dom 来加上),单纯的跨站没法获得原来页面的内容

但是有时候,有些网站(比如论坛类)会在发表在其上的链接自动加上 token(比如作为 get 参数),此时就可以获取到 token(但是实际上开发者只要识别下是否是本站链接就能避免这种情况)

token 除了在页面中(请求体), 也可以放在自定义请求头中。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中,并且其不会被浏览器记录到地址栏中,不会通过 referer 泄露到其他网站。

网站也会检查 Referer(请求来源),记得伪造。