跨站脚本安全保护(Cross site scripting protection)
跨站脚本攻击(XSS)通常发生于站点存储和使用不安全的内容,例如数据库里存储的用户内容是用户的脚本,这些脚本读取后未经处理便执行导致了网站的不安全。例如:
<style class={{ var }}>...</style>
当var是来自用户类似于这样的内容:
'class1 onmouseover=javascript:func()'
这样就可能导致浏览器执行不安全的脚本。为了避免这类问题,Django的模版有一些自动过滤特殊字符的机制,类似于 ‘<’和>’之类的字符都会被过滤。如果你确定某些内容是完全安全的,不是来自用户的非法输入,想展示在页面上,你得在调用这些字符串的时候用safe过滤器,并且在合适的地方用双引号:
<style class=”{{ var|safe }}”>...</style>
跨站请求伪造保护(Cross site request forgery (CSRF) protection)
跨站请求伪造允许一个未知用户伪装成登录用户去提交表单、请求数据。例如:
A站的Javascript在用户打开B站之后,提交了B站的一个表单到B站(因为这时候用户可能已经登录了B站,所以B站以为这是用户提交的),但是这不是用户的行为。
Django有一些CSRF保护的模块,你必须在MIDDLEWARE_CLASSES 里面加上:
'django.middleware.csrf.CsrfViewMiddleware'
这样,在你的form里必须加上{% csrf_token %}才能通过服务器的验证,保证该表单是来自真正的用户:
<form action="." method="post">{% csrf_token %}
值得注意的是,当你把'django.middleware.csrf.CsrfViewMiddleware' 加入到MIDDLEWARE_CLASSES的时候,该设置会对全站生效,如果你只是想保护某些特殊的view(例如用户登录、注册的表单),那么你可以单独在该view函数前加上:
@csrf_protect
另外,还有一个设置只允许来自指定站点的POST请求:
CSRF_COOKIE_DOMAIN = '.example.com'
如果请求没有按照这些规范来做,则服务器会返回403 Forbidden错误,有些文章指出解决办法是在view里的相关函数前面加上:
@csrf_exempt
这是不对的,因为该修饰符的意义是指定某些view不用考虑CSRF,Django的文档认为只有特别特殊的情形下,才用该修饰符,如果在提交表单的地方用这个修饰符那么就会有CSRF攻击。
SQL注入攻击保护(SQL injection protection)
SQL注入是在SQL里面隐藏一些用户故意附带的脚本去数据库里执行的行为,Django的QuerySet会跳过大部分这类隐藏的脚本。
点击劫持攻击保护(Clickjacking)
点击劫持通常发生在一个站点A把站点B的内容放在一个frame里来伪装,例如,站点B是一个购物站点,里面有个‘确定购买’的按钮,站点A有个按钮‘赞’,站点A把站点B包装在一个frame里,调整这个frame让用户看不到,然后当用户点了A站点的‘赞’,A站点就自动调用Javascript去点击B站点的‘确定购买’。
Django防止此类劫持攻击的方法是在MIDDLEWARE_CLASSES里面加上:
'django.middleware.clickjacking.XFrameOptionsMiddleware',
开启SSL/HTTPS
需要根据自己的情况来开启HTTPS的设置,提高服务器安全性(只对开启了HTTPS的站点需要以下设置):
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True.
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_SSL_REDIRECT = True
在ALLOWED_HOSTS里指定哪些HOST是允许访问的
原文链接:http://www.maiziedu.com/wiki/django/safe/
有疑问加站长微信联系(非本文作者)