如果GET参数有斜杠字符,为什么Ubuntu上的Python CGIHTTPServer会返回我的脚本?

时间:2015-09-20 10:13:45

标签: python ubuntu cgi

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

我在使用Python 2.7.3的Ubuntu 12.04上遇到了这个问题。在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

我得到的输出(在Ubuntu上运行server.py)如下。 GET或POST输入&#34; Hello Goodbye&#34;:

The form input is below...
Hello Goodbye 

POST输入&#34; Hello / Goodbye&#34;:

The form input is below...
Hello/Goodbye 

输入&#34; Hello / Goodbye&#34;如上所述返回文件testcgi.py的内容。

据我所知,其他特殊字符(\:%&amp;等等)都可以正常工作。

1 个答案:

答案 0 :(得分:0)

您已经重新发现了正在运行的旧版Python的安全问题。见issue #21766; Python 2.7.6和更新版本包括修复程序。

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

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