PHPフォームの検証
この章と次の章では、PHPを使用してフォームデータを検証する方法を示します。
PHPフォームの検証
PHPフォームを処理するときは、セキュリティを考慮してください。
これらのページでは、セキュリティを念頭に置いてPHPフォームを処理する方法を説明します。フォームをハッカーやスパマーから保護するには、フォームデータを適切に検証することが重要です。
これらの章で使用するHTMLフォームには、さまざまな入力フィールドが含まれています。必須およびオプションのテキストフィールド、ラジオボタン、および送信ボタンです。
上記のフォームの検証ルールは次のとおりです。
Field | Validation Rules |
---|---|
Name | Required. + Must only contain letters and whitespace |
Required. + Must contain a valid email address (with @ and .) | |
Website | Optional. If present, it must contain a valid URL |
Comment | Optional. Multi-line input field (textarea) |
Gender | Required. Must select one |
まず、フォームのプレーンHTMLコードを確認します。
テキストフィールド
名前、電子メール、およびWebサイトのフィールドはテキスト入力要素であり、コメントフィールドはテキストエリアです。HTMLコードは次のようになります。
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>
ラジオボタン
性別フィールドはラジオボタンであり、HTMLコードは次のようになります。
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
フォーム要素
フォームのHTMLコードは次のようになります。
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
フォームが送信されると、フォームデータはmethod = "post"で送信されます。
$ _SERVER ["PHP_SELF"]変数とは何ですか?
$ _SERVER ["PHP_SELF"]は、現在実行中のスクリプトのファイル名を返すスーパーグローバル変数です。
したがって、$ _ SERVER ["PHP_SELF"]は、別のページにジャンプするのではなく、送信されたフォームデータをページ自体に送信します。このようにして、ユーザーはフォームと同じページにエラーメッセージを表示します。
htmlspecialchars()関数とは何ですか?
htmlspecialchars()関数は、特殊文字をHTMLエンティティに変換します。これは、<や>などのHTML文字を&lt;に置き換えることを意味します。および&gt;。これにより、攻撃者がHTMLまたはJavascriptコード(クロスサイトスクリプティング攻撃)をフォームに挿入してコードを悪用するのを防ぎます。
PHPフォームセキュリティに関するビッグノート
$ _SERVER ["PHP_SELF"]変数は、ハッカーが使用できます。
ページでPHP_SELFが使用されている場合、ユーザーはスラッシュ(/)を入力してから、いくつかのクロスサイトスクリプティング(XSS)コマンドを入力して実行できます。
クロスサイトスクリプティング(XSS)は、Webアプリケーションに通常見られる一種のコンピューターセキュリティの脆弱性です。XSSを使用すると、攻撃者は他のユーザーが表示するWebページにクライアント側のスクリプトを挿入できます。
「test_form.php」という名前のページに次のフォームがあるとします。
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
これで、ユーザーが「http://www.example.com/test_form.php」のようなアドレスバーに通常のURLを入力すると、上記のコードは次のように変換されます。
<form method="post" action="test_form.php">
ここまでは順調ですね。
ただし、ユーザーがアドレスバーに次のURLを入力することを考慮してください。
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
この場合、上記のコードは次のように変換されます。
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
このコードは、スクリプトタグとアラートコマンドを追加します。また、ページが読み込まれると、JavaScriptコードが実行されます(ユーザーにはアラートボックスが表示されます)。これは、PHP_SELF変数を悪用する方法の単純で無害な例です。
<script>タグ内にJavaScriptコードを追加できることに注意してください。ハッカーはユーザーを別のサーバー上のファイルにリダイレクトでき、そのファイルには、グローバル変数を変更したり、フォームを別のアドレスに送信してユーザーデータを保存したりする悪意のあるコードが含まれている可能性があります。
$ _SERVER ["PHP_SELF"]のエクスプロイトを回避する方法は?
$ _SERVER ["PHP_SELF"]の悪用は、htmlspecialchars()関数を使用することで回避できます。
フォームコードは次のようになります。
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars()関数は、特殊文字をHTMLエンティティに変換します。これで、ユーザーがPHP_SELF変数を悪用しようとすると、次の出力になります。
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
エクスプロイトの試みは失敗し、害はありません。
PHPでフォームデータを検証する
最初に行うことは、PHPのhtmlspecialchars()関数を介してすべての変数を渡すことです。
htmlspecialchars()関数を使用する場合。次に、ユーザーがテキストフィールドに以下を送信しようとした場合:
<script> location.href( 'http://www.hacked.com')</ script>
-これは、次のようにHTMLエスケープコードとして保存されるため、実行されません。
&lt; script&gt; location.href( 'http://www.hacked.com')&lt; / script&gt;
これで、コードをページまたは電子メール内に安全に表示できるようになりました。
また、ユーザーがフォームを送信すると、さらに2つのことが行われます。
- ユーザー入力データから不要な文字(余分なスペース、タブ、改行)を削除します(PHPのtrim()関数を使用)
- ユーザー入力データから円記号(\)を削除します(PHPのstripslashes()関数を使用)
次のステップは、すべてのチェックを実行する関数を作成することです(これは、同じコードを何度も書くよりもはるかに便利です)。
関数にtest_input()という名前を付けます。
これで、test_input()関数を使用して各$ _POST変数を確認でき、スクリプトは次のようになります。
例
<?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の場合、フォームは送信されています-検証する必要があります。まだ送信されていない場合は、検証をスキップして空白のフォームを表示してください。
ただし、上記の例では、すべての入力フィールドはオプションです。ユーザーがデータを入力しなくても、スクリプトは正常に機能します。
次のステップは、入力フィールドを必須にし、必要に応じてエラーメッセージを作成することです。