これと次の章では、フォームデータを検証するためにPHPを使用する方法を示しています。
PHPフォームのバリデーション
PHPのフォームを処理する際に、セキュリティを考えてみて!
これらのページは、セキュリティを考慮してPHPのフォームを処理する方法を示します。 フォームデータの適切な検証はハッカーやスパマーからフォームを保護することが重要です!
必須およびオプションのテキストフィールド、ラジオボタン、および送信ボタン:私たちはこれらの章でで働くことになりますHTMLフォームは、さまざまな入力フィールドが含まれています。
次のようにフォームの検証規則は上記のとおりです。
フィールド | 検証ルール |
---|---|
名 | 必須。 +のみ文字と空白文字が含まれている必要があり |
Eメール | 必須。 +有効なメールアドレスが含まれている必要があります(with @ and .) |
ウェブサイト | 任意。 存在する場合、それは有効なURLが含まれている必要があります |
コメント | 任意。 複数行の入力フィールド(textarea) |
性別 | 必須。 いずれかを選択しなければなりません |
まず、フォームのプレーンな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
フォーム要素
フォームのHTMLコードは次のようになります。
<form method="post" action="<?php echo
htmlspecialchars($_SERVER["PHP_SELF"]);?>">
フォームが送信されると、フォームデータは、メソッド=「ポスト」で送信されます。
$ _SERVER [ "PHP_SELF"]変数とは何ですか?
$ _SERVER [「PHP_SELF」]は、現在実行中のスクリプトのファイル名を返すスーパーグローバル変数です。
だから、$の_SERVER [「PHP_SELF」]は代わりに別のページにジャンプする、ページ自体に送信されたフォームデータを送信します。 この方法では、ユーザーがフォームと同じページにエラーメッセージが表示されます。
何でhtmlspecialchars()関数は?
htmlspecialchars()関数は、HTMLエンティティに特殊文字を変換します。 これは、<と>と&LTのようなHTMLの文字を置換することを意味します。 そして&GT ;. これは、HTMLやJavascriptのコード注入することにより、コードを悪用する攻撃者を防ぐ(Cross-site Scripting attacks)形で。
PHPフォームのセキュリティ上のビッグ注意
の$ _SERVER [「PHP_SELF」]変数ハッカーによって使用することができます!
PHP_SELFがあなたのページで使用されている場合、ユーザーはスラッシュ入力することができます(/)その後、いくつかのクロスサイトスクリプティング(XSS)実行するコマンドを。
クロスサイトスクリプティング(XSS)通常のWebアプリケーションで見つかったコンピュータセキュリティの脆弱性の種類です。 XSSは、他のユーザーが閲覧するWebページにクライアント側のスクリプトを注入する攻撃を可能にします。
私たちは、名前のページに次の形式があるとし"test_form.php" :
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
ユーザーのようなアドレスバーに通常のURL入力した場合さて、 "http://www.example.com/test_form.php" 、上記のコードはに変換されます。
<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のコードが実行されます(the user will see an alert box) 。 これはPHP_SELF変数が悪用される可能性がありますどのように単純かつ無害例です。
任意のJavaScriptコードが内部で追加することができることに注意して<script>タグ! ハッカーは別のサーバー上のファイルにユーザーをリダイレクトすることができ、そのファイルには、グローバル変数を変更したり、例えば、ユーザデータを保存するために別のアドレスにフォームを送信することができます悪意のあるコードを保持することができます。
どのように$ _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()関数。 その後、ユーザーがテキストフィールドに以下の提出しようとした場合:
<スクリプト>場所。 href('http://www.hacked.com') </スクリプト>
- HTMLはこのように、コードをエスケープとして、それが保存されるため、これは、実行されないでしょう。
&LT;スクリプト&GT;位置。 href('http://www.hacked.com') &LT; /スクリプト&GT。
コードはページまたは電子メール内に表示されても安全です。
ユーザーがフォームを送信するとき我々はまた、2つのことが起きます。
- ストリップ不要な文字(extra space, tab, newline)ユーザ入力データから(with the PHP trim()機能)
- バックスラッシュ削除(\)ユーザ入力データから(with the PHP stripslashes()関数)
次のステップは、私たちのために、すべてのチェックを行います関数で作成することである(which is much more convenient than writing the same code over and over again) 。
私たちは、関数名になる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の場合は、フォームが送信されました - そしてそれは検証する必要があります。 それが提出されていない場合は、検証をスキップし、空白のフォームを表示します。
しかしながら、上記の例では、すべての入力フィールドはオプションです。 このスクリプトは、ユーザーが任意のデータを入力しない場合でも正常に動作します。
次のステップは、必要な入力フィールドを作成し、必要な場合は、エラーメッセージを作成することです。