PHP フォーム検証


この章では、PHPを使用してクライアントから送信されたフォームデータを検証する方法を紹介します。


PHP フォーム検証

Note PHPフォームを処理する際には、セキュリティを考慮する必要があります。

この章では、PHPフォームデータの安全な処理について説明します。ハッカーやスパムを防ぐために、フォームのデータ安全性を検証する必要があります。

この章で紹介するHTMLフォームには、以下の入力フィールドが含まれます: 必須および任意のテキストフィールド、ラジオボタン、送信ボタン:

上記のフォーム検証ルールは次のとおりです:

フィールド 検証ルール
名前 必須。 + 文字とスペースのみを含めることができます
E-mail 必須。 + 有効なメールアドレスである必要があります('@' と '.' を含む)
URL 任意。存在する場合、有効なURLを含む必要があります
備考 任意。複数行の入力フィールド(テキストエリア)
性別 必須。 いずれかを選択する必要があります

まず、純粋なHTMLのフォームコードを見てみましょう:


テキストフィールド

「名前」「E-mail」「URL」フィールドはテキスト入力要素で、「備考」フィールドは textarea です。HTMLコードは次のとおりです:

“名字”: <input type="text" name="name">
E-mail: <input type="text" name="email">
网址: <input type="text" name="website">
备注: <textarea name="comment" rows="5" cols="40"></textarea>

ラジオボタン

「性別」フィールドはラジオボタンです。HTMLコードは次のとおりです:

性别:
<input type="radio" name="gender" value="female">女
<input type="radio" name="gender" value="male">男

フォーム要素

HTMLフォームコードは次のとおりです:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

このフォームはmethod="post"メソッドを使用してデータを送信します。

Note $_SERVER["PHP_SELF"] 変数とは?

$_SERVER["PHP_SELF"] はスーパーグローバル変数で、現在実行中のスクリプトのファイル名をドキュメントルートに関連付けて返します。

したがって、$_SERVER["PHP_SELF"] はフォームデータを現在のページに送信し、別のページに移動することはありません。

Note htmlspecialchars() メソッドとは?

htmlspecialchars() 関数は、いくつかの定義済み文字をHTMLエンティティに変換します。

定義済みの文字は次のとおりです:

  • & (アンパサンド) は &amp; になります
  • " (二重引用符) は &quot; になります
  • ' (一重引用符) は &#039; になります
  • < (小なり) は &lt; になります
  • > (大なり) は &gt; になります


PHPフォームで注意すべき点は?

$_SERVER["PHP_SELF"] 変数はハッカーに悪用される可能性があります!

ハッカーがクロスサイトスクリプティングのHTTPリンクを使用して攻撃する場合、$_SERVER["PHP_SELF"] サーバー変数にもスクリプトが埋め込まれる可能性があります。その理由は、クロスサイトスクリプトが実行ファイルのパスの後ろに付加されるため、$_SERVER["PHP_SELF"] の文字列にHTTPリンクの後ろのJavaScriptコードが含まれることになるからです。

Note XSSは別名CSS(Cross-Site Script)とも呼ばれ、クロスサイトスクリプティング攻撃です。悪意のある攻撃者がWebページに悪意のあるHTMLコードを挿入し、ユーザーがそのページを閲覧すると、Webページに埋め込まれたHTMLコードが実行され、悪意のあるユーザーの特別な目的を達成します。

以下のフォームファイル名を "test_form.php" とします:

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

ここで、URLを使用して送信先アドレスを "test_form.php" と指定すると、上記のコードは次のように変更されます:

<form method="post" action="test_form.php">

これで十分です。

しかし、ユーザーがブラウザのアドレスバーに次のアドレスを入力する場合を考えます:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

上記のURLは、次のコードとして解析されて実行されます:

<form method="post" action="test_form.php/"><script>alert('hacked')</script>

コードにscriptタグが追加され、alertコマンドが追加されました。 ページが読み込まれると、このJavaScriptコードが実行されます(ユーザーにポップアップボックスが表示されます)。 これは、PHP_SELF変数がハッカーに悪用される可能性があることを示す単純な例にすぎません。

注意してください、任意のJavaScriptコードを<script>タグ内に追加できます!ハッカーはこれを利用して、ページを別のサーバーのページにリダイレクトできます。ページのコードファイルには悪意のあるコードを含めることができ、そのコードはグローバル変数を変更したり、ユーザーのフォームデータを取得したりできます。


$_SERVER["PHP_SELF"] が悪用されるのを防ぐには?

$_SERVER["PHP_SELF"] は htmlspecialchars() 関数を使用して悪用を防ぐことができます。

form コードは次のとおりです:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

htmlspecialchars() は、いくつかの定義済み文字をHTMLエンティティに変換します。ここで、ユーザーがPHP_SELF変数を悪用しようとすると、結果は次のように出力されます:

<form method="post" action="test_form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">

この脆弱性の悪用は失敗します!


PHP を使用したフォームデータの検証

まず、ユーザーが送信したすべてのデータをPHPの htmlspecialchars() 関数で処理します。

htmlspecialchars() 関数を使用すると、ユーザーが次のテキストフィールドを送信しようとした場合:

<script>location.href('http://www.example.com')</script>

このコードは実行されません。HTMLエスケープコードとして保存されるためです。次のようになります:

&lt;script&gt;location.href('http://www.example.com')&lt;/script&gt;

上記のコードは安全で、ページに正常に表示したり、メールに挿入したりできます。

ユーザーがフォームを送信するとき、次の2つのことを行います:

  1. PHPの trim() 関数を使用して、ユーザー入力データから不要な文字(スペース、タブ、改行など)を削除します。
  2. PHPの stripslashes() 関数を使用して、ユーザー入力データからバックスラッシュ (\) を削除します。

次に、これらのフィルタリング関数を自分たちで定義した1つの関数にまとめます。これにより、コードの再利用性が大幅に向上します。

関数に test_input() という名前を付けます。

これで、test_input() 関数を使用して $_POST 内のすべての変数を検証できます。スクリプトコードは次のとおりです:

実例

<?php //変数を定義し、デフォルトで空の値に設定します $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { $name = test_input($_POST["name"]); $email = test_input($_POST["email"]); $website = test_input($_POST["website"]); $comment = test_input($_POST["comment"]); $gender = test_input($_POST["gender"]); } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?>

実例を実行 »

上記のスクリプトを実行するとき、$_SERVER["REQUEST_METHOD"] を使用してフォームが送信されたかどうかを検出します。REQUEST_METHOD が POST の場合、フォームは送信され、データが検証されます。フォームが送信されていない場合は、検証をスキップして空白を表示します。

上記の例では、入力項目はすべて任意であるため、ユーザーが何も入力しなくても正常に表示されます。

次の章では、ユーザーが入力したデータを検証する方法を紹介します。

その他の拡張