我试图用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;等等)都可以正常工作。
答案 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以来,还有其他一些修复方法。