Form Data Var.
#!/usr/bin/perl -wT
##################################################
# PROGRAM: FORM PROCESSING AND VERIFICATION
# DESCRIPTION: THIS CGI WILL VERIFY USER INPUT AGAINST PREDEFINED CRITERIA
##################################################
### OPTIONS ###
###############
use strict;
### VARIABLE DECLARATIONS ###
#############################
my %ERRORS; #HOLD ERRORS FOR REQURIED FIELD CHECK
my %FORM; #WILL HOLD ALL FORM DATA
#HOLDS ALL FORM FIELDS
my %FIELDS = (
“username” => “Username”,
“password” => “Password”,
“repassword” => “Re-Type-Password”,
“fname” => “First Name”,
“lname” => “Last Name”,
“street” => “Street”,
“city” => “City”,
“province” => “Province”,
“country” => “Country”,
“postal” => “Postal/ZipCode”,
“email” => “E-Mail”,
“phone” => “Phone Number”
);
#HOLDS REG EXP’S MATCHING DESIRED INPUT FOR EACH FORM FIELD
my %PATTERNS = (
“username” => ‘^[A-Za-z0-9]{6,10}$’,
“password” => ‘^[A-Za-z0-9]{6,}$’,
“repassword” => “$FORM{password}”,
“fname” => ‘^[a-zA-Z]+(([\'\,\.\-][a-zA-Z])?[a-zA-Z]*)*$’,
“lname” => ‘^[a-zA-Z]+(([\'\,\.\-][a-zA-Z])?[a-zA-Z]*)*$’,
“street” => ‘^[0-9A-Za-z \.\,\'\-]{2,60}$’,
“city” => ‘^[A-Za-z \'\-]{2,60}$’,
“province” => ‘^[A-Za-z \'\-]{2,60}$’,
“country” => ‘^(Canada|USA)$’,
“postal” => ‘^(([0-9]{5}-[0-9]{4})|([0-9]{5})|([AaBbCcEeGgHhJjKkLlMmNnPpRrSsTtVvXxYy][0-9][A-Za-z][ ]?[0-9][A-Za-z][0-9]))$’,
“email” => ‘^(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,60})$’,
“phone” => ‘^[0-9]{3}-[0-9]{3}-[0-9]{4}$’
);
#DETERMINS THE PROCESS IN WHICH FORM FIELDS ARE PRINTED/PROCESSED
my @formSequence = (“username”, “password”, “repassword”, “fname”, “lname”, “street”, “city”, “province”, “postal”, “email”, “phone”);
### HTTP HEADER ###
###################
print “Content-Type: text/html;charset=ISO-8859-1\n\n”;
### XHTML PAGE HEADINGS ###
###########################
&startXHTML;
if ($ENV{REQUEST_METHOD} eq “POST”)
{
&readFormData;
if (&checkRequiredFields)
{
print “Form Data Validated Succesfully!”;
}
else
{
&printForm;
foreach (@formSequence)
{
print qq~$ERRORS{$_}<br>~;
}
}
}
else {
&printForm;
}
### XHTML FOOTER ###
####################
&endXHTML;
##############################################
###################### END OF MAIN PROGRAM ###
##############################################
### SUBROUTINES ###
###################
#THIS SUBROUTINE CHECKS THE USER INPUTE
#AND RETURNS 1 IF ALL INPUTS ARE CORRECT, OTHERWISE 0 IS RETURNED
sub checkRequiredFields
{
my $success = 1;
foreach (keys (%FIELDS))
{
if ($FORM{$_} !~ $PATTERNS{$_})
{
$ERRORS{$_} = “ERROR: $FIELDS{$_} IS MISSING OR INCORRECT FORMAT\n”;
$success = 0;
}
}
if ($FORM{repassword} ne $FORM{password})
{
$ERRORS{repassword}=”ERROR: The Passwords Do NOT Match\n”;
$success = 0;
}
return $success;
}
#PRODUCE FORM WITH OPTIONAL ERROR MESSAGES
sub printForm
{
print qq~
<form name=”form1″ method=”post” action=”fdataverif.cgi”>
<p align=”center”>Welcome the FORM DATA VERIFICATION LAB</p>
<table width=”53%” border=”0″ align=”center” cellpadding=”4″>
<tr>
<td><div align=”right”>Username: </div></td>
<td><div align=”left”>
<input name=”username” type=”text” id=”username” value=”$FORM{username}”>
(6-10 Alphanumeric Characters)</div></td>
</tr>
<tr>
<td><div align=”right”>Password: </div></td>
<td><div align=”left”>
<input name=”password” type=”password” id=”password”>
(>=6 Alphanumeric Characters)</div></td>
</tr>
<tr>
<td><div align=”right”>Re-type Password: </div></td>
<td><div align=”left”>
<input name=”repassword” type=”password” id=”repassword”>
</div></td>
</tr>
<tr>
<td><div align=”right”>Firstname: </div></td>
<td><div align=”left”>
<input name=”fname” type=”text” id=”fname” value=”$FORM{fname}”>
</div></td>
</tr>
<tr>
<td><div align=”right”>Lastname: </div></td>
<td><div align=”left”>
<input name=”lname” type=”text” id=”lname” value=”$FORM{lname}”>
</div></td>
</tr>
<tr>
<td><div align=”right”>Street Address: </div></td>
<td><div align=”left”>
<input name=”street” type=”text” id=”street” value=”$FORM{street}”>
</div></td>
</tr>
<tr>
<td><div align=”right”>City: </div></td>
<td><div align=”left”>
<input name=”city” type=”text” id=”city” value=”$FORM{city}”>
</div></td>
</tr>
<tr>
<td><div align=”right”>State/Province: </div></td>
<td><div align=”left”>
<input name=”province” type=”text” id=”province” value=”$FORM{province}”>
</div></td>
</tr>
<tr>
<td><div align=”right”>Country: </div></td>
<td><div align=”left”>
<select name=”country” id=”country”>
<option value=”USA”>USA</option>
<option value=”CANADA”>CANADA</option>
</select>
</div></td>
</tr>
<tr>
<td><div align=”right”>Postal Code: </div></td>
<td><div align=”left”>
<input name=”postal” type=”text” id=”postal” value=”$FORM{postal}”>
(USA: 12345-1234; CANADA: A1A1A1)</div></td>
</tr>
<tr>
<td><div align=”right”>E-mail Address: </div></td>
<td><div align=”left”>
<input name=”email” type=”text” id=”email” value=”$FORM{email}”>
</div></td>
</tr>
<tr>
<td><div align=”right”>Phone Number: </div></td>
<td><div align=”left”>
<input name=”phone” type=”text” id=”phone” value=”$FORM{phone}” > ###-###-####
</div></td>
</tr>
<tr>
<td><div align=”right”>
<input type=”submit” name=”save” value=”Register”>
</div></td>
<td><div align=”left”>
<input type=”reset” name=”Submit2″ value=”Reset” >
</div></td>
</tr>
<tr>
<td><div align=”left”> </div></td>
</tr>
</table>
<p align=”center”>* – All fields are required</p>
</form>
~;
}
#THIS SUBROUTINE WILL GENERASTE XHTML-COMPLIANT PAGE HEADERS
sub startXHTML
{
print qq~
<?xml version=”1.0″ encoding=”iso-8859-1″?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<title>FORM DATA VERIFICATION</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-1″ />
</head>
<body>
~;
}
#THIS SUBROUTINE WILL GENERATE XHTML COMPLAITE FOOTERS
sub endXHTML
{
print qq~</body></html>\n~;
}
#PARSE THE FORM DATA
sub readFormData
{
# read(STDIN, my $input, $ENV{‘CONTENT_LENGTH’});
my $input = <>;
#BREAK THEDATA UP BY AMPERSANDS &&&&; AND STORE IT IN AN ARRAY
my @pairs = split(/&/, $input);
my ($name, $value);
#START A LOOP TO PROCESS FORM DATA
foreach (@pairs)
{
($name, $value) = split(/=/, $_);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(“C”, hex($1))/eg;
$FORM{$name} = $value;
}
}
#####################################
~; } } } else { &printForm; } ### XHTML FOOTER ### #################### &endXHTML; ############################################## ###################### END OF MAIN PROGRAM ### ############################################## ### SUBROUTINES ### ################### #THIS SUBROUTINE CHECKS THE USER INPUTE #AND RETURNS 1 IF ALL INPUTS ARE CORRECT, OTHERWISE 0 IS RETURNED sub checkRequiredFields { my $success = 1; foreach (keys (%FIELDS)) { if ($FORM{$_} !~ $PATTERNS{$_}) { $ERRORS{$_} = “ERROR: $FIELDS{$_} IS MISSING OR INCORRECT FORMAT\n”; $success = 0; } } if ($FORM{repassword} ne $FORM{password}) { $ERRORS{repassword}=”ERROR: The Passwords Do NOT Match\n”; $success = 0; } return $success; } #PRODUCE FORM WITH OPTIONAL ERROR MESSAGES sub printForm { print qq~
Welcome the FORM DATA VERIFICATION LAB
|
Username:
|
(6-10 Alphanumeric Characters)
|
|
Password:
|
(>=6 Alphanumeric Characters)
|
|
Re-type Password:
|
|
|
Firstname:
|
|
|
Lastname:
|
|
|
Street Address:
|
|
|
City:
|
|
|
State/Province:
|
|
|
Country:
|
USA CANADA
|
|
Postal Code:
|
(USA: 12345-1234; CANADA: A1A1A1)
|
|
E-mail Address:
|
|
|
Phone Number:
|
###-###-####
|
* – All fields are required
~; } #THIS SUBROUTINE WILL GENERASTE XHTML-COMPLIANT PAGE HEADERS sub startXHTML { print qq~ FORM DATA VERIFICATION ~; } #THIS SUBROUTINE WILL GENERATE XHTML COMPLAITE FOOTERS sub endXHTML { print qq~\n~; } #PARSE THE FORM DATA sub readFormData { # read(STDIN, my $input, $ENV{‘CONTENT_LENGTH’}); my $input = <>; #BREAK THEDATA UP BY AMPERSANDS &&&&; AND STORE IT IN AN ARRAY my @pairs = split(/&/, $input); my ($name, $value); #START A LOOP TO PROCESS FORM DATA foreach (@pairs) { ($name, $value) = split(/=/, $_); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(“C”, hex($1))/eg; $FORM{$name} = $value; } } #####################################

Leave a Reply