0

I have an application which makes decisions based on part of URL:

    if ( isset($this->params['url']['url']) ) {
    $url = $this->params['url']['url'];
    $url = explode('/',$url);
    $id = $this->Provider->getProviderID($url[0]);

    $this->providerName = $url[0]; //set the provider name

    return $id;

    }

This happens to be in a cake app so $this->params['url'] contains an element of URL. I then use the element of the URL so decide which data to use in the rest of my app. My question is...

whats the best way to secure this input so that people can't pass in anything nasty?

thanks,

4

6 に答える 6

1

ここの他のコメントは正しいです。AppController の beforeFilter で、db のプロバイダーに対してプロバイダーを検証します。

ただし、すべての URL にプロバイダー文字列をプレフィックスとして付ける必要がある場合は、$this->params['url'] を調べて間違った方法で URL からプロバイダー文字列を抽出することになります。

この種の問題は、まさにルータークラスの目的であり、パラメーターをアクションに渡す機能です。クックブックhttp://book.cakephp.org/view/46/Routes-Configurationのマニュアル ページを確認してください。次のようなものを試すことができます:

Router::connect('/:provider/:controller/:action');

マニュアルには、正規表現によってルート自体のプロバイダー パラメータを検証する機能も記載されています。既知のプロバイダーの小さな明確なリストがある場合は、ルート正規表現でこれらをハードコーディングできます。

URL のこの部分をキャプチャするルートを設定することで、$this->params['provider'] ですぐに利用できるようになりますが、それよりも優れているのは、html ヘルパー link() メソッドが自動的に正しくフォーマットされた URL を構築するという事実です。例えば

$html->link('label', array(
  'controller' => 'xxx',
  'action' => 'yyy',
  'provider' => 'zzz'
));

これは /zzz/xxx/yyy のようなリンクを返します

于 2009-01-07T20:33:40.357 に答える
1

有効なプロバイダー名は何ですか? URL パラメータが 1 かどうかをテストし、そうでない場合は拒否します。

ユーザーが使用してはならないプロバイダー名を含め、ユーザーが何かを送信するのを防ぐ方法は絶対にないことを認識していただければ幸いです。

于 2009-01-07T10:00:52.567 に答える
1

パラメータはプロバイダ名 - 英数字の文字列になります。答えは基本的に、他のアプリケーションロジックに基づいて、プロバイダー名が有効なものであることのチェックと組み合わせて ctype_alpha() を使用することだと思います。

返信ありがとう

于 2009-01-07T16:52:17.353 に答える
0

Sanitizeクラスを使用する方が簡単です。この場合、Sanitize::escape()またはSanitize::paranoid()が適切と思われます。

于 2009-03-23T17:06:22.340 に答える
0

また、許可される一連の既知の URL がある場合は、それらの許可された URL をホワイトリストに登録することをお勧めします。許可された URL を含む DB テーブルを用意することで、これを動的に行うこともできます。データベースからそれを取得し、渡された URL パラメータと比較します。または、パターンをホワイトリストに登録することもできます (たとえば、通過できるドメインを許可したが、残りの URL は変更されます... ドメインをホワイトリストに登録したり、正規表現を使用して有効性を判断したりできます)。

少なくとも、strip_tags、または組み込みの mysql エスケープ シーケンスを使用していることを確認してください (PHP5 を使用している場合は、SQL クエリをパラメーター化するとこれらの問題が解決します)。

于 2009-01-07T17:30:17.793 に答える