Django会话(Session)中的CSRF攻击防范和防御措施
CSRF(Cross-Site Request Forgery)攻击是一种利用用户已经登录的身份,但在未退出的情况下,通过伪造请求来执行恶意操作的攻击方式。Django提供了一些内置机制来防范这种攻击。
- 防御措施:
(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. 生成验证码,防止机器人攻击。
- 防护方案:
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方法,既能够隐藏参数内容,又能避免缓存和历史记录等问题。
相关文章