如果 GET 参数有斜杠字符,为什么 Python CGIHTTPServer on Ubuntu return 我的脚本?

Why does Python CGIHTTPServer on Ubuntu return my script if GET parameter has a slash character?

我正在尝试 运行 一些使用 CGIHTTPServer 的基本 CGI。我想传递一个带有特殊字符的参数(特别是 URL,但我认为这不是特别重要)。我的设置适用于 POST,但不适用于 GET。 GET returns 我的 CGI 脚本的内容。我做错了什么?

我在 Ubuntu 12.04 和 Python 2.7.3 上遇到了这个问题。 运行 Windows 或 Raspbian 上的相同代码工作正常。

这是我的例子。我的 HTTP 服务器在这里,如 server.py:

#!/usr/bin/python

import BaseHTTPServer
import CGIHTTPServer

PORT = 8888

server = BaseHTTPServer.HTTPServer
Handler = CGIHTTPServer.CGIHTTPRequestHandler

httpd = server(("", PORT), Handler)
httpd.serve_forever()

我的网页 testcgi.html 如下所示:

<html>
<body>
<form method="get" action="/cgi-bin/testcgi.py">
<textarea name="comments" cols="20" rows="2">
Type message to GET here...
</textarea>
<br/>
<input type="submit" value="Test CGI GET">
</form>
<form method="post" action="/cgi-bin/testcgi.py">
<textarea name="comments" cols="20" rows="2">
Type message to POST here...
</textarea>
<br/>
<input type="submit" value="Test CGI POST">
</form>
</body>
</html>

...我的 cgi 脚本是 testcgi.py,不确定这是否重要,但它是:

#!/usr/bin/python
#testcgi.py

import cgi

form = cgi.FieldStorage()

val1 = form.getvalue('comments')

print """
<html>
The form input is below...<br/>
</html>"""
print val1

我得到的输出(运行ning server.py on Ubuntu)如下。 GET 或 POST 输入 "Hello Goodbye":

The form input is below...
Hello Goodbye 

POST 输入 "Hello/Goodbye":

The form input is below...
Hello/Goodbye 

GET 输入 "Hello/Goodbye" returns 文件的内容 testcgi.py 如上。

据我所知,其他特殊字符(\ : % & 等等)都可以。

您重新发现您 运行 的旧 Python 版本存在安全问题。参见issue #21766; Python 2.7.6 和更新版本包含修复。

CGIHTTPServer.CGIHTTPRequestHandler.is_cgi() 方法在检查 URL 路径是否是被引用的 CGI 脚本之前不对 URL 路径进行解码。

错误报告包含一个变通方法,但请注意,自 2.7.3 发布以来,该模块已在 之前修复了多个相关错误,因为该安全问题已被报告.您可能只想从 Python mercurial 存储库中获取 latest revision;自 2.7.3 于 2013 年 4 月 9 日被标记以来,还有其他几个修复你会想要的。