TECH I.S.

PHPフォームの検証


この章と次の章では、PHPを使用してフォーム データを検証する方法を示します。


PHP フォームの検証

PHPフォームを処理するときはセキュリティを考えてください!

これらのページでは、セキュリティを考慮して PHP フォームを処理する方法を示します。ハッカーやスパマーからフォームを保護するには、フォーム データを適切に検証することが重要です。

これらの章で扱う HTML フォームには、必須およびオプションのテキスト フィールド、ラジオ ボタン、送信ボタンなど、さまざまな入力フィールドが含まれています。

上記のフォームの検証規則は次のとおりです。


分野

検証規則

名前 必須です。 文字と空白のみを含める必要があります。
Eメール 必須です。 有効なメール アドレス (@ と .) が含まれている必要があります。
Webサイト オプション。存在する場合は、有効な URL が含まれている必要があります。
コメント オプション。複数行の入力フィールド (テキストエリア)。
性別 必須です。いずれかを選択する必要があります。

最初に、フォームのプレーン HTMLコードを見ていきます。


テキストフィールド

名前、電子メール、およびWebサイトのフィールドはテキスト入力要素であり、コメントフィールドはテキストエリアです。 HTMLコードは次のようになります。

<div> Name: <input type="text" name="name"> E-mail: <input type="text" name="email"> Website: <input type="text" name="website"> Comment: <textarea name="comment" rows="5" cols="40"></textarea> </div>

ラジオボタン

性別フィールドはラジオ ボタンで、HTMLコードは次のようになります。

<div> Gender: <input type="radio" name="gender" value="female">Female <input type="radio" name="gender" value="male">Male <input type="radio" name="gender" value="other">Other</div>

フォーム要素

フォームのHTMLコードは次のようになります。

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

フォームが送信されると、フォーム データは method="post"で送信されます。


$_SERVER["PHP_SELF"] 変数とは何ですか?$_SERVER["PHP_SELF"] は、現在実行中のスクリプトのファイル名を返すスーパーグローバル変数です。


したがって、$_SERVER["PHP_SELF"] は、別のページにジャンプする代わりに、送信されたフォームデータをページ自体に送信します。このようにして、ユーザーはフォームと同じページでエラーメッセージを受け取ります。


htmlspecialchars() 関数とは何ですか?htmlspecialchars() 関数は、特殊文字をHTMLエンティティに変換します。これは、< や > などのHTML文字を&lt;に置き換えることを意味します。と >.これにより、攻撃者がフォームにHTMLまたはJavascript コードを挿入してコードを悪用する (クロスサイト スクリプティング攻撃)のを防ぎます。





PHPフォームセキュリティに関する注意事項

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

ページで PHP_SELFが使用されている場合、ユーザーはスラッシュ (/) を入力してから、いくつかのクロス サイトスクリプティング(XSS)コマンドを実行できます。


クロスサイトスクリプティング(XSS)は、Webアプリケーションで通常見られるコンピュータセキュリティの脆弱性の一種です。XSSを使用すると、攻撃者は、他のユーザーが表示するWeb ページにクライアント側のスクリプトを挿入できます。


「test_form.php」という名前のページに次のフォームがあるとします。

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

ここで、ユーザーが「http://www.example.com/test_form.php」のような通常のURLをアドレスバーに入力すると、上記のコードは次のように変換されます。

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

ここまでは順調ですね。

ただし、ユーザーがアドレス バーに次のURLを入力したとします。

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

この場合、上記のコードは次のように変換されます。

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

このコードは、scriptタグとアラートコマンドを追加します。ページが読み込まれると、JavaScriptコードが実行されます (ユーザーには警告ボックスが表示されます)。これは、PHP_SELF変数が悪用される可能性がある単純で無害な例です。

そのことに注意してください<script>タグ内に任意のJavaScriptコードを追加できます。ハッカーはユーザーを別のサーバー上のファイルにリダイレクトできます。そのファイルには、グローバル変数を変更したり、フォームを別のアドレスに送信してユーザー データを保存したりする悪意のあるコードが含まれている可能性があります。


$_SERVER["PHP_SELF"]の悪用を回避するには?

$_SERVER["PHP_SELF"]の悪用は、htmlspecialchars()関数を使用して回避できます。

フォーム コードは次のようになります。

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

htmlspecialchars()関数は、特殊文字をHTMLエンティティに変換します。ユーザーがPHP_SELF変数を悪用しようとすると、次の出力が生成されます。

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

悪用は失敗し、害はありません!


PHPでフォームデータを検証する

最初に行うことは、PHPのhtmlspecialchars()関数を介してすべての変数を渡すことです。

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

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

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

&lt;スクリプト&gt;location.href('http://www.hacked.com')&lt;/スクリプト&gt;

このコードは、ページまたは電子メール内に安全に表示できるようになりました。

また、ユーザーがフォームを送信するときに、さらに2つのことを行います。

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

次のステップは、すべてのチェックを行う関数を作成することです (これは、同じコードを何度も書くよりもはるかに便利です)。

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

これで、各$_POST変数をtest_input()関数でチェックできます。スクリプトは次のようになります。

<?php // define variables and set to empty values $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の場合、フォームは送信されており、検証する必要があります。送信されていない場合は、検証をスキップして空白のフォームを表示します。

ただし、上記の例では、すべての入力フィールドがオプションです。ユーザーがデータを入力しなくても、スクリプトは正常に機能します。

次のステップでは、入力フィールドを必須にし、必要に応じてエラー メッセージを作成します。



プログラミング学習を加速させる

プログラミングをプロの講師に教えてもらいませんか。

テックアイエスのプログラミングスクールは初心者も大歓迎です。年齢制限もありません。転職・副業に強く、挫折させない手厚いサポートで稼ぐ力を身につけましょう!

スクールの詳細