PHPのフィルター関数を使用した入力検証

WBOY
リリース: 2016-07-25 09:10:27
オリジナル
939 人が閲覧しました
  1. if (isset($_GET["value"])) {
  2. $value = $_GET["value"];
  3. }
  4. else {
  5. $value = false;
  6. }
  7. if (is_numeric($value) && ($value >= 15 && $value <= 20)) {
  8. // コードを実行します
  9. }
  10. else {
  11. // 問題を処理します
  12. }
コードをコピーします

これは非常に基本的な例であり、見たい行をさらに書いています。 まず、$_GET が何に設定されているかを判断できないため、コードはスクリプトが転倒しないように適切なチェックを実行します。 2 つ目は、USD 値が $_GET 値から直接指定されているため、「ダーティ」変数になっているという事実です。何かが壊れた場合に備えて、コード内の他の場所でドル値を使用しないように注意する必要があります。 次に、さまざまなモーダル粒子のために 16.0 の is_numeric() 関数が有効であるという問題があります。 最後に、ステートメントが口から出た場合、コード トレースを実行するときに余分なロジックが通過するという事実に対処する必要があります。 次に、上記の例を比較します。

  1. $value = filter_input(INPUT_GET, "value", FILTER_VALIDATE_INT,
  2. array("options" =>array("min_range" =>15, "max_range" =>20) )));
  3. if ($value) {
  4. // コードを実行します
  5. }
  6. else {
  7. // 問題を処理します
  8. }
コードをコピー

すると、暖かくてモヤモヤした気分になりませんか? filter_input() によって処理される $_GET 値は設定されていないため、スクリプトが正しい情報を受信して​​いるかどうかを強調する必要はありません。 また、ドルの値は割り当て前に検証されるため、ダーティであることを心配する必要もありません。 現在のバージョン 16.0 は無効になっていることに注意してください。 最後に、ロジックは複雑ではなくなりました。これは、真実の値を簡単にチェックするだけです (filter_input() は、検証が失敗した場合は false を返し、$_GET["value"] が設定されていない場合は null を返します。 明らかに、実際の設定では、構成ファイルのどこかに保存されている変数の配列を抽出して、ビジネス ロジックに入ることなく何かを変更できるようにすることができます。素敵! ここで、単純なスクリプトでいくつかの $_GET または $_POST 変数を取得すると便利かもしれないと考えているかもしれませんが、内部で関数やクラスを使用する場合はどうでしょうか?幸いなことに、filter_var() があります。 filter_var() 関数は、filter_input() と同じことを行うために導入されました。

  1. //これはサンプル関数です。これを実際にメール送信に使用しないのは愚かです。

  2. //

  3. function emailUser($email) {
  4. mail($email, "これが私のメールです", "Some Content");
  5. }

コードをコピー

ここに危険があります、そうですかany 電子メールを送信しようとすると、文字通り任意の値を stopmail() 関数 $email に保存できます。これにより、電子メールが送信できなくなったり、最悪の場合、悪意のある機能が使用されたりする可能性があります。 私が見てきた人々がやっているのは、 mail() の結果をチェックすることです。これは、関数が正常に完了したかどうかを確認するには便利ですが、有害なのは、返された時間値です。 次のようなものははるかに健全です。

  1. // これはサンプル関数です。実際に電子メールを送信するためにこれを使用しないでください。
  2. // それは愚かなことです。
  3. function emailUser($email) {
  4. $email = filter_var($ email, FILTER_VALIDATE_EMAIL);
  5. if ($email !== false) {
  6. mail($email, "Here is my email", "Some Content");
  7. }
  8. else {
  9. // 無効なメールアドレスの問題を処理します
  10. }
  11. }
コードをコピー

上記の質問を含む多くの例が使用されており、それらは基本的なものです。 filter_var() または filter_input() は基本的なチェック以外には使用できないと考えているかもしれません。また、FILTER_CALLBACK と呼ばれるフィルターをこれらの関数に渡すことができます。 FILTER_CALLBACK を使用すると、フィルタリングされる変数を受け入れる作成した変数を渡すことができます。ここから始めることができます。さらに楽しむために、独自のビジネス ロジックをフィルタリングに適用し始めることができます。 いくつかの潜在的な落とし穴 これらの機能は非常に優れており、コードのセキュリティと信頼性の向上に役立つ、これまでに説明した非常に強力なフィルタリングを行うことができます。しかし、潜在的な欠点がいくつかあるので、それを指摘しないと気が済まないと思います。 主な欠陥は、フィルターがその機能に適用されている限りです。最後の例として、電子メール検証を使用する - 5.2.14 と 5.3.3 FILTER_VALIDATE_EMAIL の間で変更される電子メール アドレスを処理する方法。同じバージョンの PHP を実行しているすべてのアプリケーションが技術的に有効な電子メール アドレスを持っていると仮定しても、おそらくそうはしたくないでしょう。使用しているフィルターを必ず確認してください。 2 番目の落とし穴は、フィルターを入れていればコードは安全だと考えていることです。フィルターされた変数はある程度の助けにはなりますが、コードが悪用から 100% 安全になるわけではありません。これについて話したいのですが、この記事の範囲を超えており、文字数がすでにかなり多くなってしまいました。 要約: コード内に 1 つの関数を 1 つだけ作成し、異なるデータ型と異なる値を渡すとどうなるかを確認すると思います。 次に、ここで説明したフィルタリング方法のいくつかを適用して、コードの動作に違いがあるかどうかを確認してください。あなたのコメントについてどう思うか知りたいです。



ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート