フォームの検証

PHP フォームの検証

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

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

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

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

<!DOCTYPE HTML>
 <html>
 <head>
     <meta charset="utf-8">
     <title>php.cn</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;
 }
 ?>
 

まず、純粋な HTML フォーム コードを見てみましょう:

テキスト フィールド

"名字", "E-mail", 及"网址"字段为文本输入元素,"备注"字段是 textarea。HTML代码如下所示:
“名字”: <input type="text" name="name">
E-mail: <input type="text" name="email">
网址: <input type="text" name="website">
备注: <textarea name="comment" rows="5" cols="40"></textarea>

ラジオボタン

「性別」フィールドはラジオボタンであり、HTML コードは次のようになります:

Gender:

<input type="radio" name="gender" value=" Female " >女性

<input type="radio" name="gender" value="male">男性


Form要素

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 エンティティに変換します。定義された文字は次のとおりです:

· & (へへ) は &

· "(二重引用符) は & quot;

· '(一重引用符) は ' ) になります & lt; · & gt; (より大きい) になる & gt;

クロスサイト スクリプティング HTTP リンクが攻撃に使用される場合、$_SERVER["PHP_SELF"] サーバー変数もスクリプトに埋め込まれます。クロスサイト スクリプティングは実行可能ファイルのパスに付加されるため、$_SERVER["PHP_SELF"] 文字列には HTTP リンクの背後にある JavaScript プログラム コードが含まれます。

XSS は CSS (クロスサイト スクリプト)。ユーザーが Web ページを閲覧すると、悪意のある攻撃者は 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">

これで大丈夫です。

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

//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 変数がハッカーによってどのように悪用されるかを示す簡単な例にすぎません。

<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/"><script>alert('hacked') </script> ;">

この脆弱性を悪用する試みは失敗しました。


PHP を使用してフォームデータを検証する

まず第一に、PHP の htmlspecialchars() 関数を通じてユーザーによって送信されたすべてのデータを処理します。

htmlspecialchars() 関数を使用するとき、ユーザーが次のテキスト フィールドを送信しようとしたとき:

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

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

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

上記コードは安全であり、通常どおりページに表示したり、電子メールに挿入したりできます。

ユーザーがフォームを送信すると、次の 2 つのことを行います:

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

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

次に、これらのフィルタリング関数を自分で定義した関数に記述してみましょう。これにより、コードの再利用性が大幅に向上します。

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

ここで、test_input() 関数を使用して $_POST 内のすべての変数を検出できます。スクリプト コードは次のとおりです:

Example

<?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;
 }
 ?>

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

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

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

3. test_input()関数を使用して$_POST内のすべての変数を検出します


学び続ける
||
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>php.cn</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; } ?>
  • おすすめコース
  • コースウェアのダウンロード
現時点ではコースウェアはダウンロードできません。現在スタッフが整理中です。今後もこのコースにもっと注目してください〜