CSRF(Cross-site Request Forgery)攻击是一种常见的Web安全漏洞,攻击者利用用户已登录了的身份,通过构造歹意要求来实现攻击。
Python中可使用以下几种方式来防范CSRF攻击:
- 使用CSRF令牌
在表单中添加一个隐藏的字段来保存令牌值,令牌值需要在每次提交表单时动态生成。当接收到表单要求时,服务器会检查表单中的令牌值会不会与服务器生成的一致,不一致则认为是CSRF攻击,谢绝处理该要求。
以下是Python Flask框架中使用CSRF令牌的代码示例:
from flask_wtf.csrf import CSRFProtect # 初始化CSRF保护 csrf = CSRFProtect(app) # 在表单中添加CSRF令牌 @csrf.exempt @app.route('/submit', methods=['POST']) def submit(): # 生成CSRF令牌 csrf_token = session.get('_csrf_token', None) if csrf_token is None: csrf_token = os.urandom(16).hex() session['_csrf_token'] = csrf_token return render_template('submit.html', csrf_token=csrf_token)
在HTML模板中,使用{% raw %}{{ csrf_token() }}{% endraw %}
标签来生成CSRF令牌,并将令牌保存在表单中:
<form method="POST"> {{ csrf_token() }} <input type="text" name="name"> <input type="submit"> </form>
- 使用HTTP Referer检查
HTTP Referer是HTTP要求头中的一个字段,记录了要求来源的URL地址。在服务器端检查要求的Referer会不会合法,若不合法则谢绝处理该要求。
以下是Python Django框架中使用HTTP Referer检查的代码示例:
from django.middleware.csrf import CsrfViewMiddleware # 在中间件中添加Referer检查 class RefererCheckMiddleware(CsrfViewMiddleware): def _sanitize_token(self, request): if request.method == 'POST': referer = request.META.get('HTTP_REFERER', '') if 'pidancode.com' not in referer and '丸子编程' not in referer: return None return super()._sanitize_token(request)
在Django的settings.py文件中,将RefererCheckMiddleware
添加到中间件列表中:
MIDDLEWARE = [ ... 'path.to.RefererCheckMiddleware', 'django.middleware.csrf.CsrfResponseMiddleware', ... ]
SameSite是一个Cookie属性,用于指定该Cookie会不会允许在跨站要求中携带。将SameSite属性设置为Strict或Lax可以有效防范CSRF攻击。
以下是Python Flask框架中使用SameSite属性的代码示例:
from flask import Flask, make_response app = Flask(__name__) # 设置Cookie的SameSite属性 @app.route('/') def index(): response = make_response('Hello, world!') response.set_cookie('mycookie', 'value', samesite='Lax') return response
以上三种方法可以在区别的Python Web框架中利用实现CSRF防范。需要注意的是,CSRF攻击的防范其实不是可靠的,只能尽可能减小攻击的风险。建议在进行一些敏感操作时,另外验证用户身份,如密码交互、支付等。
本文来源:https://www.yuntue.com/post/83799.html | 云服务器网,转载请注明出处!