社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

小心!开发 Python 项目,要注意这 3个安全漏洞

Python编程时光 • 3 年前 • 419 次点击  
最近在一个 Python Web 项目中处理了 3 个安全漏洞。

在修复完毕之后,来给大家简单地总结分享一下,以提高大家在程序编写和项目开发中的安全意识。

 YAML文件解析漏洞

在项目中,我们使用了 Python 的 yaml 模块来解析用户上传文件中的.yaml文件,在之前的代码中我们使用了如下的代码对.yaml文件进行读取和解析:

import yaml
yaml.load(yaml_file)

实际上,这样做会带来很大的安全风险。正常情况下,yaml会按照特定的解析规则对 yaml文件的内容进行解析,最后实现转换为Python可读取的对象形式。

但是,除此之外,yaml.load()方法还能调用任何Python函数,如果上传的yaml文件不是常规的yaml内容格式,而是一串 Python代码,它也会进行执行。

解决方法是,使用yaml模块的safe_load()方法代替load()方法来读取yaml文件。

import yaml
yaml.safe_load(yaml_file)

 SVG上传漏洞

SVG 是一个可伸缩的矢量图形,其使用XML来定义图形。

SVG 有一个绝佳的好处就是它放大或缩小都不会导致质量的下降,而像PNG、JPG等格式的在放大或缩小后都会带来一定程度的质量损失。

正是由于这一特性,使得越来越多的网站开始采用SVG格式的。

但是由于 SVG是通过 XML 来定义的,在其标准中也允许标签的存在,所以相当于就可以在SVG嵌入 JavaScript 的代码。而这,就会带来 XSS 的安全风险。

举个例子,我们通过如下代码构造一个SVG:


svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
   <rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:3;stroke:rgb(0,0,0)" />
   <script type="text/javascript">
      alert("SVG XSS");
   
script>
svg>

在本地显示如下图所示:

在网页中打开,就会触发SVG文件中的JavaScript代码,如下图所示:

 用户输入XSS

用户输入是很常见的XSS产生领域,在这个项目中,因为使用了其自带的HTML模板引擎,自动过滤和转义了不安全的HTML标签和符号。所以一开始也没对用户输入的这一块内容进行过滤处理。

"><img src/onerror=alert(1)>

结果后面换了一个前端组件,在这个前端组件里面对文本内容进行解析,这个XSS漏洞就出现了。

索性在接收到用户输入的时候对其进行一次转义:

def html_filter(data):
    if len(data) == 0:
        return ""
    payloads = {
        '\'':''',
        '"':'"',
        ':',
        '>':'>'
    }

    new = data
    for key, value in payloads.items():
        new = new.replace(key, value)
    return new

 根源

上述一切漏洞的根源,其实都是过于相信用户的输入。

在网络安全领域有一句铁律:永远不要相信用户的一切输入。

的确,你永远不知道用户会有多变态,构造各种变态的输入值来试图突破系统。

所以,永远不要相信用户的一切输入,永远对用户的一切输入保持警惕、提防和审查。

你在项目开发中遇到过哪些安全漏洞?欢迎留言讨论!





Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/123408
 
419 次点击