2

PHP を使い始めたとき、PHP の型付けが緩く、習得が容易であることに本当に満足していました。しかし、それに慣れるにつれて、大まかに型付けされていると、スクリプトを単純化するのではなく、実際にはスクリプトが複雑になることに気付きました。$_POSTそして今、PHP 変数、特に入力変数 ( 、$_GET$_COOKIE$_REQUESTおよびいくつかの変数) を厳密に型指定する方法を探しています$_SERVER

また、SQL インジェクションやその他のエラーが発生しやすい検証プロセスの多くを「忘れる」ことができるように、このプロセスで検証とサニタイズを非表示にしたいと考えています。これをどのようにしたいかの大まかなスケッチがあります。

まず、変数を宣言します。できればOOPで

$varClass->post->variable_name->type('STR', 'SQL', 'EMAIL');  

// or as an array  
$_MY_POST['variable_name'] = array('STR', 'SQL', 'EMIAIL');

これで、宣言されていないすべての変数を定義済みの PHP GLOBAL から削除し、変数の型を使用してそれらをグローバル配列で直接検証およびサニタイズすることができます。
また、emaill などの検証されていない変数の値を bool false に設定し、un-submitted を null に設定して、データの検証中に使用することもできます。ただし、車輪を再発明する前に、次のことを望んでいました。

私の問題を解決するのにすでに役立つライブラリに私を案内してくれる人がいるでしょうか?
このワイルドなファンタジーを追求してはいけない理由があるとしたら? これを達成するためのより良い、より明確な方法はありますか?
このアイデアについて、その他の一般的な考えはありますか?

4

3 に答える 3

4

http://sourceforge.net/p/php7framework/wiki/input/

デフォルトでスーパーグローバルをラップしますが、ローカル オブジェクトをインスタンス化することもできます$postFilter = new input($_POST)。次のように手動で使用することになっています。

 $_POST->email->sql["variable_name"]
 $_POST->array->int["order_list"]

$_POST["raw"] アクセスが見られると文句を言います。

ただし、フィルター リストを事前に定義することもできます。私はそれをクラス定義の中心で行います。これは、手動でコードを調べたり、文字列を書き換えてデータ形式や型を適用したくない古いアプリケーションのアドオンであると想定されています。

 var $__rules = array(
      "variable_name" => "email,sql",
      "order_id" => "int,range:0:500",
      "order_list" => "array,int",
 );

しかし、私は個人的に ->sql エスケープを時期尚早に避けます。利用可能な場合は、PDO とパラメーター化された SQL を使用する必要があります。しかしもちろん、中央のエスケープ機能は注意よりも優れています。

また、カスタム フィルターを定義することもできます。たとえば、グローバル関数を取り上げます。

于 2010-12-02T12:58:59.047 に答える
4

PHP の型付けが緩かった

いいえ - 緩く型付けされているのではなく、動的に型付けされています - 微妙な違いがあります。

スクリプトを単純化するのではなく、実際にスクリプトを複雑にしました

私の経験は正反対です。

検証と消毒をお願いします...

強力な型付けは、入力の検証に対処する方法ではありません。特に、HTTP のようなメディア (緩く型付けされている) ではそうではありません。考えられるすべての入力に対してタイプ検証を行うのは現実的ではありません-メールアドレスを文字列に保存できることは確かですが、それはメールアドレスが正しくフォーマットされていることを意味しません.ファイルが画像であることをどのように確認しますか? 厳密な型指定では、開始日が終了日よりも前になるようにするにはどうすればよいですか?

PHP の最近のバージョンにはフィルター機能がありますが、私 (および私が知っているほとんどの人) は長い間、独自の入力検証ライブラリをアトムに使用しており、2 次検証 (複数の入力の相対値を比較する) にはカスタム コードが必要です。入力のタイプを変更する必要があるのは、結果としてデータが失われない場合のみです (たとえば、文字列から数値への変換 - ただし、結果としてデータが失われないようにする必要があります)。入力 var の予想される型を宣言することは、変数の実際の型を宣言することと同じくらい難しくありません。処理に適した入力の有効な表現を作成できない場合、コードはユーザーの意図を決して推測すべきではありません。入力を拒否し、ユーザー/呼び出し元の手順に通知する必要があります。

多くの検証は非常に文脈に依存する場合があります。たとえば、英国の 02/12/2010 は、米国の同じ日付の 10 か月後です。

強く型付けされているかのように PHP を動作させたい場合は、PHPLintを参照してください。

SQLインジェクションを「忘れる」ことができるように

いいえ!入力を検証/サニタイズし、出力先に応じて出力を変換します! HTML に書き込むための文字列の正しい表現は、URL に書き込むこととは異なり、データベースに書き込むこととは異なります。

于 2010-12-02T13:19:19.147 に答える
0

これを大部分行うアプリ用のフォーム システムを作成しました。

  • 期待しているすべてのフィールドとそれらに関するルールを定義します (データ型、最小値だけでなく、最小値、最大値、列挙など)
  • ノンスは、フォームを保護し、フォームが送信されたかどうかを判断するために使用されます
  • セッションが回復されると、シリアル化された各フォームは、適切なノンスが送信されたかどうかを確認し、送信された場合は送信されたと見なします
    • 次に、既知の各フィールドをチェックし、送信されたデータを取得して検証します
    • 無効な場合、すべてのフィールドをデフォルトにリセットできます

これは、フォームのレンダリングとクライアント側の検証ルールの生成も処理するため、ルールを 1 回 (サーバー側で) 記述するだけで、クライアント側とサーバー側の両方の検証が自動的に行われます。データ型の規則は、各フィールドに対して定義する必要がある最低限のものです。

残念ながら、これはオープン ソースではなく、オープン ソースにする許可もありません。このようなものを長い間探しましたが、実際には何も見つかりませんでした。Pear Quickforms ライブラリは最も近いものでしたが、すべての検証をカバーしているようには見えず、ひどいドキュメントがありました。

于 2010-12-02T12:32:45.323 に答える