フォームの検証
PHP フォームの検証
この章では、PHP を使用してクライアントから送信されたフォーム データを検証する方法を紹介します。
PHP フォームを扱うときはセキュリティを考慮する必要があります。
この章では、ハッカーやスパムを防ぐために、フォームのデータセキュリティ検証を?qū)g行する必要がある、PHP フォームデータの安全な処理について説明します。
この章で紹介する HTML フォームには、次の入力フィールドが含まれています: オプションのテキスト フィールド、ラジオ ボタン、送信ボタンが必要です:
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>php.cn</title> <style> .error {color: #FF0000;} </style> </head> <body>
<?php // 定義變量并默認(rèn)設(shè)置為空值 $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"]); // 檢測(cè)名字是否只包含字母跟空格 if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $nameErr = "只允許字母和空格"; } } if (empty($_POST["email"])) { $emailErr = "郵箱是必需的"; } else { $email = test_input($_POST["email"]); // 檢測(cè)郵箱是否合法 if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) { $emailErr = "非法郵箱格式"; } } if (empty($_POST["website"])) { $website = ""; } else { $website = test_input($_POST["website"]); // 檢測(cè) 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 フォーム コードを見(jiàn)てみましょう:
テキスト フィールド
"名字", "E-mail", 及"網(wǎng)址"字段為文本輸入元素,"備注"字段是 textarea。HTML代碼如下所示: “名字”: <input type="text" name="name"> E-mail: <input type="text" name="email"> 網(wǎng)址: <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"] 変數(shù)とは何ですか?
$_SERVER["PHP_SELF"] は、ドキュメント ルートに関連する、現(xiàn)在実行中のスクリプトのファイル名を返すスーパー グローバル変數(shù)です。
そのため、$_SERVER["PHP_SELF"] は、別のページにジャンプするのではなく、現(xiàn)在のページにフォーム データを送信します。
htmlspecialchars() メソッドとは何ですか?
htmlspecialchars() 関數(shù)は、いくつかの事前定義された文字を HTML エンティティに変換します。定義された文字は次のとおりです:
· & (へへ) は &
· "(二重引用符) は & quot;
· '(一重引用符) は ' ) になります & lt; · & gt; (より大きい) になる & gt;
クロスサイト スクリプティング HTTP リンクが攻撃に使用される場(chǎng)合、$_SERVER["PHP_SELF"] サーバー変數(shù)もスクリプトに埋め込まれます。クロスサイト スクリプティングは実行可能ファイルのパスに付加されるため、$_SERVER["PHP_SELF"] 文字列には HTTP リンクの背後にある JavaScript プログラム コードが含まれます。
XSS は CSS (クロスサイト スクリプト)。ユーザーが Web ページを閲覧すると、悪意のある攻撃者は Web ページに悪意のある HTML コードを挿入し、悪意のあるユーザーの特別な目的を達(dá)成するために 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://miracleart.cn/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 コードは、ページの読み込み時(shí)に実行されます (ユーザーにはポップアップ ボックスが表示されます)。 これは、PHP_SELF 変數(shù)がハッカーによってどのように悪用されるかを示す簡(jiǎn)単な例にすぎません。
<script> タグには任意の JavaScript コードを追加できることに注意してください。ハッカーはこれを使用してページを別のサーバーのページにリダイレクトすることができ、ページ コード ファイルは悪意のあるコードを保護(hù)することができ、コードはグローバル変數(shù)を変更したり、ユーザーのフォーム データを取得したりすることができます。
$_SERVER["PHP_SELF"] の悪用を回避するには?
$_SERVER["PHP_SELF"] は、htmlspecialchars() 関數(shù)を使用することで回避できます。
フォームのコードは次のようになります:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars()事前定義された文字を HTML エンティティに変換します。ここで、ユーザーが PHP_SELF 変數(shù)を悪用したい場(chǎng)合、結(jié)果は次のように出力されます:
<form method="post" action="test_form.php/"><script>alert('hacked') </script> ;">
この脆弱性を悪用する試みは失敗しました。
PHP を使用してフォームデータを検証する
まず第一に、PHP の htmlspecialchars() 関數(shù)を通じてユーザーによって送信されたすべてのデータを処理します。
htmlspecialchars() 関數(shù)を使用するとき、ユーザーが次のテキスト フィールドを送信しようとしたとき:
<script>location.href('http://miracleart.cn')</script>
このコードは次のような HTML エスケープ コードとして保存されるため実行されません:
<script>location.href('http://miracleart.cn')</script>
上記コードは安全であり、通常どおりページに表示したり、電子メールに挿入したりできます。
ユーザーがフォームを送信すると、次の 2 つのことを行います:
1. PHP の Trim() 関數(shù)を使用して、ユーザー入力データ?jī)?nèi)の不要な文字 (スペース、タブ、改行など) を削除します。
2. PHPのstripslashes()関數(shù)を使用して、ユーザー入力データ()のバックスラッシュを削除します
次に、これらのフィルタリング関數(shù)を自分で定義した関數(shù)に記述してみましょう。これにより、コードの再利用性が大幅に向上します。
関數(shù)にtest_input()という名前を付けます。
ここで、test_input() 関數(shù)を使用して $_POST 內(nèi)のすべての変數(shù)を検出できます。スクリプト コードは次のとおりです:
Example
<?php // 定義變量并默認(rèn)設(shè)置為空值 $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; } ?>
上記のスクリプトを?qū)g行するときは、$_SERVER["REQUEST_METHOD] を使用することに注意してください。 "] フォームが送信されたかどうかを確認(rèn)します。 REQUEST_METHOD が POST の場(chǎng)合、フォームが送信され、データが検証されます。フォームが送信されない場(chǎng)合、検証はスキップされ、空白で表示されます。
1. PHPのtrim()関數(shù)を使用して、ユーザー入力データ?jī)?nèi)の不要な文字(スペース、タブ、改行など)を削除します。
2. PHPのstripslashes()関數(shù)を使用してユーザー入力データのバックスラッシュを削除します()
3. test_input()関數(shù)を使用して$_POST內(nèi)のすべての変數(shù)を検出します