Py学习  »  Python

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

Python编程时光 • 2 年前 • 258 次点击  
最近在一个 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
 
258 次点击