プロが教える店舗&オフィスのセキュリティ対策術

GETデータ、たとえば

http://www.yahoo.co.jp/test.cgi?data1=1237&data2 …

とある場合、$ENV{'QUERY_STRING'}の中のそれぞれの引数値に個別にエラー処理をかける方法を教えてください。順番はdata2が先頭にくるときもあればdata1が先頭にくるときもあります。data以外の文字はだめです。たとえばcode1=となるとエラーになるようにしたい。data1には数字4文字が入ります。data2には大文字の英字が入ります。
組み合わせはdata1=8544だけのときもありますし、
data1=1234&data2=KOのときもあったりばらばらです。
逆の場合もあります。data2=KO&data1=1234というふうに・・・。$ENV{'QUERY_STRING'} を&で分割して@getにいれてから、@getから&で区切られた個々の値を取り出す方法がわかりません。。。
どなたかご教授ねがいます。よろしくお願いいたします。以下のように書いたのですがうまくできません。
sub err_check{
if ( $FORM{'action'} eq "" ) {
local(@get);
if($ENV{'QUERY_STRING'} !~ /data1|data2|data3/) { &err2; }

if (length($ENV{'QUERY_STRING'}) > 30) { &err2; }

(@get)=split(/&/,$ENV{'QUERY_STRING'});

foreach $getname (@get) {
##data1のとき
if ($data1){
if ($getname !~ /^media=[0-9]+[0-9]+[0-9]+[0-9]/) { &err2; }
if (length($data1) > 6) { &err2; }
if (length($data1) < 4) { &err2; }
}
##data2のとき
if($data2){
if ($getname !~ /^data2=[A-Z]+[A-Z]/) { &err2; }
if (length($data2) ne 2) { &err2; }
}
 }
}

A 回答 (2件)

こんな感じでしょうか



@get = split( /&/, $ENV{'QUERY_STRING'} );

foreach $_get( @get ) {

( $key, $val ) = split( /=/, $_get );

if( $key eq "data1" ) {
print "data1のチェック処理\n";

if( $val =~ /^[0-9][0-9][0-9][0-9]$/ ) {
print "data1はOK\n";
}
else {
print "data1間違い\n";
}
}
elsif( $key eq "data2" ) {
print "data2のチェック処理\n";
if( $val =~ /^[A-Z][A-Z]$/ ) {
print "data2はOK\n";
}
else {
print "data2間違い\n";
}
}
}
    • good
    • 0

こんなのでいいのでしょうか?



@get = split('&', $ENV{'QUERY_STRING'});
foreach $keyvalue (@get) {
($key, $value) = split('=', $keyvalue);
ここで、$key、$valueの判定と、処理
$data[$key] = $value;
}

これが終わると、%data 連想配列に、getのデータが入っていますので、外で使えます。

後、正規表現ですが、
$key の判定は、/^data[1-3]$/ でいいと思います。
数字4個でしたら、 /^\d{4}$/
4文字以上、6文字以下の大文字の繰り返しでしたら /^[A-Z]{4,6}$/ って、書けます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!