10 csrftoken(跨站请求伪造)

CSRF(Cross-Site Request Forgery,跨站点伪造请求)是一种网络攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作,具有很大的危害性。具体来讲,可以这样理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。

-- 企业邮箱
-- pornhub.com

参考文章

token其实就是一个令牌,用于用户验证的,token的诞生离不开CSRF。正是由于上面的Cookie/Session的状态保持方式会出现CSRF,所以才有了token。

  • 解除中间件注释

image

  • 无csrf_token数据的post请求

image


1 基本使用

1.form表单提交

在html页面form表单中直接添加{% csrf_token%}

image


2.ajax提交

方式1:放在请求数据中。

from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.login),
    path('get_tokens/', views.get_tokens),

]
from django.shortcuts import render, HttpResponse
from django.middleware.csrf import get_token
from django.http import JsonResponse


def login(request):
    if request.method == "GET":
        return render(request, 'login.html')

    else:
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        res = {"state": False, "msg": "用户名密码错误"}
        if user == "lxx" and pwd == "123":
            res["state"] = True
            res["msg"] = None
        return JsonResponse(res)

def get_tokens(request):
    token = get_token(request)

    return HttpResponse(token)
<h3>form请求</h3>
<form action="" method="post">
    {% csrf_token %}
    用户名:<input type="text" name="user">
    密码:<input type="password" name="pwd">
    <input type="submit">
</form>
<hr>

<h3>ajax登录</h3>
<div>
    用户名:<input type="text" id="use">
    密码:<input type="password" id="pwd">
    <input type="button" value="ajax提交" class="login_btn">
    <span class="err"></span>
</div>

<script>
    $.ajax({
        url: "/get_tokens/",
        success: function (res) {
            console.log(res)
            localStorage.setItem("token", res)
        }
    })

    $('.login_btn').click(function () {
        $.ajax({
            url: "/login/",
            type: "post",
            data:{
                csrfmiddlewaretoken: localStorage.getItem("token"),
                user: $('#use').val(),
                pwd: $('#pwd').val(),
            },
            success: function (res) {
                console.log("res", res)
                if (res.state){
                    document.write("登录成功...")
                    {#location.href = '/index/'#}
                }else{
                    $('.err').html(res.msg)
                }
            }
        })
    })
</script>

方式2:放在请求头

$.ajax({
            url: '/login/',
            method: 'post',
            headers:{'X-CSRFToken':'token值'},  // 注意放到引号里面
            data:{}
}

2 全局使用,局部禁csrf

1.在视图函数上加装饰器

from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt
def 函数名(request):  # 加上装饰器后,这个视图函数,就没有csrf校验了

2.视图类

from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.utils.decorators import method_decorator
@method_decorator(csrf_exempt,name='dispatch')
class index(View):
    def get(self,request):
        return HttpResponse("GET")
    def post(self,request):
        return HttpResponse("POST")
posted @ 2022-08-11 10:58  角角边  Views(667)  Comments(0)    收藏  举报