推荐答案
为了防止 Django 应用中的点击劫持(Clickjacking),可以通过在 Django 视图中使用 X-Frame-Options 或 Content-Security-Policy HTTP 头来限制页面在 iframe 中的加载。
使用 X-Frame-Options
在 Django 中,可以通过中间件 django.middleware.clickjacking.XFrameOptionsMiddleware 来设置 X-Frame-Options 头。默认情况下,这个中间件会将 X-Frame-Options 设置为 DENY,从而防止页面被嵌入到 iframe 中。
# settings.py
MIDDLEWARE = [
...
'django.middleware.clickjacking.XFrameOptionsMiddleware',
...
]使用 Content-Security-Policy
Content-Security-Policy 是一个更现代的安全头,可以用来替代或补充 X-Frame-Options。可以通过自定义中间件或在视图中手动设置 Content-Security-Policy 头来防止点击劫持。
// www.javascriptcn.com code example
# settings.py
MIDDLEWARE = [
...
'django.middleware.security.SecurityMiddleware',
...
]
# 在视图中手动设置 Content-Security-Policy
from django.http import HttpResponse
def my_view(request):
response = HttpResponse()
response['Content-Security-Policy'] = "frame-ancestors 'self';"
return response本题详细解读
什么是点击劫持?
点击劫持是一种攻击技术,攻击者通过将目标网站嵌入到一个透明的 iframe 中,诱使用户在不知情的情况下点击 iframe 中的元素,从而执行恶意操作。
如何防止点击劫持?
X-Frame-Options:
DENY: 页面不能被嵌入到任何 iframe 中。SAMEORIGIN: 页面只能被同源的 iframe 嵌入。ALLOW-FROM uri: 页面只能被指定 URI 的 iframe 嵌入。
Content-Security-Policy:
frame-ancestors 'self': 只允许同源的 iframe 嵌入。frame-ancestors 'none': 不允许任何 iframe 嵌入。frame-ancestors uri: 只允许指定 URI 的 iframe 嵌入。
为什么推荐使用 Content-Security-Policy?
Content-Security-Policy 提供了更细粒度的控制,并且可以与其他安全策略一起使用。它逐渐成为现代 Web 应用的首选安全头。
注意事项
- 如果使用
X-Frame-Options,确保它被正确设置,并且没有其他配置覆盖它。 - 如果使用
Content-Security-Policy,确保它与其他 CSP 指令兼容,并且不会影响页面的正常功能。