纯PERL 实现网页上传表单的提取

纯PERL 实现网页上传表单的提取

纯PERL 实现网页上传表单的提取
#================================================================
# convStr usage: $str=convStr($string);#
#================================================================
sub convStr{
my $str=shift;$str='' unless $str;
$str=~tr/+/ /;
$str=~s/%(..)/pack("C",hex($1))/ge;
return $str;
} #很简单,但很重要,用来把一个表单上传后经转码的字符再转回来
#================================================================



sub request{
my %request;
if($ENV{'REQUEST_METHOD'} eq 'POST'){
binmode(STDIN);my $post;
read(STDIN,$post,$ENV{'CONTENT_LENGTH'},0);


if($ENV{'CONTENT_TYPE'}=~ m|^multipart/form-data|){
my($bound) = $ENV{'CONTENT_TYPE'} =~ /boundary=\"?([^\";,]+)\"?/;
$post=~s/\r\n--$bound--\r\n// && $post=~s/--$bound\r\n// if $post;#去掉最后一个分隔符 &&不使用g使得去掉第一个分隔符
my @kv=split(/\r\n--$bound\r\n/,$post) if $post;
foreach (@kv){
my ($head,$value)=split(/\r\n\r\n/,$_,2);
$head=~/ name="(\w+)"/;my $key=$1;
if ($head=~/filename=".*(?:\/|\\)(.*)"/g) {
my $filename=$1;
$request{$key}=[$filename,$value];
}else{$request{$key}=$value;}
}
}else{my @k_v=split(/&/,$post);
foreach (@k_v) {
my($key,$value)=split(/=/,$_,2);
$key=convStr($key);
$value=convStr($value);
$request{$key}=$value;
}
}
}
#解决可能被GET方式提交的数据
my $post=$ENV{'QUERY_STRING'};
my @k_v=split(/&/,$post);
foreach (@k_v) {
my($key,$value)=split(/=/,$_,2);
$key=convStr($key);
$value=convStr($value);
$request{$key}=$value;
}
return \%request;
}

#================================================================

####示例
# my $ref=request(); #处理表单,得到表单内容的引用$ref
# print $ref->{'text1'};
# print %$ref;
# 文件解析
# print $ref->{'file1'}->[0];#打印上传的文件名
# print $ref->{'file1'}->[1];#打印上传的文件内容
#
###########################
##made by MR.WATER QQ:175 785 113 #
###########################




   

00漏洞
呵呵,里面出面了00漏洞,幸好被我补上了!
###########################
##made by MR.WATER QQ:175 785 113 #
###########################




   

#=======================.
#================================================================
# respons usage: $ref=request();$ref->{name};# 处理表单,返回散列值如 $ref->{file}->[0]表所上传的文件名$ref->{file}->[0]表所上传的文件内容
#================================================================
sub request{
my %request;
my $post_mode=0;
if($ENV{'REQUEST_METHOD'} eq 'POST'){
$post_mode=1;
binmode(STDIN);
my $post;
read(STDIN,$post,$ENV{'CONTENT_LENGTH'},0);


if($ENV{'CONTENT_TYPE'}=~ m|^multipart/form-data|){
my($bound) = $ENV{'CONTENT_TYPE'} =~ /boundary=\"?([^\";,]+)\"?/;
$post=~s/\r\n--$bound--\r\n// && $post=~s/--$bound\r\n// if $post;#去掉最后一个分隔符 &&不使用g使得去掉第一个分隔符
my @kv=split(/\r\n--$bound\r\n/,$post) if $post;
foreach (@kv){
my ($head,$value)=split(/\r\n\r\n/,$_,2);
$head=~/ name="(\w+)"/;my $key=$1;
if ($head=~/filename=".*(?:\/|\\)(.*)"/g) {
my $filename=$1;
$filename=~s/\x00.*//;
$request{$key}=[$filename,$value];
}
else{
$request{$key}=$value;
}
}
}else{
my @k_v=split(/&/,$post);
foreach (@k_v) {
my($key,$value)=split(/=/,$_,2);
$key=convStr($key);
$value=convStr($value);
$request{$key}=$value;
}
}
}
#解决可能被GET方式提交的数据
my $post=$ENV{'QUERY_STRING'};
return 0 if ($post eq '' and ! $post_mode);
my @k_v=split(/&/,$post);
foreach (@k_v) {
my($key,$value)=split(/=/,$_,2);
$key=convStr($key);
$value=convStr($value);
$request{$key}=$value;
}
return \%request;
}

#================================================================
[CCB]2[/CCB].
兄台的文章名字很大....[C.
兄台的文章名字很大....