PHPでユーザー入力値をチェックする機会は沢山あります。
逆にいうとチェックする必要があるからです。
今回は、ユーザーが入力した値のチェック方法から気を付ける事まで、以下の内容でお話します。
【解説】入力チェックが必要な理由
【基本】入力値をチェックする方法
【応用】色々な入力値をチェック
わかりやすく解説しますので、是非最後まで読んでください。
入力チェックについて
入力チェックというと、皆さんはどういうものを思い浮かべますか。
今回の場合、ユーザーがテキストボックスに入力した値についてのチェックを指します。
それではどんな内容をチェックするのでしょうか。
文字数・未入力の制限
まず、代表的なものは文字数制限。
データベースに登録できる文字数に制限がある場合、それ以上入力されても登録が出来ないからです。
それから、絶対登録必須の項目に対しての未入力制限。
必ず入れてもらう必要がある項目については未入力を許可しないようにチェックします。
他にも、
・数値入力のみ
・半角英文字のみ
など、入力形式に合っていない入力値をチェックしてユーザーに注意喚起することが目的です。
セキュリティ対策
続いてセキュリティ対策としての入力値チェックです。
テキストボックスなどに、ユーザーがプログラムにとって意味のある特殊文字を入れて送信したとします。
送信ユーザーがスクリプトとして実行できる文字列を送信すると、作成した人間が意図していない動きを起こす場合があります。
また、別のユーザーも巻き込んで個人情報の漏洩などにつながる場合もあります。
これを避けるために、文字列をプログラムが認識しない情報に変換します。
具体的な方法については、【色々な入力値をチェックする】の章で詳しく説明します。
入力値をチェックするには
それでは、入力値をチェックする具体的な方法をお話ししていきます。
以下のページ(check_val.php)を作成します。
<form method="POST" name="check_form" action="check_error.php"> 送信データ<br /> <input type="text" name="check_data" value="" /><br /><br /> <input type="submit" value="送信" /> </form>
テキストボックスにチェックしたい値を入れて、送信ボタンをクリックします。
クリック後にformの送信先のcheck_error.phpページに遷移します。
■画面表示
続いてformの送信先、またエラーチェックページとして(check_error.php)を作成します。
□check_error.php
<?php if (strlen($_POST['check_data']) > 10) { echo "文字数がオーバーしています。"; }
入力した値は$_POSTとテキストボックスのnameに設定した【check_data】で受け取れます。
今回は10文字の文字数チェックを入れました。
関数で文字数を確認して、if文でエラーが画面に表示されるようにしました。
半角換算の場合はstrlen関数を使います。
半角の1や英数字のaなどは1文字、漢字やひらがなは2文字で数えます。
文字数だけで換算したい場合はmb_strlen関数を使います。
半角数字の1や英数字のaなどは1文字、漢字やひらがなも1文字で数えます。
今回はstrlenを使い、【12345678912345】と入力して送信しました。
■結果画像
4文字オーバーしていたので、エラーが発生しました。
色々な入力値をチェックする
最後に、文字数オーバー以外のエラーをチェックしてみましょう。
前章で使用した(check_error.php)を修正して、(check_val.php)から来る値をチェックしていきます。
未入力チェック
入力値が入っていない場合です。
□check_error.php
<?php if(empty($_POST['check_data'])){ echo "未入力です。"; }
emptyは、渡した値が空白、0、Nullなどの場合、trueを返してくれるPHPの関数です。
if文でtrueの場合エラーを返すコードです。
■結果画像
テキストボックスを空にして送信ボタンをクリックした結果です。
きちんと未入力としてエラーになりました。
数値のみチェック
数値のみが入っているかチェックする場合です。
□check_error.php
<?php if(preg_match("/[^0-9]/", $_POST['check_data'])){ echo "数値以外が入力されています。"; }
preg_matchは、正規表現にマッチするか判定するPHPの関数です。
今回の場合「/[^0-9]/」の部分が正規表現です。
■結果画像
【さむらい1】と入力して送信しました。
数字以外が入っているので、エラーになりました。
セキュリティ対策
セキュリティ対策として、データをデータベースに登録したり、データを使う前に行う作業があります。
htmlspecialcharsを使って、特殊文字を文字列に変換する事です。
これによって、【セキュリティ対策】の項目でお話したリスクを減らす事が出来ます。
□check_error.php
<?php echo $_POST['check_data']; echo "<br />"; echo htmlspecialchars($_POST['check_data']);
文字列変換前と変換後を画面に表示させるコードです。
<a href="https://www.sejuku.net/blog">侍エンジニア</a>
上記データを入れて、送信ボタンを押した結果が以下です。
■結果画像
変換前は<a>タグのリンクとして認識されるのに対して、変換後は完全に文字列表示です。
ユーザーに自由入力させた値はそのまま使うのは危険という事を覚えておいてください。
まとめ
今回はPHPの入力チェックについてお話しました。
チェック内容について全て紹介が出来ませんでしたが、日付や他の形式をチェックする方法もあります。
是非調べたり、試したりしてみてください。
それでは、また。