为什么Django要引入CSRF令牌?答:主要是为了防止跨站伪造请求攻击,那么什么是跨站伪造请求攻击呢?

“CSRF”的英文全称是:“Cross-Site Request Forgery”,翻译过来就是:“跨站请求伪造”。

那么什么是跨站伪造请求攻击呢?看下面这张图就够了。
为什么Django要引入CSRF令牌?答:主要是为了防止跨站伪造请求攻击,那么什么是跨站伪造请求攻击呢?_第1张图片
注意:看上面这张图请按图中标注的1到6的顺序阅读。

Django通过引入CSRF令牌机制就可以有效的防止这种CSRF攻击。

来看下面一段HTML模板代码:

<form method="POST">
    {% csrf_token %}
    <input type="text" name="username" >
    <input type="submit" value="提交">
form>

这段代码中的 {% csrf_token %}就是Django实现防CSRF攻击的语句,解释如下:
在Django的模板中,{% csrf_token %}是一个模板标签,用于生成一个CSRF(Cross-Site Request Forgery)令牌。CSRF是一种攻击方式,攻击者通过伪造用户的请求来执行恶意操作。

CSRF令牌是一种安全机制,用于防止CSRF攻击。当用户使用表单时,Django会生成一个唯一的令牌并将其嵌入到生成的表单中。这个令牌由{% csrf_token %}标签生成,并在模板渲染时插入到表单的隐藏字段中。

在用户填写好表单并提交表单时,Django会验证请求中的CSRF令牌与服务器端保存的令牌是否匹配。如果不匹配,Django将拒绝该请求,从而防止CSRF攻击。

因此,{% csrf_token %}标签在表单中起到了保护应用程序免受CSRF攻击的作用。

总结:
CSRF令牌一般是传输到 HTML 表单中隐藏字段中的客户端,并使用 HTTP POST 请求提交。
关于HTTP POST的知识,请参考链接:https://blog.csdn.net/wenhao_ir/article/details/131307238

通过上面的CSRF令牌存储和提交机制,虽然攻击者可以因为用户在同一浏览器中没有退出A网站而利用到用户的cookie信息(请注意:攻击者只是能用利用到用户的cookie信息,实际上并没有拿到用户的cookie值,为什么没拿到?请结合本文开头的那幅对CSRF攻击介绍的图仔细理解),但是因为CSRF令牌值是存储在页面的隐藏字段中并且通过 HTTP POST 请求提交,所以攻击者是获取不到这个CSRF令牌值的。这样即使攻击者在request中添加了提交表单的数据,由于攻击者没有正确的CSRF令牌值,那么攻击者还是无法完成自己想要的提交成功数据的效果。

你可能感兴趣的:(Django,Web开发,django,csrf)