Category: Modules Keywords: CGI::Untaint
描述
在网上用户注册是个很平常的东西,而注册后的用户资料修改也很平常。记得有本书里写着“所有的用户都是贼。”
对用户表单输入的东西都要进行检查,每个网页脚本编写者都必须知道的事。
用 CGI::Untaint 的好处是减少代码编写和代码重用。
如果使用 Class::DBI 的话,强烈建议使用 Class::DBI::FromCGI
Example hooray
假设有个注册表单(还有个编辑表单,代码类似):
<form action='http://localhost/cgi-bin/register.pl' method='post'>
UserName: <input type='text' name='user'><br>
Password: <input type='password' name='pwd'><br>
Email: <input type='text' name='email'><br>
HomePage: <input type='text' name='homepage'><br>
ICQ: <input type='text' name='icq'><br>
QQ: <input type='text' name='qq'><br>
<input type='submit'></form>
还有些东西可以自己加进去。register.pl 的代码如下,edit.pl 的代码可以复用此代码。
#!/usr/bin/perl
use strict;
use warnings;
use CGI qw/:cgi/;
use CGI::Carp qw(fatalsToBrowser);
use CGI::Untaint;
use lib 'E:/Fayland/cgi-bin/'; # where My::Untaint place
my $q = new CGI;
print $q->header;
my $handler = CGI::Untaint->new( {
INCLUDE_PATH => 'My::Untaint',
}, $q->Vars );
my $username = $handler->extract(-as_abc => 'user');
my $pwd = $handler->extract(-as_pwd => 'pwd');
my $email = $handler->extract(-as_email => 'email');
my $homepage = $handler->extract(-as_url => 'homepage');
my $icq = $handler->extract(-as_number => 'icq');
my $qq = $handler->extract(-as_number => 'qq');
package My::Untaint::abc;
use strict;
use base 'CGI::Untaint::object';
sub _untaint_re { qr/^([-\w]{4,10})$/ }
1;
package My::Untaint::pwd;
use strict;
use base 'CGI::Untaint::object';
sub _untaint_re { qr/^(\w+)$/ }
1;
package My::Untaint::number;
use strict;
use base 'CGI::Untaint::object';
sub _untaint_re { qr/^(\d+)$/ }
1;
如果满足则 $homepage 等为其值,不满足条件则为空。这是最原始的 CGI::Untaint, 写起来并不是很简单或很有用途。但可以如 Class::DBI::FromCGI 那样使用 CGI::Untaint 模块或它的思路。