PHPフォームの検証

PHP フォームの検証

この章では、PHP を使用してクライアントから送信されたフォーム データを検証する方法を紹介します。

ユーザー入力は可能な限り (クライアント スクリプト経由で) 検証される必要があります。ブラウザーの検証が高速になり、サーバーの負荷が軽減されます。

ユーザー入力をデータベースに挿入する必要がある場合は、サーバー検証の使用を検討する必要があります。サーバー上のフォームを検証する良い方法は、別のページにジャンプするのではなく、フォームをそれ自体に渡すことです。これにより、ユーザーは同じフォーム ページでエラー メッセージを取得できます。ユーザーがエラーを見つけやすくなります。

PHP フォームを扱うときはセキュリティを考慮する必要があります。

この章では、ハッカーやスパムを防ぐために、フォームのデータセキュリティ検証を実行する必要がある、PHP フォームデータの安全な処理について説明します。

PHP フォーム検証の例

QQ图片20161009114426.png

上記のフォームでは次の検証ルールが使用されています:

QQ图片20161009114556.png

まず、純粋な HTML コードを見てみましょうこの形式:

テキスト

名前、メールアドレス、ウェブサイトのフィールドはテキスト入力要素であり、コメントフィールドはテキストボックスです。 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

フォーム要素

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

<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 文字が置き換えられることを意味します。これにより、攻撃者が HTML または JavaScript コードをフォームに挿入してコードを悪用する (クロスサイト スクリプティング攻撃) ことを防ぎます。


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

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

ページで PHP_SELF を使用している場合、ユーザーはアンダースコアを入力してクロスサイト スクリプティング (XSS) を実行できます。

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


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


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

< フォーム メソッド="post" action="test_form.php">


これまでのところ、すべてが正常に動作しています。

ただし、ユーザーがアドレス バーに次の URL を入力した場合:

//m.sbmmt.com/test_form.php/%22%3E%3Cscript%3Ealert('php')%3C/script% 3E


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

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


このコードは、スクリプトとプロンプト コマンドを追加します。ページが読み込まれると、JavaScript コードが実行されます (ユーザーにはツールヒントが表示されます)。これは、PHP_SELF 変数が悪用される方法を示す、単純で無害な例にすぎません。


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


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

htmlspecialchars()

関数を使用すると、$_SERVER["PHP_SELF"] の悪用を防ぐことができます。 フォームのコードは次のとおりです:

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


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

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


悪用は不可能、害はありません!


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

最初に行う必要があるのは、PHP の htmlspecialchars() 関数を介してすべての変数を渡すことです。ユーザーがテキストフィールドに次の内容を送信しようとすると、htmlspecialchars() 関数を使用します:

<script>location.href('//m.sbmmt.com')</script>

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

<script>location.href('//m.sbmmt.com')</script>

これで、このコードはページまたは電子メールに安全に表示できます。

ユーザーがフォームを送信したら、さらに 2 つのことを行う必要があります:

1. (PHP の Trim() 関数を使用して) ユーザー入力データ内の不要な文字 (余分なスペース、タブ、改行) を削除します

2. (PHPのstripslashes()関数経由) ユーザー入力データのバックスラッシュを削除します()

次に、チェック関数を作成します(これはコードを何度も書くより効率的です)。

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


学び続ける
||
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> <style> .error {color: #FF0000;} </style> </head> <body> <?php // 定义变量并默认设置为空值 $nameErr = $emailErr = $genderErr = $websiteErr = ""; $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_POST["name"])) { $nameErr = "名字是必需的"; } else { $name = test_input($_POST["name"]); // 检测名字是否只包含字母跟空格 if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $nameErr = "只允许字母和空格"; } } if (empty($_POST["email"])) { $emailErr = "邮箱是必需的"; } else { $email = test_input($_POST["email"]); // 检测邮箱是否合法 if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) { $emailErr = "非法邮箱格式"; } } if (empty($_POST["website"])) { $website = ""; } else { $website = test_input($_POST["website"]); // 检测 URL 地址是否合法 if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) { $websiteErr = "非法的 URL 的地址"; } } if (empty($_POST["comment"])) { $comment = ""; } else { $comment = test_input($_POST["comment"]); } if (empty($_POST["gender"])) { $genderErr = "性别是必需的"; } else { $gender = test_input($_POST["gender"]); } } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?> <h2>PHP 表单验证实例</h2> <p><span class="error">* 必需字段。</span></p> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 名字: <input type="text" name="name" value="<?php echo $name;?>"> <span class="error">* <?php echo $nameErr;?></span> <br><br> E-mail: <input type="text" name="email" value="<?php echo $email;?>"> <span class="error">* <?php echo $emailErr;?></span> <br><br> 网址: <input type="text" name="website" value="<?php echo $website;?>"> <span class="error"><?php echo $websiteErr;?></span> <br><br> 备注: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea> <br><br> 性别: <input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?> value="female">女 <input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?> value="male">男 <span class="error">* <?php echo $genderErr;?></span> <br><br> <input type="submit" name="submit" value="Submit"> </form> <?php echo "<h2>您输入的内容是:</h2>"; echo $name; echo "<br>"; echo $email; echo "<br>"; echo $website; echo "<br>"; echo $comment; echo "<br>"; echo $gender; ?> </body> </html>
  • おすすめコース
  • コースウェアのダウンロード
現時点ではコースウェアはダウンロードできません。現在スタッフが整理中です。今後もこのコースにもっと注目してください〜