PHPチュートリアル

PHPホーム PHPイントロ PHPインストール PHP構文 PHPコメント PHP変数 PHPエコー/印刷 PHPデータ型 PHP文字列 PHP番号 PHP数学 PHP定数 PHP演算子 PHP If ... Else ... Elseif PHPスイッチ PHPループ PHP関数 PHP配列 PHPスーパーグローバル PHP正規表現

PHPフォーム

PHPフォーム処理 PHPフォームの検証 PHPフォームが必要 PHPフォームのURL / Eメール PHPフォームの完了

PHP Advanced

PHPの日付と時刻 PHPインクルード PHPファイルの処理 PHPファイルのオープン/読み取り PHPファイルの作成/書き込み PHPファイルのアップロード PHPクッキー PHPセッション PHPフィルター PHPフィルターアドバンスト PHPコールバック関数 PHP JSON PHPの例外

PHPOOP _

PHPOOPとは PHPクラス/オブジェクト PHPコンストラクター PHPデストラクタ PHPアクセス修飾子 PHPの継承 PHP定数 PHP抽象クラス PHPインターフェース PHPの特性 PHP静的メソッド PHPの静的プロパティ PHP名前空間 PHPIterables

MySQLデータベース

MySQLデータベース MySQLコネクト MySQL Create DB MySQLテーブルの作成 MySQLの挿入データ MySQLは最後のIDを取得します MySQL Insert Multiple MySQLを準備しました MySQL Select Data MySQL Where MySQL Order By MySQLデータの削除 MySQLアップデートデータ MySQL制限データ

PHP XML

PHPXMLパーサー PHPSimpleXMLパーサー PHPSimpleXML-取得 PHP XMLExpat PHP XML DOM

PHP -AJAX

AJAXイントロ AJAX PHP AJAXデータベース AJAX XML AJAXライブ検索 AJAXポール

PHPの

PHPの例 PHPコンパイラ PHPクイズ PHP演習 PHP証明書

PHPリファレンス

PHPの概要 PHP配列 PHPカレンダー PHPの日付 PHPディレクトリ PHPエラー PHP例外 PHPファイルシステム PHPフィルター PHP FTP PHP JSON PHPキーワード PHP Libxml PHPメール PHP数学 PHPその他 PHP MySQLi PHPネットワーク PHP出力制御 PHP正規表現 PHP SimpleXML PHPストリーム PHP文字列 PHP変数の処理 PHPXMLパーサー PHP Zip PHPタイムゾーン

PHPフォームの検証


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


PHPフォームの検証

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

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

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

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

Field Validation Rules
Name Required. + Must only contain letters and whitespace
E-mail 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/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">

エクスプロイトの試みは失敗し、害はありません。


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つのことが行われます。

  1. ユーザー入力データから不要な文字(余分なスペース、タブ、改行)を削除します(PHPのtrim()関数を使用)
  2. ユーザー入力データから円記号(\)を削除します(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の場合、フォームは送信されています-検証する必要があります。まだ送信されていない場合は、検証をスキップして空白のフォームを表示してください。

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

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