PHPフォームの検証

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

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


この章で紹介する HTML フォームには、次の入力フィールドが含まれています: オプションのテキスト フィールド、ラジオ ボタン、および送信ボタンとともに使用する必要があります:


<!DOCTYPE HTML>
 <html>
 <head>
     <meta charset="utf-8">
     <title>PHP.cn</title>
 </head>
 <body>
 <h2>PHP 表单验证实例</h2>
 <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 
    名字: <input type="text" name="name" value="">
     <br>
     E-mail: <input type="text" name="email" value="">
     <br>
     网址: <input type="text" name="website" value="">
     <br>
     备注: <textarea name="comment" rows="5" cols="40"></textarea>
     <br>
     性别:
     <input type="radio" name="gender"  value="female">女
     <input type="radio" name="gender"  value="male">男
     <br>
     <input type="submit" name="submit" value="提交">
 </form>
 </body>
 </html>

プログラムの実行結果:

5.png

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

は必須です。 + 文字とスペースのみを含めることができますが必要です。 + 有効な電子メール アドレスである必要があります (「@」と「.」を含む) URL オプション。存在する場合、有効な URL が含まれている必要があります 備考 オプション。 複数行の入力フィールド (テキストフィールド) 性別 は必須です。 どれかを選択する必要があります

コードを個別に見てみましょう:


テキストフィールド

「名前」、「電子メール」、「ウェブサイト」フィールドはテキスト入力要素です。 「フィールド」はテキストエリア textarea です。

HTML コードは次のとおりです:

名前: <input type="text" name="name" value="">
電子メール: <input type=" text" name="email" value="">
ウェブサイト: <input type="text" name="website" value="">
備考: <textarea name="comment" rows="5 「cols = "40"&gt;&lt;/textarea&gt;表示:

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

PHP フォームのセキュリティに関する重要なヒント

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

ページで PHP_SELF を使用している場合、ユーザーはアンダースコアを入力して、css とも呼ばれるクロスサイト スクリプティング (XSS) を実行できます。ヒント: クロスサイト スクリプティング (XSS) は、Web アプリケーションで一般的なコンピューター セキュリティの脆弱性の一種です。 XSS を使用すると、攻撃者は他のユーザーが閲覧している Web ページにクライアント側のスクリプトを入力できます。

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

ここで、URL を使用して送信アドレス「test_form.php」を指定し、上記のコードを次のように変更します:

<form メソッド="post" action="test_form.php">

これで大丈夫です。

ただし、ユーザーがブラウザのアドレス バーに次のアドレスを入力することを考慮してください:

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

上記の URL は次のコードに解析されて実行されます:

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

script タグがコードに追加され、alert コマンドが追加されます。 この Javascript コードは、ページの読み込み時に実行されます (ユーザーにはポップアップ ボックスが表示されます)。 これは、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() 関数を使用した後、ユーザーがテキスト フィールドに次の内容を送信しようとすると:

<script>location.href('http://www.hacked.com')< /script> ;

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

<script>location.href('http://www.hacked.com') < /script>

このコードはページまたはメールに安全に表示できるようになりました。

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

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

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

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

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

これで、test_input() 関数を通じて各 $_POST 変数をチェックできます。スクリプトは次のようになります:

<!DOCTYPE HTML>
 <html>
 <head>
     <meta charset="utf-8">
     <title>PHP中文网(php.cn)</title>
 </head>
 <body>
 
 <?php
 // 定义变量并默认设置为空值
 $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;
 }
 ?>
 
 <h2>PHP 表单验证实例</h2>
 <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
     名字: <input type="text" name="name">
     <br><br>
     E-mail: <input type="text" name="email">
     <br><br>
     网址: <input type="text" name="website">
     <br><br>
     备注: <textarea name="comment" rows="5" cols="40"></textarea>
     <br><br>
     性别:
     <input type="radio" name="gender" value="female">女
     <input type="radio" name="gender" value="male">男
     <br><br>
     <input type="submit" name="submit" value="提交">
 </form>
 
 <?php
 echo "<h2>您输入的内容是:</h2>";
 echo $name;
 echo "<br>";
 echo $email;
 echo "<br>";
 echo $website;
 echo "<br>";
 echo $comment;
 echo "<br>";
 echo $gender;
 ?>
 
 </body>

プログラムを実行して確認してください


: 上記のスクリプトを実行するとき、$_SERVER["REQUEST_METHOD"] を使用してフォームが送信されたかどうかを検出します。 REQUEST_METHOD が POST の場合、フォームが送信され、データが検証されます。フォームが送信されない場合、検証はスキップされ、空白で表示されます。

上記例における入力項目の使用は任意であり、ユーザーが何も入力しなくても正常に表示されます。


次の章では、ユーザーが入力したデータを検証する方法を紹介します。



学び続ける
||
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>PHP.cn</title> </head> <body> <h2>PHP 表单验证实例</h2> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 名字: <input type="text" name="name" value=""> <br> E-mail: <input type="text" name="email" value=""> <br> 网址: <input type="text" name="website" value=""> <br> 备注: <textarea name="comment" rows="5" cols="40"></textarea> <br> 性别: <input type="radio" name="gender" value="female">女 <input type="radio" name="gender" value="male">男 <br> <input type="submit" name="submit" value="提交"> </form> </body> </html>
  • おすすめコース
  • コースウェアのダウンロード
現時点ではコースウェアはダウンロードできません。現在スタッフが整理中です。今後もこのコースにもっと注目してください〜
フォームの検証ルール 名前 電子メール