Django会话(Session)中的CSRF攻击防范和防御措施

2023-04-12 00:00:00 会话 防范 防御

CSRF(Cross-Site Request Forgery)攻击是一种利用用户已经登录的身份,但在未退出的情况下,通过伪造请求来执行恶意操作的攻击方式。Django提供了一些内置机制来防范这种攻击。

  1. 防御措施:

(1)在Django中,每个CSRF攻击都是基于浏览器的Cookie,因此Django的防御措施极大程度上依赖于浏览器中的cookie。Django的防范措施最简单直接的方法就是开启CSRF保护,启用方法如下:

在setting.py中加入:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',  # 开启CSRF保护
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

(2)Django的防范措施还包括:

a. 检查请求头中的Referer,如果不是合法的网站域名,就拒绝请求。

b. 防止HTML注入攻击,比如在显示表单数据的时候,自动转义HTML标签。

c. 验证Cookie中的CSRF标识符和请求中的CSRF标识符是否一致,防止伪造请求。

d. 生成验证码,防止机器人攻击。

  1. 防护方案:

Django中开启CSRF保护的方法只需要在中间件中添加'django.middleware.csrf.CsrfViewMiddleware'即可。下面是一个使用CSRF保护的视图函数示例代码:

from django.shortcuts import render
from django.template.context_processors import csrf
from django.views.decorators.csrf import csrf_exempt

#加上csrf_exempt则表示不使用检查csrf_token的方法
@csrf_exempt
def csrf_demo(request):
    if request.method == 'POST':
        return render(request, 'csrf_demo.html', {'info': '提交成功'})
    else:
        c = {}
        c.update(csrf(request))
        return render(request, 'csrf_demo.html', c)

在模板中加入{% csrf_token %} 就可以生成csrf_token。如果要手动生成csrf_token也可以调用csrf_token()函数。(比如:csrf_token(request)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>CSRF Demo</title>
</head>
<body>
    {% if info %}
        <div>{{info}}</div>
    {% endif %}
    <form method="post" action="">
        {% csrf_token %}
        <input type="text" name="username" value="pidancode.com">
        <input type="submit" value="Submit">
    </form>
</body>
</html>

在使用中,这里的 pidancode.com 可以更换成任意字符串。最后,建议在提交表单的时候使用POST方法,既能够隐藏参数内容,又能避免缓存和历史记录等问题。

相关文章