应对CSRF攻击
- 原理:
- CSRF攻击是攻击者盗用了用户的身份,以用户的名义发送恶意请求。CSRF防护的原理是通过在表单中添加一个随机生成的token,并在服务器端进行验证,确保请求来自合法用户。
- Django配置步骤:
- 启用CSRF中间件:在Django项目的
settings.py
文件中,默认已经启用了CSRF中间件。MIDDLEWARE
列表中应该有'django.middleware.csrf.CsrfViewMiddleware'
。如果没有,添加这一行。
- 模板中使用CSRF token:在所有POST表单中,使用
{% csrf_token %}
标签,Django会自动生成一个隐藏的输入字段,包含CSRF token。例如:
<form method="post">
{% csrf_token %}
<input type="submit" value="提交">
</form>
- AJAX请求:如果使用AJAX进行POST请求,需要在请求头中添加CSRF token。在前端JavaScript代码中,可以通过以下方式获取并添加:
function getCookie(name) {
let cookieValue = null;
if (document.cookie && document.cookie!== '') {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
const csrftoken = getCookie('csrftoken');
$.ajax({
url: '/your - url/',
type: 'POST',
data: {
// 数据
},
headers: {'X - CSRFToken': csrftoken}
});
- Flask配置步骤:
- 安装
flask - wtforms
:pip install flask - wtforms
。
- 使用
flask - wtforms
的CSRF保护:
from flask import Flask
from flask_wtf.csrf import CSRFProtect, generate_csrf
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your - secret - key'
csrf = CSRFProtect(app)
@app.route('/')
def index():
csrf_token = generate_csrf()
return f'<form method="post"><input type="hidden" name="csrf_token" value="{csrf_token}"><input type="submit" value="提交"></form>'
@app.route('/submit', methods=['POST'])
def submit():
# 处理提交
pass
- AJAX请求:在前端获取CSRF token并添加到请求头中。例如,在HTML模板中:
<script>
const csrf_token = '{{ csrf_token() }}';
$.ajax({
url: '/submit',
type: 'POST',
data: {
// 数据
},
headers: {'X - CSRFToken': csrf_token}
});
</script>
应对点击劫持
- 原理:
- 点击劫持是一种视觉上的欺骗手段,攻击者将需要攻击的网站通过
iframe
嵌套的方式嵌入自己的网页,并将iframe
设置为透明,诱导用户在不知情的情况下点击iframe
中的内容。防护原理是通过设置HTTP头,阻止网页被嵌入到其他页面的iframe
中。
- Django配置步骤:
- 设置X - Frame - Options头:在
settings.py
中添加以下中间件:
MIDDLEWARE = [
# 其他中间件
'django.middleware.clickjacking.XFrameOptionsMiddleware'
]
- 自定义设置:默认情况下,
XFrameOptionsMiddleware
设置X - Frame - Options
头为SAMEORIGIN
,表示只有在同源的情况下才能被嵌入。如果需要更严格的设置,如不允许任何嵌入,可以在settings.py
中设置:
X_FRAME_OPTIONS = 'DENY'
- Flask配置步骤:
- 使用
flask - headers
扩展:先安装pip install flask - headers
。
- 配置点击劫持防护:
from flask import Flask
from flask_headers import headers
app = Flask(__name__)
@app.route('/')
@headers({'X - Frame - Options': 'DENY'})
def index():
return 'Hello World'
from flask import Flask
from flask_headers import Headers
app = Flask(__name__)
headers = Headers(app)
headers.add('X - Frame - Options', 'DENY')