我正在使用Python脚本处理请求的PDF,然后再将它们呈现给浏览器。 PDF的路径作为URL参数给出。尝试打开PDF之前的一个安全措施是确保路径在webroot中,并且文件以“.pdf”结尾。为此,我将请求的路径拆分为其目录数组和文件名。这在大多数情况下都能正常工作......
但是,至少有一个可能的路径在目录名中包含一个&符号。当处理器到达此目录时,它会在&符号处短路并报告所请求的文件不是PDF。我正在转储目录数组,我可以看到包含带&符号的目录名的元素在它之前被截断:'a& b'变成'a'。这是测试文件扩展名的代码:
if splitpath[len(splitpath) - 1][-4:].lower() != '.pdf':
print "Content-type: text/plain\n"
print "Requested file is not a PDF."
print splitpath
sys.exit()
如果我尝试请求?file=/alwaysbrand/pdfs/a & b/myfile.pdf
,则此代码返回:
Requested file is not a PDF.
['var', 'www', 'alwaysbrand', 'pdfs', 'a ']
任何想法如何让Python在遇到&符时阻止窒息?不幸的是,在这种情况下,重命名目录不是一种选择。
编辑:在做其他任何事情之前,我已经尝试使用urllib.unquote_plus分配路径,但它仍然停止在&符号处解析:
fullpath = urllib.unquote_plus(os.path.abspath(form["file"].value[1:]))
print "Content-type: text/plain\n"
print fullpath
在传递/var/www/alwaysbrand/pdfs/a
时返回?file=/pdfs/a%20&%20b/myfile.pdf
(空格正确不加引号,而不是&符号或其后的任何内容)。