Journal(2005) | Blog(2006) | RandomLink | WhoAmI | LiveBookmark | HomePage

<<Previous: ACL(access control list) 的部分实现  >>Next: 符号表, local和my, * 与 \$

用 CGI::Untaint 检测 params

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 模块或它的思路。

<<Previous: ACL(access control list) 的部分实现  >>Next: 符号表, local和my, * 与 \$

Options: +Del.icio.us

Related items Created on 2005-04-18 12:02:43, Last modified on 2005-04-18 14:03:27
Copyright 2004-2005 All Rights Reserved. Powered by Eplanet && Catalyst 5.62.