我有一个html文件,它将接受并发送登录名和密码.它被发送到login.cgi文件.
**
**
<form method="POST" action="login.pl">
<table >
<tr>
<td>Username </td>
<td bgcolor="lightgrey"><input type="text" name="usr" size="20"></td>
</tr>
<tr>
<td>Password </td>
<td bgcolor="lightgrey"><input type="password" name="pwd" size="20"></td>
</tr>
<tr>
<td><input type="submit" id ="Login" value="Login" name="login"/> </td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
**
**
#!/usr/bin/perl
# login.pl
use CGI;
use CGI::Carp qw/fatalsToBrowser warningsToBrowser/;
use CGI::Session ( '-ip_match' );
$q = new CGI;
$usr = $q->param('usr');
$pwd = $q->param('pwd');
if($usr ne '')
{
# process the form
if($usr eq "demo" and $pwd eq "demo")
{ …Run Code Online (Sandbox Code Playgroud) 为什么cgi脚本必须保留在cgi-bin文件夹中?
与public_html文件夹和cgi-bin文件夹中的插入python脚本(或php脚本或任何其他脚本)有什么区别?
我不明白: -
我想知道是否有任何方法可以使用Bash(Shell Script)通过CGI制作网页,如Perl,C++等.如果有任何办法,我可以在哪里找到一个好的免费托管服务?
我想在perl中使用cgi-bin文件夹中的文件,我想从index.cgi中调用它们当我这样做时:使用cgi-bin/file_name它不起作用,我该怎么做?
我在Debian Lenny机器上有2个不同的Web服务器.一个运行FastCGI(TRAC),另一个Web服务器运行PHP和一些CGI脚本.所以我目前启用了2个Apache2模块(cgi和fcgi)以及相应的2个vhosts设置.我对这两个模块同时运行没有其他特别的兴趣.
所以我想保持只运行Apache fastcgi模块,因为它看起来更有效率.
您能否确认以下评估是对还是正确?
1-我将无法做什么/更改TRAC站点(已经运行fcgi)
2-我必须调整其他Web服务器vhost以使用fastcgi脚本的处理程序设置
3-我将只需要更改perl模块从"使用CGI"到"使用CGI :: Fast"
4-我将能够保留perl现有CGI脚本的其余部分
而不需要其他更改5-我不需要使用CGI :: Apache但CGI: :Web服务器脚本中的FastCGI(i/o当前CGI模块)
我希望我的观点很明确,因为它对我来说有点陌生......
谢谢
编辑:
thx为Naveed和J-16的提示,
这是我做的,如果它可以帮助其他人让它工作:
哼,用CPAN安装CGI :: Fast,然后它运行得更好..
在Debian上已经安装了libperl
perl -MCPAN -e shell
cpan> install CGI::Fast
Run Code Online (Sandbox Code Playgroud)将文件名从*.cgi更改为*.fcgi,
编辑:修改文件上传代码,因为初始脚本不再起作用(仍然不明白为什么),所以我不得不用这样一个替换while循环:
open(FILE,">$upload_dir/$file_name")
while ($bytes_count = read($file_query,$buffer,2096)) {
$size += $bytes_count;
print FILE $buffer;
}
close(FILE);
Run Code Online (Sandbox Code Playgroud)完成.
世界还不完美,但终于有效了.
我是Perl CGI编程的新手,并且有一些问题.目前我有1个HTML页面和一堆perl页面.用户从HTML页面开始输入他们的姓名和地址.然后,此表单调用Perl CGI文件.现在,当这个Perl文件执行时,它会生成一些用户将看到另一个页面的HTML.现在在perl文件生成的HTML中,还有另一个调用另一个CGI脚本的表单.这继续,所以我基本上每个页面都有一个Perl CGI文件.
这是用CGI做事的正确方法吗?
我遇到的问题是我不知道如何分享所有这些perl文件的信息,因为它们只是通过表单的动作相互通信.
我有一个小购物车,因此需要能够从多个页面初始化,获取和设置它的内容.
如上所述,我如何在文件之间共享数据?
它现在输出这样的东西:
?name=fred;age=24;favorite_color=3
Run Code Online (Sandbox Code Playgroud)
如何指示输出?name=fred&age=24&favorite_color=3呢?
我是Perl和复杂正则表达式的新手.我的意思是我之前使用过正则表达式的*,但没有比这更复杂.在下面的脚本中,我知道有一个非常大的安全漏洞,可以在其中注入和运行perl代码,以便即使是shell也可以执行任何命令.在试图阻止这种注射时,我逐渐意识到正则表达式比我想象的要困难得多.我正在使用的书说要使用它的组合
die "The specified user contains illegal characters!"
unless($user =~/^\w+$/);
Run Code Online (Sandbox Code Playgroud)
我相当肯定这意味着来自用户的输入必须以多个单词开头,但我不确定这是如何阻止注入命令的,因为它从不检查分号.我认为除非条款应该更像
unless($user=~/^\w+;\w$/);
Run Code Online (Sandbox Code Playgroud)
但是,似乎都不起作用.对此的任何帮助都会很棒,因为我真的很想理解这一点.谢谢!
#!/usr/bin/perl
use CGI;
use CGI::Carp qw(fatalsToBrowser);
$q = new CGI;
print $q->header,
$q->start_html('Finger User'),
$q->h1('Finger User'),
print "<pre>";
$user = $q->param("user");
#die "the specified user contains illegal characters!"
# unless ($user =~ /ls/);
if (!($user =~ /^\w*;\w*$/)){
print `/usr/bin/finger -s $user`;
}
print "</pre>";
print $q->end_html;
Run Code Online (Sandbox Code Playgroud) 我有一个输入文件,我需要直接打印到一个HTML页面.
我确实$inputfile =~ s/\n/<br>/g;在将这个$ inputfile打印到html时,是否还有其他特殊字符,我应该注意除了<和>之外的其他特殊字符?
我在OpenWrt 12.09上运行uhttpd.我在/ www/cgi-bin/test上有一个shell脚本,如下所示:
#!/bin/sh
echo "Content-type: text/html"
echo "<p>It works!</p>"
Run Code Online (Sandbox Code Playgroud)
我通过这样做给了文件执行权限chmod +x.所有者是root,uhttpd以root身份运行.
现在,当我去的时候,http://192.168.1.1/cgi-bin/test我得到一个错误:
The CGI process did not produce any response
Run Code Online (Sandbox Code Playgroud)
系统或内核日志中没有错误.
我可以去http://192.168.1.1/cgi-bin/luci获取LuCI登录页面,因此其他CGI脚本正在运行.该文件具有不同的shebang(#!/usr/bin/lua)但两个脚本具有相同的权限和所有者.
我究竟做错了什么?