我已经使用PHP多年了.最近我遇到过很多论坛帖子,说明PHP已经过时,现代编程语言更容易,更安全等等.
所以,我决定开始学习Python.因为我习惯使用PHP,所以我刚开始通过上传.htaccess文件来构建页面:
addtype text/html py
addhandler cgi-script .py
Run Code Online (Sandbox Code Playgroud)
然后,我的示例页面如下所示:
#!/usr/bin/python print "content-type: text/html\n\n" print "html tags, more stuff, etc."
这很好用.但是,我在帖子中发现了一条评论说CGI不是使用Python的最佳方式.当然,它没有提到什么是最好的方法.
为什么使用CGI不是使用Python的最佳方式?有什么选择?
有没有其他方法来设置一个简单的Python网站?我应该在.htaccess和.py文件之外看一些完全不同的范例吗?
我刚刚在我的一个web目录中发现了一些奇怪的PHP文件.他们原来是垃圾邮件发送者利用文件.
他们自2006年以来一直在那里,大概是我使用我的CGI剧本进行高调的捐赠活动.并且文件放在脚本的可写目录中,因此我怀疑我的脚本可能已被某种方式利用.
但是我正在使用Perl"污点检查",严格等等,而且我永远不会将查询数据传递给shell(它永远不会调用shell!)或使用查询数据为OPEN生成文件路径...我只我在脚本中直接指定的OPEN文件.我确实将查询数据INTO写入文件作为文件内容传递,但据我所知,这并不危险.
我盯着这些脚本看不到任何东西,我研究了所有标准的Perl CGI漏洞.当然,他们可能以某种方式获得了我的托管帐户的密码,但事实上这些脚本放在我的CGI脚本的数据目录中让我怀疑脚本.(此外,他们"以某种方式"获取我的密码是一个更可怕的解释.)此外,在那段时间,我的日志显示许多"警告,从非PayPal地址收到的IPN"消息,这些IP来自俄罗斯.因此,似乎有人至少在尝试破解这些脚本.
涉及两个脚本,我将它们粘贴在下面.任何人都可以看到任何可能被利用来编写意外文件的东西?
这是第一个脚本(用于接收PayPal IPN并跟踪捐赠,还跟踪哪个网站产生的捐款最多):
#!/usr/bin/perl -wT
# Created by Jason Rohrer, December 2005
# Copied basic structure and PayPal protocol code from DonationTracker v0.1
# Script settings
# Basic settings
# email address this script is tracking payments for
my $receiverEmail = "receiver\@yahoo.com";
# This script must have write permissions to BOTH of its DataDirectories.
# It must be able to create files in these directories.
# On most web servers, this means the directory must …Run Code Online (Sandbox Code Playgroud) 看来,当我使用html表单制作"Content-Type:multipart/form-data"POST请求时,这些字段始终按照HTML中列出的顺序显示.在实践中,所有浏览器都这样做吗?
希望了解这一点的主要动机是,我可以对表单数据进行服务器端验证,而不需要将整个 HTTP请求缓存在RAM中.磁盘第一.
我知道CGI,PHP等通常不会做任何事情直到上传完成.可能是因为RFC 2388第5.5节通过说订单没有定义来解决这个问题.我正在使用高度自定义的thttpd分支,并处理内置于服务器内置的C代码.所以我不关心大多数服务器做什么.
我想知道的是,如果我走出困境并下订单,我会被这个假设烧掉吗?
以此表格为例:
<form id="formUpload"
target = "uploadTarget"
method = "post"
action = "/bin/upload"
enctype= "multipart/form-data" >
<input type="hidden" id="inUser" name="user" />
<input type="hidden" id="inDest" name="dest"/>
<input type="file" id="inFile" name="file" />
<input type="button" value="Upload" onclick="uploadFile();" />
<iframe id="uploadTarget" name="uploadTarget" src="" style="width:0;height:0;border:0px"/>
</form>
Run Code Online (Sandbox Code Playgroud)
'uploadFile()'函数将在调用submit()之前填写user和dest字段.我想recv()在整个HTTP请求体之前验证用户和dest服务器端.
注意:这也适合超级用户.
我在一个共享主机上用apache2 mpm itk和open_basedir设置PHP 5.3.10,每个用户可能看不到或更改另一个用户的文件.在apache2 vhost设置中,我添加了相应的条目来限制用户:
AssignUserId userA userA
php_admin_value open_basedir /home/userA/www/
php_admin_value upload_tmp_dir /home/userA/www/tmp/
php_admin_value session.save_path /home/userA/www/tmp/
SetEnv TMPDIR /home/userA/www/tmp/
Run Code Online (Sandbox Code Playgroud)
现在,第一行将linux用户设置为用于apache2,接下来的三行将basedir,upload目录和session savepath定义在用户目录中.我会在一秒钟内回到最后一行.
现在出现问题:sys_get_temp_dir()应该回放php的临时目录,这是/ tmp在linux系统上的默认目录.出于安全原因,此目录应驻留在userA的open_basedir中.根据5.3.10的php-source,sys_get_temp_dir()-function使用环境变量TMPDIR来获取这个目录:
// php-src/main/php_open_temporary_file.c:217-219
/* On Unix use the (usual) TMPDIR environment variable. */
{
char* s = getenv("TMPDIR");
Run Code Online (Sandbox Code Playgroud)
这就是上面配置中的第五行应该做的事情.但是,sys_get_temp_dir()只返回全局系统目录,忽略环境变量(在$ _SERVER中完美设置,也可以通过查看phpinfo()).
这导致一些令人讨厌的错误,依赖于各种软件sys_get_temp_dir(),因为该目录不在open_basedir设置范围内.我试图将变量直接设置为$ _ENV和$ _SERVER而不改变行为.我试过putenv('TMPDIR=/home/userA/www/tmp')没有改变.
但是,我可以通过将变量定义到/ etc/apache2/envvars来更改输出 - 这对我来说没用,因为我希望每个VHOST都有自己的临时文件夹.
到目前为止,我发现的唯一解决方案是sys_get_temp_dir()通过像runkit这样的扩展来覆盖内部,并通过auto_prepend_file强制包含它.但是这个解决方案太脏了,我简直无法相信,周围没有更好的解决方案.
所以,我的问题:有没有办法改变sys_get_temp_dir()在apache2 vhost设置中设置的结果,而不用runkit重新实现该功能?
编辑: apache版本是2.2.22,我目前使用mod_php.由于我必须手动添加所有用户,因此也可以使用fcgi或类似的设置.
我正在用编译语言做一些工作(为了好玩)来对PHP运行一些简单的测试和基准测试.
基本上我想看看其他人用于C++ CGI编程的内容.(包括后端数据库,如mysql ++或其他)
我对通用网络编程语言的速度非常高兴,但我现在正在使用的工具之一是CGI.我只能说CGI脚本很慢.
CGI今天仍然常用吗?如果不是,它取而代之的是什么?
是否有任何利基功能,CGI仍然存在并积极使用?
我已经将Perl用于小型应用程序和测试代码,但我是网络和CGI的新手.
我得到了如何制作请求的标题(使用CGI.pm并打印header()函数的结果),但是无法找到有关如何访问发送到我的CGI脚本的标头的任何信息.有人能指出我正确的方向吗?
这可能是来自这样的请求:
curl http://127.0.0.1:80/cgi-bin/headers.cgi -H "HeaderAttribute: value"
我正在编写一个python CGI脚本来查询MySQL数据库.我正在使用MySQLdb模块.由于数据库将被重复查询,我写了这个函数....
def getDatabaseResult(sqlQuery,connectioninfohere):
# connect to the database
vDatabase = MySQLdb.connect(connectioninfohere)
# create a cursor, execute and SQL statement and get the result as a tuple
cursor = vDatabase.cursor()
try:
cursor.execute(sqlQuery)
except:
cursor.close()
return None
result = cursor.fetchall()
cursor.close()
return result
Run Code Online (Sandbox Code Playgroud)
我的问题是......这是最好的做法吗?我应该在我的函数中重用我的光标吗?例如.哪个更好...
def callsANewCursorAndConnectionEachTime():
result1 = getDatabaseResult(someQuery1)
result2 = getDatabaseResult(someQuery2)
result3 = getDatabaseResult(someQuery3)
result4 = getDatabaseResult(someQuery4)
Run Code Online (Sandbox Code Playgroud)
或者完全取消getDatabaseeResult函数并执行类似的操作.
def reusesTheSameCursor():
vDatabase = MySQLdb.connect(connectionInfohere)
cursor = vDatabase.cursor()
cursor.execute(someQuery1)
result1 = cursor.fetchall()
cursor.execute(someQuery2)
result2 = cursor.fetchall()
cursor.execute(someQuery3)
result3 = cursor.fetchall()
cursor.execute(someQuery4)
result4 …Run Code Online (Sandbox Code Playgroud) 在编写Python 3.1 CGI脚本时,我遇到了可怕的UnicodeDecodeErrors.但是,在命令行上运行脚本时,一切正常.
看来open()并print()使用返回值locale.getpreferredencoding()来了解默认使用的编码.在命令行上运行时,该值应为"UTF-8".但是当通过浏览器运行脚本时,神秘地将编码重新定义为"ANSI_X3.4-1968",这似乎只是普通ASCII的一个奇特名称.
我现在需要知道如何在所有情况下使用'utf-8'作为默认编码来运行cgi脚本.我的设置是Debian Linux上的Python 3.1.3和Apache2.系统范围的语言环境是en_GB.utf-8.
这个问题在这里以类似的方式提出,但答案是我的头脑(我是python和web开发的新手),所以我希望有一个更简单的方法或者可以用不同的方式解释.
我正在尝试使用matplotlib生成一个图像并在没有先将文件写入服务器的情况下提供它.我的代码可能有点傻,但它是这样的:
import cgi
import matplotlib.pyplot as pyplot
import cStringIO #I think I will need this but not sure how to use
...a bunch of matplotlib stuff happens....
pyplot.savefig('test.png')
print "Content-type: text/html\n"
print """<html><body>
...a bunch of text and html here...
<img src="test.png"></img>
...more text and html...
</body></html>
"""
Run Code Online (Sandbox Code Playgroud)
我认为不是做pyplot.savefig('test.png'),而是应该创建一个cstringIO对象,然后执行以下操作:
mybuffer=cStringIO.StringIO()
pyplot.savefig(mybuffer, format="png")
Run Code Online (Sandbox Code Playgroud)
但我很失落.我见过的所有例子(例如http://lost-theory.org/python/dynamicimg.html)都涉及到类似的事情.
print "Content-type: image/png\n"
Run Code Online (Sandbox Code Playgroud)
我不知道如何将它与我已经输出的HTML集成.
cgi ×10
python ×4
perl ×2
php ×2
.htaccess ×1
apache2 ×1
c++ ×1
exploit ×1
html ×1
http ×1
http-headers ×1
matplotlib ×1
mime-types ×1
mysql ×1
python-3.x ×1
unicode ×1