【问题标题】:Perl: Data Input Module Not WorkingPerl:数据输入模块不工作
【发布时间】:2013-07-30 22:22:47
【问题描述】:

以下是我正在运行的两个文件的内容:
安全.cgi 我的模块.pm

MyModule.pm 中的“sub scrub{}”子例程是 Secure.cgi 中的一个子例程,但我想这样做 而是将其作为单独的模块运行。

作为 Secure.cgi 中的一个子程序,“sub scrub”工作得很好,但是当我把它移到 MyModule.pm,它不起作用 - 无疑是因为我调用它不正确,并且 模块中可能有错误。

这是我第一次尝试创建模块。 “打印”功能在测试时工作正常 MyModule.pm,所以我知道它已正确安装。

我们将不胜感激任何好的反馈。

SECURE.CGI
#!/usr/bin/perl

use MyModule;

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

### DATA VALIDATION IN MYMODULE.PM IS NOT OCCURRING#######  
$value = MyModule->scrub;
##########################################################

##### THIS WORKED WHEN "SCRUB" WAS EMBEDDED IN THIS SCRIPT #######  
##&scrub;

$userdata{$name} = $value;
}

$id1=$userdata{id1};
$id2=$userdata{id2};

print "Content-type:text/html\r\n\r\n";
print" 
<BR>
<Table align=center width=1000 border=1 cellpadding=4 cellspacing=0>
<TR><TD align=center>
<form action=\"http://###myserver###\" method=post>
<table border=1 bgcolor=#EAEAEA>
<TR><TD align=center colspan=3><B>Input Form</b></td></tr>
<TR><TD align=center><b>ID1</b><BR><input type=text name=id1></td></tr>
<TD align=center><b>ID2</b><BR><input type=text name=id2></td></tr>
<TD align=center><input type=submit value=submit name=submit></td></tr>
</table>
</form>
<BR>
<table border=1 bgcolor=#EAEAEA >
<TR><TD align=center><B>Form Output</b></td></tr>
<TR><TD align=center><b>ID1</b></td></tr>
<TR><TD bgcolor=white align=center>&nbsp;  $id1</td></tr>
<TR><TD align=center><b>ID2</b></td></tr>
<TR><TD bgcolor=white align=center>&nbsp;  $id2</td></tr>
</table>

</TD></TR></table>
<BR>
</body>  </html>"; 
=======================================

MYMODULE.PM
package MyModule;

sub scrub {
$value =~ s/.html|.htm|.cgi|.php//g;    
$value =~ s/\///g;
$value =~ s/&|$|@|'|"|<|>|\^|\(|\)|=//g;
$value =~ s/onmouseup|onreset|onselect|onsubmit|onunload//g;    
return $value;
}
1;

【问题讨论】:

  • 你好,1993 年的时间旅行者!
  • 求助。始终use strict; use warnings;use CGI;不要滚动自己的解码。阅读 Perl 教程(关键字:词法变量、heredocs、子程序参数)。
  • 我能想到几种有趣的方法来破坏 scrub 函数。
  • 我也可以。你看到的并不是全部;有更多代码可以过滤错误输入;我认为没有理由发布所有内容。

标签: perl perl-module


【解决方案1】:

代码有很多错误,我不知道从哪里开始。我会把关于风格和技术的告诫留给花生画廊。

问题在于子例程使用了外部范围的变量,但是当子例程移动到不同的包中时,这种情况就消失了。改变子例程,让它接受一个参数。

【讨论】:

  • 不幸的是,这段代码所属的实体需要它,原因我不会在这里讨论。我个人的偏好是使用“使用 CGI”并将验证正则表达式保留在子例程中,但这不是我的选择。你有这个论点的简单例子吗?
  • sub scrub { my ($value) = @_; …………… $value = MyModule-&gt;scrub($value);
  • 非常感谢。这是一个简单的修复: subscrub { $value = $_[1];等
猜你喜欢
  • 1970-01-01
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 2016-11-08
  • 2021-07-08
相关资源
最近更新 更多