标签: cgi

为什么要避免使用LAMP托管的Python CGI?

我已经使用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文件之外看一些完全不同的范例吗?

有关

php python .htaccess cgi

22
推荐指数
2
解决办法
5609
查看次数

Perl CGI入侵了吗?但我做的一切都是正确的

我刚刚在我的一个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)

perl cgi exploit

21
推荐指数
1
解决办法
3403
查看次数

分段上传表格:订单有保证吗?

看来,当我使用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服务器端.

html cgi http cross-browser mime-types

21
推荐指数
1
解决办法
4463
查看次数

共享主机环境中的sys_get_temp_dir

注意:这也适合超级用户.

我在一个共享主机上用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 cgi shared-hosting apache2

21
推荐指数
4
解决办法
1万
查看次数

哪个C++库用于CGI编程?

我正在用编译语言做一些工作(为了好玩)来对PHP运行一些简单的测试和基准测试.

基本上我想看看其他人用于C++ CGI编程的内容.(包括后端数据库,如mysql ++或其他)

c++ cgi

20
推荐指数
2
解决办法
2万
查看次数

这几天使用的CGI脚本是什么?

我对通用网络编程语言的速度非常高兴,但我现在正在使用的工具之一是CGI.我只能说CGI脚本很慢.

CGI今天仍然常用吗?如果不是,它取而代之的是什么?
是否有任何利基功能,CGI仍然存在并积极使用?

cgi web-applications

20
推荐指数
3
解决办法
1万
查看次数

如何在CGI脚本中访问HTTP标头请求?

我已经将Perl用于小型应用程序和测试代码,但我是网络和CGI的新手.

我得到了如何制作请求的标题(使用CGI.pm并打印header()函数的结果),但是无法找到有关如何访问发送到我的CGI脚本的标头的任何信息.有人能指出我正确的方向吗?

这可能是来自这样的请求:

curl http://127.0.0.1:80/cgi-bin/headers.cgi -H "HeaderAttribute: value"

perl cgi http-headers

20
推荐指数
3
解决办法
3万
查看次数

我应该在python MySQLdb模块中重用游标

我正在编写一个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 mysql cgi

20
推荐指数
1
解决办法
1万
查看次数

在Python 3 CGI脚本中设置编码

在编写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 unicode cgi python-3.x

20
推荐指数
2
解决办法
5470
查看次数

使用python动态地将matplotlib图像提供给Web

这个问题在这里以类似的方式提出,但答案是我的头脑(我是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集成.

python cgi matplotlib

20
推荐指数
4
解决办法
2万
查看次数