CGI脚本无法创建文件

时间:2011-11-23 11:23:06

标签: perl file permissions cgi

我有以下CGI脚本,它启动一个模块,创建一个PNG文件,然后显示它。

#!/usr/bin/perl

use RRDs;
use CGI;

main:
{
my $cgi = new CGI;
my $filename = $cgi->param('filename');
print "Content-type: text/html\n\n";
my $curr_time = time();
my $start_time = $curr_time-3600;
RRDs::graph("$filename", "--start", "$start_time", "DEF:DiskC=c.rrd:DiskC:AVERAGE", "AREA:DiskC#0000FF");
my $err = RRDs::error();
print "<HTML><HEAD><TITLE>Disk C Utilization</TITLE></HEAD><BODY><H1>Disk C Utilization</H1><BR>$err<img src=\"$filename\"/></BODY></HTML>";
}

图表方法表示无法创建PNG文件。如果我在一个命令中运行这个脚本就好了,所以我认为这是一个权限问题。我已经在cgi-script文件夹上设置了chmod 755。你有什么建议?这与Apache2设置有关吗?

3 个答案:

答案 0 :(得分:3)

嗯,查看日志:) CGI Help Guide

$ filename不是您要使用的文件名,它可以是浏览器发送的任何内容,甚至是F:/bar/bar/bar/bar/bar/bar/bar/UHOH.png

您的服务器上不太可能存在F:/bar/bar/bar/bar/bar/bar/bar/UHOH.png

你想生成一个文件名,可能就像this

sub WashFilename {
    use File::Basename;
    my $basename = basename( shift );
    # untainted , only use a-z A-Z 0-9 and dot
    $basename = join '', $basename =~ m/([.a-zA-Z0-9])/g;
    # basename is now, hopefully, file.ext
    ## so to ensure uniqueness, we adulterate it :)
    my $id = $$.'-'.time;
    my( $file, $ext ) = split /\./, $basename, 2 ;
    return join '.', grep defined, $file, $id, $ext;
} ## end sub WashFilename

您还希望将文件放在将为图像提供服务的网络服务器目录中(不是cgi-bin)

并且您还希望使用File::Type::WebImages 使用魔法确定Web图像文件类型,并确保文件名具有相应的扩展名,因此您的服务器将发送相应的头

不要忘记chmod文件

答案 1 :(得分:1)

chmod 777解决了我的问题!

答案 2 :(得分:0)

不要将文档存储到文件中,除非您有理由:它很慢并且会引入各种潜在危险。

您似乎没有在不同的请求上重复使用相同的图像,这可能是这样的原因。

相反,请教您的CGI脚本直接输出图像,具体取决于它的调用方式(或写第二个图像)。