0

アプリに送信される POST データをサニタイズし、ある程度検証する最善の方法を見つけようとしています。

Router に常駐し、__constructor で呼び出されるこの関数を作成しましたif($_POST)

private function validatePost()
  {
    foreach($_POST as $key => $value) {
      if(preg_match('/[^a-zA-Z]/', $key))
      {
        $this->throwError('POST Error', 'Invalid index name.');
        return;
      }
      if(strlen($value) > $this->postLimit && $this->postLimit != -1)
      {
        $this->throwError('POST Error', 'Posted value to large.');
        return;
      }
      if(substr($key, -2, 2) == 'id' && !is_numeric($value))
      {
        $this->throwError('POST Error', 'Expected a number, didn\'t get one.');
        return;
      }
      else
      {
        //$value = urlencode($value);
      }
      $_POST[$key] = $value;
    }
  }

わざと少し厳しいですが、自分のフレームワーク全体で作ったルールを守れば問題ありません。

$_POST のサイズを制限すると、いくつかの攻撃を阻止するのに本当に役立つと読んだことがあります。この場合、制限なし/デフォルトの制限に -1 を設定します (ただし、構成ファイルで必要に応じてそれ以下に設定できます)。

現在、意図した機能に到達したときにデコードする最良の方法がわからないため、urlencoding をコメントアウトしました。それをエンコードする必要がありますか?それをデコードする最良の方法は何ですか? おそらく、Controller私のすべてのクラスが拡張されているかどうかはマスターにありますか?

他の提案は大歓迎です。

4

1 に答える 1

2

リクエストのサイズを制限したい場合POST、最良のオプションは Web サーバー自体のレベルで行うことです。そのためのツールがあります。Apache を使用するのが最も好きなので、mod_securityを調べることができます。他の Web サーバーにも同様のオプションがあります。

リクエストのサイズを制限する場合POST、リスクの 1 つは、ページの実行に使用されるメモリの量です。データがすでに にある$_POST場合は、手遅れです。

検証とサニテーションに関しては、ドメイン オブジェクトプレゼンテーション エンティティ、またはSQLのいずれかで行う必要があります。ドメイン オブジェクトで入力のロジックを検証します。SQL 制約でデータの構造を有効にします。そして、プレゼンテーション エンティティの出力をサニタイズします (MVC についての混乱を招くため、それらを「プレゼンテーション モデル」と呼ぶようにリンクしません)。

MVC のルーティング メカニズム (「フロント コントローラーの側面」) は、ユーザーからの入力を受け取り、それを構造化されたインスタンスに整理する必要がありRequestます。このインスタンスは、コントローラーのアクションによって使用され、データをモデル レイヤーに渡します。

ルーティングで入力を検証するべきではありません。

于 2013-04-06T12:55:00.407 に答える