18 April 2005
This post may be outdated due to it was written on 2005. The links may be broken. The code may be not working anymore. Leave comments if needed.

描述

在网上用户注册是个很平常的东西,而注册后的用户资料修改也很平常。
记得有本书里写着“所有的用户都是贼。”
对用户表单输入的东西都要进行检查,每个网页脚本编写者都必须知道的事。

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


blog comments powered by Disqus