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

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

本文关键字:数据 URI Python 脚本 拒绝 包含 CGI      更新时间:2023-09-26

我有一个使用SVG创建小图像的Web应用程序,我希望它能够将这些图像保存到服务器,然后再次加载它们(作为SVG元素的innerHTML)。使用 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,它将失败,并且脚本返回 403(禁止)。不幸的是,我有点想传递给它数据 URI。在某些情况下,小图像放置在 SVG 中,在几乎所有情况下,SVG 中都嵌入了字体作为 base64 数据 URI。

我从谷歌搜索中发现的一点点来看,这似乎是一个安全问题,以防止通过数据URI对服务器进行攻击。是否有一个标准的替代方案可供我使用,可以让我存储这些数据而不会让 Python/Apache/任何不高兴的人感到不安?

我不确定你的 svg 变量是什么样子的(我猜是"一些文本"+ URI)在任何情况下,您可能都希望使用 encodeURIComponent() 来编码 URI 中的特殊字符。

因此,您可以尝试将 svg 拆分为"文本部分"和"URI"部分(例如使用 split(),然后在 ajax 请求中使用更新的字典发送它,其中 svg 变量将是类似于"一些文本"+ encodeURIComponent('URI')