アプリ版:「スタンプのみでお礼する」機能のリリースについて

フォームの入力値のチェック方法についての質問です。
名前、電話番号、Eメール、住所、注文商品、数量の入力フォームです。
入力値の取得は、ライブラリ「cgi-lib.cgi」を利用しています。
(以下perlのソース)
#!/usr/bin/perl -T
#入力値の取得
require 'cgi-lib.cgi';
&ReadParse(*form);
$name = $form{'name'};
$tel = $form{'tel'};
$email = $form{'email'};
・・・・以下同様の処理が続くだけなので省略

#サブルーチンを利用して入力値をチェック
$name = &Wash($name);
$tel = &Wash($tel);
$email = &Wash($email);
・・・・以下同様の処理が続くだけなので省略

#サブルーチン部分
sub Wash{
if($_[0] =~ /^([^|><\/]+)$/){return $_[0];}
elsif($_[0] eq undef){return "未入力";}
else{return undef;}
}
(perlのソース ここまで)

としてから、通常の処理に入るようにしてみたのですが
セキュリティー上の問題があれば教えてください。
入力値から、コマンドやスクリプトが実行(XSS)されてしまう可能性はありますか?
お願いします。
またメタ文字が見つかった場合の処理についてですが
とりあえずよくわからないので。「undef」を返して
いるのですが、他に良い方法があれば教えてください。

A 回答 (1件)

入力データによるセキュリティホールにはXSSの他にもSQL InjectionやOS Command Injectionなどさまざまあり、これらは「入力データをその後どう扱うか?」に依存しますので一概に「こうすればセキュリティはOK」とはいえないです。


(入力データを表示しない仕様なら、タグが含まれていようがXSSには関係ないわけで)

タグはともかくダブルクォーテーションは?アンパーサンドは?改行は?タブは?ヌルは?
・・・と、危険な文字を特定するのは大変なので、
 名前はひらがなのみ許可する。
 電話番号は半角数字のみ許可する。(全角数字は半角数字へ変換する)

というチェックにしたほうが効率は良いです。
エラーになったときは「電話番号は半角数字で入力してね」と表示する具合で。
(よくありますよね。住所は数字も含めてすべて全角で入力させるサイト)

入力値の正当性をチェックした後、システム上危険な文字をチェックすることで二重のフィルターをかけるのももちろんありです。

参考URL:http://www.atmarkit.co.jp/fsecurity/special/30xs …
    • good
    • 0
この回答へのお礼

ありがとうございます。
教えていただいたサイトを見て勉強してみます。

入力された項目を確認用画面に表示しているので・・

タグについては、まあ「<」と「>」を半角スペースか何かに置換してやればいいだけなので、まあ問題無いと思うのですが、電話番号は、数字のみ許可するというのは納得です。
ただ名前はひらがなのみ許可するというのは、現実的には難しいでしょうね。

一度入力値から、’(シングルコーテーション)を全て抜き取ってから、もう一度 ’(シングルコーテーション)でサンドイッチした状態にしてから表示するというのも効果はありますか?

勉強しますと言いながら、さらに質問を重ねてしまって
すみません・・・・・

お礼日時:2004/12/18 21:24

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