155.XSS攻击原理

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'))
(1)tags:表示容许哪些标签。
(2)attribute:表示标签中容许哪些属性。
(3)ALLOWED_TAGS:这个变量是bleach默认定义的一些标签,若是不符合要求,能够对其进行增减或者是删除。
(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图片。
相关文章
相关标签/搜索