最新記事
(06/29)
(06/04)
(06/03)
(05/30)
(05/28)
|
ニュース
この欄には、このブログの内容に関連するニュースを掲載する予定です。
|
PHP 入力値のチェック(正規表現、ereg)
PHPで会員登録システムを作りたい。そのために必要な知識をひとつひとつ確認していこうと思っています。今回のテーマは、「入力値のチェック(正規表現)」。
前々回の「PHP 入力値の無害化(htmlspecialchars,htmlentities) 」では外部からの攻撃に対する防御、前回の「PHP パスワードの暗号化(md5)」 では内部関係者を含めてのパスワード流出の防止。2回ともセキュリティ面での入力値の取扱いについて記事にしてきました。今回は、送信されるデータが運用面で支障がないようにするにはどうしたらいいのかを考えたいと思います。
まず、ユーザーid。これは、ほとんどのサイトで小文字の英数字に限定するという制限が行われているようですね。これには理由があるのでしょう。すぐに思いつくのは、日本語だと文字化けする心配があるということ。また大文字と小文字が混じっていると、入力を間違えやすいということもあるかもしれません。ここは深く追求する必要はないようです。一般の例に倣って、ユーザーidは、「小文字の英数字」に限定しておくのが無難なようです。
これは、まずユーザーサイドでJavaScriptでチェックさせましょう。そしてJavaScriptが無効な環境もあることを考慮に入れて、サーバーサイドでもチェックをかけるようにしなければなりません。その手段は、PHPでは、どのように
実現すればいいのでしょう。
「正規表現」という言葉があります。英語だと「Regular Expressions」。厳密な定義は調べたことはありませんが、文字列がパターンに合っているかどうかの判断に使えるようです。
そのパターンを記述するのにはお約束が合って、そのお約束を知らないと正規表現は利用できません。まずは、とりあえず必要とされるお約束だけは覚えておきましょう。「ユーザーid」は小文字の英数字の文字列としたい。これは、どのようなパターンとして記述すればいいのでしょう。
先頭の1文字だけは小文字のアルファベットにしたい。
「^[a-z]」
最初の1文字の指定は「^」をつけて、その後に採用したい文字を並べたり、範囲を指定します。[a-z]は小文字のアルファベットの「aからz」までという指定です。
2文字目以降は、アルファベットのほか数字やアンダーバー「_」、そしてハイフン「-」もOKとします。
「^[a-z][a-z0-9_-]{2,15}」
「{2,15}」は[a-z0-9_-]の中から2文字以上15文字以内の文字を選び出すという意味だと考えればいいでしょう。先頭の文字と合わせると全体で、3文字以上16文字以内の文字列という指定です。
文字列がこのパターンに合っているかどうかを判断する正規表現の関数は「ereg」です。
「ereg("パターン",$str)」という書式です。
文字列$strがパターンに合っていれば、TRUE、間違っていればFALSEを返します。
間違っていた場合には、メッセージを表示させたいので、そのメッセージを変数$msgに代入しましょう。
[ソース]ユーザーidの入力値のチェック部分のみ
前々回の「PHP 入力値の無害化(htmlspecialchars,htmlentities) 」では外部からの攻撃に対する防御、前回の「PHP パスワードの暗号化(md5)」 では内部関係者を含めてのパスワード流出の防止。2回ともセキュリティ面での入力値の取扱いについて記事にしてきました。今回は、送信されるデータが運用面で支障がないようにするにはどうしたらいいのかを考えたいと思います。
まず、ユーザーid。これは、ほとんどのサイトで小文字の英数字に限定するという制限が行われているようですね。これには理由があるのでしょう。すぐに思いつくのは、日本語だと文字化けする心配があるということ。また大文字と小文字が混じっていると、入力を間違えやすいということもあるかもしれません。ここは深く追求する必要はないようです。一般の例に倣って、ユーザーidは、「小文字の英数字」に限定しておくのが無難なようです。
これは、まずユーザーサイドでJavaScriptでチェックさせましょう。そしてJavaScriptが無効な環境もあることを考慮に入れて、サーバーサイドでもチェックをかけるようにしなければなりません。その手段は、PHPでは、どのように
実現すればいいのでしょう。
「正規表現」という言葉があります。英語だと「Regular Expressions」。厳密な定義は調べたことはありませんが、文字列がパターンに合っているかどうかの判断に使えるようです。
そのパターンを記述するのにはお約束が合って、そのお約束を知らないと正規表現は利用できません。まずは、とりあえず必要とされるお約束だけは覚えておきましょう。「ユーザーid」は小文字の英数字の文字列としたい。これは、どのようなパターンとして記述すればいいのでしょう。
先頭の1文字だけは小文字のアルファベットにしたい。
「^[a-z]」
最初の1文字の指定は「^」をつけて、その後に採用したい文字を並べたり、範囲を指定します。[a-z]は小文字のアルファベットの「aからz」までという指定です。
2文字目以降は、アルファベットのほか数字やアンダーバー「_」、そしてハイフン「-」もOKとします。
「^[a-z][a-z0-9_-]{2,15}」
「{2,15}」は[a-z0-9_-]の中から2文字以上15文字以内の文字を選び出すという意味だと考えればいいでしょう。先頭の文字と合わせると全体で、3文字以上16文字以内の文字列という指定です。
文字列がこのパターンに合っているかどうかを判断する正規表現の関数は「ereg」です。
「ereg("パターン",$str)」という書式です。
文字列$strがパターンに合っていれば、TRUE、間違っていればFALSEを返します。
間違っていた場合には、メッセージを表示させたいので、そのメッセージを変数$msgに代入しましょう。
[ソース]ユーザーidの入力値のチェック部分のみ
<?php
if(!(ereg("^[a-z][a-z0-9_-]{2,15}", $usrid))) {
$msg .= "ユーザーidが適切ではありません。";
}
?>
PR