XSS攻击:
XSS(Cross Site Script)攻击叫作跨站脚本攻击,他的原理是用户使用具备XSS漏洞的网站的时候,向这个网站提交一些恶意代码,当用户在访问这个网站的某个页面的时候,这个恶意的代码就会被执行,从而来破坏网页的结构,获取用户的隐私信息等。
XSS攻击场景:
好比如今有一个发布帖子的入口,若是用户在提交数据的时候,提交一段js代码,好比,,而后网页在渲染的时候直接将该代码渲染了,那么就会在浏览器的窗口中弹出一个对话框显示Hello world!若是攻击者能成功的运行这段js代码,那么他就能够运行更多的js代码,进而操控咱们的网页,这就会让咱们的网页用户的信息等很是不安全。
XSS攻击防护:
1. 若是不须要显示一些富文本,那么在渲染用户提交的数据的时候,直接进行转义就能够了。在Django的模板中默认就是转义的。也能够把数据在存储到数据库以前,先转义再存储进去,这样之后在渲染的时候,即便不转义也不会有安全问题,示例代码以下:
from django.template.defaultfilters import escape
from .models import Comment
from django.http import HttpResponse
def add_comments(request):
content = request.POST.get('content')
<!--使用escape()函数,能够在数据存储到数据库以前先进行转义,再存储到数据库中,这样即便以后网页不进行转义,也没有关系-->
escaped_content = escape(content)
Comment.objects.create(content=escaped_content)
return HttpResponse('success!')
2.若是对于用户提交上来的数据包含了一些富文本(好比:给字体设置颜色,字体加粗等), 那么这时候咱们在渲染的时候也要以富文本的形式进行渲染,就须要使用safe过滤器将其标记为安全的,这样才能显示富文本样式,可是这样又会存在一个问题,若是用户提交上来的数据攻击的代码呢?这时候再将其标记为安全的,确定就不行了,示例代码以下:
<ul>
{% for comment in comments %}
<!--使用safe过滤器,将数据标记为安全的-->
<li>{{ comment.id }} . {{ comment.comment|safe }}</li>
{% endfor %}
</ul>
那么这个时候要怎样处理呢? 这时候就能够指定某些标签是咱们须要的(好比,span标签),而某些标签咱们是不须要的(好比:script)。那么,咱们在服务器处理这些数据的时候,就能够将这些数据的标签保留下来,把不须要的标签进行转义,或者是直接进行删除,这样就能够解决咱们的问题了,这个方法是可行的,不少线上的网站也是这样的,在python中有一个库咱们能够用来处理这个事情,sanitizer。
富文本字符串处理
(1)bleach库是用来清理包含html格式字符串的库,他也能够指定哪些标签须要保留,哪些标签是须要过滤的,也能够指定标签上哪些属性是能够保留的,哪些属性是不须要的,想要使用这个库,能够执行pip install bleach 命令进行安装。
(2)这个库最重要的一个方法是bleach.clean()方法,bleach.clean()示例代码以下:
@require_POST
def add_comments(request):
# 从客户端获取数据
comment = request.POST.get('comment')
# bleach默认定义的一些标签,在原来的基础上添加一个img标签
tags = ALLOWED_TAGS + ['img']
# bleach默认定义的一些属性,在原来的基础上,在img标签上添加一个src属性
<!--这里使用**ALLOWED_ATTRIBUTES,主要是将ALLOWED_ATTRIBUTESdict中的键值对打散开,以后,能够和'img':['src'],进行拼接成一个字典-->
若是不打散的话就会造成{{},'key':'value'}
attributes = {**ALLOWED_ATTRIBUTES, 'img': ['src']}
<!--选择符合bleach.clean()方法中tags和标签都符合的comment-->
clean_data = bleach.clean(comment, tags=tags, attributes=attributes)
# 保存到数据库中
Comment.objects.create(comment=clean_data)
return redirect(reverse('index'))
(2)attribute:表示标签中容许哪些属性。
(4)ALLOWED_ATTRIBUTES:这个变量是bleach默认定义的一些属性,若是不符合要求,能够对其进行增减或者是删除。
在以上这个views.py中,为默认的网页加载标签中添加了一个img标签,而且为img标签添加一个属性src,同时在项目中建立一个js文件,示例代码以下:
window.onload = function () {
var imgTag = document.createElement('img');
imgTag.setAttribute('src', 'http://img.haote.com/upload/news/image/20170605/20170605144101_12960.jpg');
document.body.appendChild(imgTag);
};
此时就能够在index.html中进行加载该js文件了,而且能够完美的加载img图片。