PHP フォームと検証
1. 概要
PHP はページを処理するときに、URL とフォーム変数、アップロードされたファイル、利用可能な Cookie、Web サーバーと環境変数をチェックします。この情報は、配列 $_GET、$_POST、$_FILES、$_COOKIE、$_SERVER、$_ENV を通じて直接アクセスできます。つまり、PHP は、クエリ文字列に設定された変数、投稿リクエストの件名コンテンツ、アップロードされたファイル、Cookie、Web サーバー、Web サーバーが実行される環境などの情報を保存します。もちろん、$_REQUEST 変数もあります。これは、前の 6 つの配列のすべての値を含む大きな配列です。
変数_順序
$_REQUEST 配列に要素を配置するときに、両方の配列に同じ名前のキーがある場合、PHP は php.ini の variables_order 設定ディレクティブに基づいてそれらの間の接続を切断する方法を決定します。デフォルトでは、variables_order の値は EGPCS (または php.ini 推奨構成ファイルが使用されている場合は GPCS) です。つまり、PHP はまず環境変数を $_REQUEST に追加し、次にクエリ文字列 (get)、post、cookie、および Web サーバー変数を順に追加します。この場合、デフォルトは P の後の C であるため、username という名前の Cookie は、同じく username という名前の post 変数を上書きします。 php.ini 推奨ファイル内の GPCS 値は、$_ENV 配列内の環境変数が $_REQUEST 配列に追加されないことを示していることに注意してください。
track_vars
PHP 4.1 より前には、これらの自動グローバル変数は存在しませんでした。当時は、$HTTP_COOKIE_VARS、$HTTP_ENV_VARS、$HTTP_GET_VARS、$HTTP_POST_VARS、$HTTP_POST_FILES、および $HTTP_SERVER_VARS という名前の単なる通常の配列でした。継承上の理由から、これらの配列は引き続き有効ですが、新しく追加された配列の方が使いやすくなっています。これらの古い配列は、track_vars 構成ディレクティブがオンの場合にのみ割り当てられます。 (このオプションは php4.0.3 以降常に有効になっており、track_vars= によって設定されなくなりました)
register_globals
register_globals 構成ディレクティブの値が on の場合、上記のすべての変数はグローバル名前空間の変数としても使用されます。したがって、$_GET['password'] の値には、$password を使用してアクセスすることもできます。これは便利ですが、重大なセキュリティ問題も引き起こします。 PHP 4.2 以降、 register_globals のデフォルト値は off です。
上記は、PHP フォームでのデータ送信に関連する関連知識の簡単な紹介です。 PHP コードのセキュリティを確保するために、PHP フォーム ハンドラーは、データ検証と出力エスケープという 2 つの非常に重要な手順を無視できません。入力された情報がプログラムに受け入れられるものであることを確認し、悪意のあるユーザーがあなたのサイトを使用して他のサイトを攻撃しないようにしてください。
2. データの検証
留意すべきいくつかの点:
1. 受信したすべてのデータは、フロントエンド (HTML および JavaScript) によって制限されていない可能性があります。これは、コンピューター ハッカーから手動で作成されたデータ リクエスト、またはプログラムの脆弱性を発見した悪意のあるユーザーからのリクエストである可能性があります。
2. さまざまな種類のフォーム要素を空白のままにすると、$_GET と $_POST の要素の値が異なります。空のテキスト ボックス、空のテキスト領域、および空のファイル アップロード フィールドの値は、長さ 0 の文字列です。チェックを外したチェックボックスとラジオボタンは、$_GET と $_POST に値を格納しません。通常、ブラウザは単一選択ドロップダウン リストで 1 つの項目を強制的に選択します。複数選択ドロップダウン リストの場合、項目が選択されていない場合、結果はチェック ボックスと同じになります。つまり、チェック ボックスは存続しません。 $_GET と $_POST の値。
3. $_GET および $_POST の値は常に文字列です。たとえば、誰かが text_price テキスト ボックスに 02201 を入力してフォームを送信した場合、$_POST['text_price'] の値は、整数 2201 ではなく、5 桁の文字列「02201」になります。
検証例
1. 確認必須事項
strlen() を使用して、$_GET または $_POST の要素の値をテストします。多くの人は、何らかの好みで、テキスト ボックスに値が入力されているかどうかをテストするために、strlen() の代わりに empty() を使用することがよくあります。ただし、PHP のブール計算規則によれば、文字 0 は FALSE に変換される可能性があるため、これが問題を引き起こすことがよくあります。たとえば、total_val テキスト ボックスに 0 を入力すると、empty($_POST['total_val']) テストの結果は TRUE になります。フォーム検証の観点から見ると、これは明らかに間違っています。
?
<?php if (! strlen($_POST['keyname']) { echo 'keyname is null'; } ?>
?
2. デジタル検証
A. ゼロ以上の整数かどうかを判断するには、ctype_digital() 関数を直接使用して判断します。
<?php if (! ctype_digit($_POST['keyname']) { echo 'Your keyname must be a number bigger than or equal to zero.'; } ?>
PHP 数値検証の一般的な方法は、is_numeric() 関数を使用して数値を検証することです。残念ながら、 is_numeric() によって考慮される数値は、人間の思考よりもコンピューターの特性と一致しています。たとえば、16 進数の数字列 0xCAFE と指数数字列 10e40 は両方とも is_numeric() の数値です。
在PHP5.1之前,如果向ctype_digit()传递一个空字符串,它会返回TRUE;显然这不是我们要的结果,因此首先要验证下它是否为空。
<?php if (! strlen($_POST['keyname']) && ! ctype_digit($_POST['keyname']) { echo 'Your keyname must be a number bigger than or equal to zero.'; } ?>
?
B、判断是否为正整数或负整数,可以采用提交值与值在转换成证书之后返回的字符串进行比较。
1)类型转换法验证整数
<?php if ($_POST['keyname'] != strval(intval($_POST['keyname']))) { echo 'Your keyname must be an integer.'; } ?>
? intval('025')返回25,intval('-2300')返回-2300, intval('2.2')返回2, intval('-8.8')返回-8, intval('sdf')返回0.
2)类型转换法验证小数
<?php if ($_POST['keyname'] != strval(floatval($_POST['keyname']))) { echo 'Your keyname must be an number.'; } ?>
?
floatval('3.025')返回3.025,floatval('-23.007')返回-23.007 floatval('sdf')返回0.
3、正则表达式验证
1)字符串中只能包含数字
<?php $str = "0238"; if (preg_match('/^\d+$/', $str)) { echo 'match'; } ?>
2)检验PHP变量名是否符合规范
<?php function pregPHPVar($str) { if (preg_match('/\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $str)) { return 'match'; } else { return 'mismatch'; } } echo prefPHPVar('$str'); // print match; echo prefPHPVar('$1str'); // print mismatch; ?>
3)邮箱验证
<?php $email = "your.name@domain.name.info"; if (! preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/', $email)) { echo 'Email is invalid.'; } ?>
?
?
?