我在我的CGI :: Application web-app中有一个运行模式,我希望能够从命令行触发,这样我就可以自动执行它.从web-app的角度来看,它会进行一些处理,然后通过电子邮件发送结果.
从Web界面调用时,它会传递一组参数(电子邮件地址,要运行的查询,日期等),因此需要传入这些参数.
如何构建对CGI :: Application应用程序的调用,就像我从Web上运行它一样?
我的网络应用程序mod_perl使用CGI :: Application 在Apache上运行.我想提供生成文件的下载.在过去(在我们使用mod_perl和CGI :: App之前)我只是假设一个csv文件STDOUT生成它.现在我正在进行一些改进 - 使用Spreadsheet :: WriteExcel创建一个Excel电子表格 - 我似乎无法从文件句柄中打印出来.
sub export_list {
my $self = shift;
binmode(STDOUT);
my $str;
open my $fh, '>', \$str;
my $workbook = Spreadsheet::WriteExcel->new($fh);
my $worksheet = $workbook->add_worksheet();
$worksheet->write_col(0,0, ['some','data','here']);
warn $str;
return $str;
}
Run Code Online (Sandbox Code Playgroud)
输出只是一个空白响应,警告也是空白.
我用来将电子表格写入文件句柄的方法非常直接来自文档,所以我认为问题是由于我的一些CGI :: App noobery.文档建议的文件句柄方法,并mod_perl证明也没有结果.
我想我应该提一下我在Windows上运行,而我目前的解决方法是创建一个文件并为用户提供一个链接.然而,这会带来更多问题,例如清除目录以及何时执行此操作,以及访问生成的文件的身份验证.
建议?尖刻的批评?
我正在使用CGI :: Application构建一个Perl应用程序来显示软件工具,并希望允许用户在工具上添加评级和注释.理想情况下,用户需要注册才能发布.我确信这是一个相当普遍的要求,并且必须有现成的"开箱即用"解决方案,我可以使用这些解决方案来节省一些编码和重新发明轮子.如果没有,我有三种可能的解决方案:
1)在此处扩展代码:http://www.perlmonks.org/?node_id = 622071以添加认证系统的缺失部分
2)利用我们的维基; 让用户登录并在wiki上发布评论或者只是利用登录系统来确保只有已注册的wiki用户才能发帖
3)使用其他一些身份验证协议并从头开始自己动手.
有没有人对这些选项有任何想法或经验?
我们在我们的产品上运行Burp Suite并发现了一些安全漏洞。该工具检测到一些易受跨站请求伪造攻击 (CSRF) 攻击的 CGI 文件。
像往常一样,我在 CPAN 上搜索 CSRF 保护模块并找到了CGI::Application::Plugin::ProtectCSRF。
我想知道如何以通用方式将此模块集成到我们的应用程序中?我不清楚文档。如何配置此模块并进行最小更改以确保整个应用程序免受 CSRF 的影响。
我还遇到了mod_csrf(一个防止 CSRF 的 Apache 模块)。在 apache 配置文件中安装此模块和设置是否足以防止 CSRF?
<VirtualHost>
CSRF_Enable on
CSRF_Action deny
CSRF_EnableReferer off
</VirtualHost>
Run Code Online (Sandbox Code Playgroud) 我正在尝试部署一个CGI::Application通过Nginx使用的Perl应用程序,使用FastCGI在它们之间进行通信.
Nginx不断返回"502 Bad Gateway",错误日志填写如下:
2015/02/03 12:40:03 [错误] 11209#0:*2上游过早关闭连接,同时从上游读取响应头,客户端:10.1.1.23,服务器:www.example.com,请求:"GET/test .fcgi HTTP/1.1",上游:" http://127.0.0.1:5001/test.fcgi ",主持人:"www.example.com"
这是Nginx站点配置:
upstream @perl {
# I had been trying to use a socket, but I switched to TCP to try WireShark.
# server unix:/var/run/nginx/my-app.sock;
server 127.0.0.1:5001;
}
server {
listen 80;
listen 443 ssl;
server_name www.example.com;
root /home/example/sites/www.example.com;
location ~* \.fcgi(/|$) {
fastcgi_split_path_info ^(.+?\.cgi)(/.*)$;
# (I know that the `if` is old-style, and that `try_files` is better, but that shouldn't affect whether it works or not.) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用CGI :: Application处理Perl程序中的上传文件.我需要获取上传文件的内容类型.从我的阅读,以下应该工作,但它不适合我:
my $filename = $q->param("file");
my $contenttype = $q->uploadInfo($filename)->{'Content-Type'};
Run Code Online (Sandbox Code Playgroud)
事实证明,$q->uploadInfo($filename)返回undef.那样做$q->uploadInfo("file").
有任何想法吗?
谢谢!