Python CGI 脚本拒绝包含数据 URI 的数据 (403)

Python CGI script rejects data that includes data URI (403)

我有一个使用 SVG 创建小图像的网络应用程序,我希望它能够将这些图像保存到服务器,然后再次加载它们(作为 SVG 元素的内部 HTML)。使用 ajax,我将 svg 的内部 HTML 发送到我的服务器端 Python 脚本,它看起来或多或少像这样:

#!/usr/bin/python
import cgi

data=cgi.FieldStorage()
filename=data.getfirst('filename')
svg=data.getfirst('svg')

f = open('/filepath/'+filename,'w')
f.write(svg)
f.close()

ajax 调用如下所示:

function savetoserver() {
    var filename=$('#savename').val()
    var svg = document.getElementById("svg_element").innerHTML

    dictionary={'svg':svg,'filename':filename}

    $.ajax({
        url:'http://myserver.com/savetoserver.py',
        type: 'post',
        datatype: 'html',
        data: dictionary,
        success: function(response){
            closedialog()
        }
    })
}

这一切都适用于简单的输入。但是,如果我的 SVG 中有任何类型的数据 URI,它就会失败,并且脚本 returns 403(禁止)。不幸的是,我有点想将数据 URI 传递给它。在某些情况下,SVG 中会放置一个小图像,而在几乎所有情况下,SVG 中都会嵌入字体作为 base64 数据 URI。

根据我从谷歌搜索中发现的一点信息,这似乎是一个安全问题,以防止通过数据 URI 对服务器进行攻击。是否有可供我使用的标准替代方案,可以让我存储这些数据而不感到沮丧 Python/Apache/whoever 正在感到沮丧?

我不太确定你的 svg 变量是什么样的(我猜 'some text' + URI) 在任何情况下,您都可能希望使用 encodeURIComponent() 来对 URI 中的特殊字符进行编码。

因此,您可以尝试将 svg 拆分为 'text part' 和 'URI' 部分(例如使用 split() ),然后将其发送到 ajax 请求中并更新字典,其中 svg 变量类似于 'some text' + encodeURIComponent('URI')