この章では、PHP を使用してクライアントから送信されたフォーム データを検証する方法を紹介します。
PHP フォームを扱うときはセキュリティを考慮する必要があります。 この章では、PHP フォーム データの安全な処理について説明します。ハッカーやスパムを防ぐために、フォームのデータ セキュリティ検証を実行する必要があります。 |
この章で説明する HTML フォームには、必須およびオプションのテキスト フィールド、ラジオ ボタン、および送信ボタンの入力フィールドが含まれています。
上記のフォーム検証ルールは次のとおりです。
分野 | 検証ルール |
---|---|
名前 | しなければならない。 +文字とスペースのみを含めることができます |
電子メール | しなければならない。 + は有効な電子メール アドレスである必要があります (「@」 と「.」を含む) |
URL | オプション。存在する場合は、有効な URL が含まれている必要があります |
述べる | オプション。複数行の入力フィールド (テキストフィールド) |
性別 | しなければならない。 どちらかを選択する必要があります |
まず、純粋な HTML フォームのコードを見てみましょう。
「名前」「電子メール」「ウェブサイト」フィールドはテキスト入力要素であり、「備考」フィールドはテキストエリアです。 HTML コードは次のようになります。
「名前」: <input type="text" name="name">電子メール: <input type="text" name="email">Web サイト: <input type="text" name="website">備考: <textarea name="comment" rows="5"cols="40"></textarea>
「性別」フィールドはラジオ ボタンであり、HTML コードは次のようになります。
性別:<input type="radio" name="gender" value="女性">女性<input type="radio" name="gender" value="male">男性
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 エンティティに変換します。 事前定義された文字は次のとおりです。 & (アンパサンド) は & になります。 " (二重引用符) は " になります。 ' (一重引用符) は ' になります。 < (未満) は < になります。 > (より大きい) になる> |
$_SERVER["PHP_SELF"] 変数はハッカーによって使用される可能性があります。
ハッカーがクロスサイト スクリプティング HTTP リンクを使用して攻撃する場合、$_SERVER["PHP_SELF"] サーバー変数もスクリプトに埋め込まれます。その理由は、クロスサイト スクリプティングが実行可能ファイルのパスに追加されるため、文字列 $_SERVER["PHP_SELF"] には HTTP リンクの背後にある JavaScript プログラム コードが含まれることになります。
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.codercto.com/test_form.php/%22%3E%3Cscript%3Ealert('ハッキング')%3C/script%3E
上記の URL は次のコードに解析されて実行されます。
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
コードに script タグが追加され、alert コマンドが追加されました。この Javascript コードは、ページの読み込み時に実行されます (ユーザーにはポップアップ ボックスが表示されます)。これは、PHP_SELF 変数がハッカーによってどのように悪用されるかを示す簡単な例にすぎません。
<script> タグ内には任意の JavaScript コードを追加できることに注意してください。ハッカーはこれを使用して、ページを別のサーバー上のページにリダイレクトすることができ、コードはグローバル変数を変更したり、ユーザーのフォーム データを取得したりする可能性があります。
$_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 の htmlspecialchars() 関数を通じてユーザーから送信されたすべてのデータを処理します。
htmlspecialchars() 関数を使用すると、ユーザーは次のテキスト フィールドを送信しようとします。
<script>location.href('http://www.codercto.com')</script>
このコードは次のように HTML エスケープ コードとして保存されるため、実行されません。
<script>location.href('http://www.codercto.com')</script>
上記のコードは安全であり、通常どおりページに表示したり、電子メールに挿入したりできます。
ユーザーがフォームを送信すると、次の 2 つの処理が行われます。
PHPのtrim()関数を使用して、ユーザー入力データ内の不要な文字(スペース、タブ、改行など)を削除します。
PHPのstripslashes()関数を使用して、ユーザー入力データからバックスラッシュ()を削除します。
次に、これらのフィルタリング関数を自分で定義した関数に記述してみましょう。これにより、コードの再利用性が大幅に向上します。
関数に 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"]); test_input($_POST["ウェブサイト"]); $comment= test_input($_POST["comment"]); $gender= test_input($_POST["gender"]);} functiontest_input($data){ $data= ($data); $data= ストリップスラッシュ($data); $data= htmlspecialchars($data); }?>
上記のスクリプトを実行するとき、$_SERVER["REQUEST_METHOD"] を使用してフォームが送信されたかどうかを検出することに注意してください。 REQUEST_METHOD が POST の場合、フォームが送信され、データが検証されます。フォームが送信されない場合、検証はスキップされ、空白で表示されます。
上記の例での入力項目の使用は任意であり、ユーザーがデータを入力しなくても通常どおり表示されます。
次の章では、ユーザーが入力したデータを検証する方法を紹介します。