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

フォームから入力された値をCSVにはき出しているため、
「,」(カンマ)を禁止文字としたいのですが、
正規表現で対象にすることは可能でしょうか?
「.」(ピリオド)なら
 if($TEST1 =~ /\./)
とすればよいと思うのですが、、、
 if($TEST1 =~ /\,/)
ではダメですよね。

正規表現で引っかけてアラートを出す予定なのですが、

if($TEST1 =~ /\,/){
print <<END;
<script>
alert(",(カンマ)を含んでいます");
</script>
END
&error; }

他のやり方で「,」(カンマ)を禁止文字にする方法でも構いません。

また、入力フォームは8つあるのですが($TEST1~$TEST8)、
まとめて「,」(カンマ)を禁止文字にすることはできますか?

開発環境:WindowsXP(TeraTerm使用)
サーバー:HP-UX
perlバージョン:5.6.1

以上、よろしくお願いいたします。

A 回答 (5件)

カンマが含まれていることの正規表現は


/\,/
でも
/,/
でもOKだと思います。
>if($TEST1 =~ /\,/) ではダメですよね。
のダメな理由はなんですか?
まとめてやるのは、ループにするなり、
結合しちゃってやるなりすればすればいいと思いますが、
script でalert を出すんだったら、最初からscript で入力チェックするというのもありかと思います。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございました。
違う方法ですが、解決いたしました。

お礼日時:2006/04/07 16:26

存在するかどうかなので、


index($TEST1, ',')
の方が早そうです。

フォームからということなので、
変数をハッシュに入れ込んで、for文で回して
フラグをたてて、エラー処理をすると
コーディングの行数が減りそうですね。

my %form; #= $form{"$key"} = $val;の様な感じで使用する。
my $flg = 0; #= フラグ

foreach my $key (keys %form) {
if ( index($form{"$key"}, ',' ) {
$flg++;
last;
}
}
if ( $flg > 0 ) {
#= エラー処理
}

ってかんじでしょうか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
違う方法ですが、解決いたしました。

お礼日時:2006/04/07 16:27

/,/ でもOKですよね。


サンプル
$u='a,b,c,d,e,f';
$u =~/,/;
print "\$&=$& \$u=$u<P>\n";
$u =~s/,//g;
print "\$&=$& \$u=$u";

で、いっぺんにチェックするのは
FORM入力データコーディングのループ中で
$value =~ s/%([a-f\d]{2})/pack("C", hex($1))/ieg;# と言う行があるはずなので、次の行に
if(index($value, ',')){&error(",は駄目よ ");last;}# sub errorに飛ぶ 等と追加する

とすれば良いかと思います。

と言うか、、、#2さんのソースを見て俺には理解できなかったのだが
, をFORMで送るとURLエンコードされて %2C になるはずだが、その点は大丈夫なんですか?
perl離れて何年も経つので勘違いしてたらごめんなさい
    • good
    • 0

すみません #3のスクリプトでは、Shift_JISの場合


倬?听のような2Cを含む文字を入力されると誤動作しますね。
これを回避するには
if($valueに倬?听などの2cを含む文字があれば何もしない
elsif(,を含む場合){エラー処理}
みたいな形しかオイラには思いつかない
もっとスマートな形があると思うのだが、、、
    • good
    • 0

長文失礼します


#4は出勤前にあわてて書いたので 間違いがあります
仕事を終えて帰宅しましたので、じっくり調べてみました
ようやく答えらしい事が書けます。
結論から先に、、、
入力されたデータ全てから  , をチェックするのなら
良くあるFORMデコード部分で
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
&jcode'convert(*value, 'sjis');# sjisまたはEUCのどちらか
if(index($value, ',')){エラー処理をここに記述;}#この行を追加する

$FORM{$name} = $value;
}

##その理由は http://ash.jp/code/ を見て調べたところ
2Cを含むのはShift_JISでもEUCでもなく JISとUTF-16でした。
朝、調べたのはwindows付属の文字コード表でしたが
これってデフォルトがShift_JISではなくてunicodeになっているんですね
で、JISの場合 2C を含む2バイト文字は10個やそこらではないので、
URLデコード前やsjisやEUCに変換する前に 2C (1バイト文字だと , )をチェックするのは現実的ではありません。
また<FORM LANG="JA"ACCEPT-CHARSET="Shift_JIS"
のような指定をしても入力されるCHARSETはブラウザの実装しだいなので当てになりません。
したがってjcode.plなどでShift_JISかEUCに変換後チェックする必要があります。

### 追伸1: 何故#4が間違いかと言うと、上に書いた現実的でない事の他に、
2Cを含む2バイト文字と , そのものが混在した場合、チェックをスルーしてしまうからです。

### 追伸2:#2さんへ
#3にて理解できないと書きましたが、これって
FORM入力データをデコードしてハッシュに入れた後で展開して調べるって事ですね? 失礼しました。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
上記参考にさせてもらい、解決いたしました。
以上ですm(__)m

お礼日時:2006/04/07 16:28

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