1

こんにちは、私は自分で開発したアプリケーションをテストしていて、問題が発生しました。入った

<script>window.location = "http://www.google.com";</script>

Zend_Form_Element_Text要素で。送信を押すと、値が保存されます。値を保存した後、ユーザーをリスティングにリダイレクトします。リスティングにリダイレクトすると、スクリプト タグが実行されて に移動しgoogle.comます。

私のフォーム要素は次のようになります

 $first_name = new Zend_Form_Element_Text('first_name');
 $first_name->setRequired(true)
            ->addFilter('StringTrim')
            ->addValidator('StringLength', false, array(2, $metaData['first_name']['LENGTH']))
            ->setDecorators(array('ViewHelper', 'errors'));

ユーザーがそのような種類の値を入力できないようにするにはどうすればよいですか? 組み込みの検証またはその他の方法はありますか?

4

2 に答える 2

1

アプリのテストはよくできていますが、多くの人は気にしません。その文字列をデータベースに保存しても問題はありません。変更すると、他の有効なエントリに問題が発生する可能性があります。vstm が言うように、使用するときはエスケープしてください。

ただし、具体的には「名」フィールドについて話しているため、名前に a/が含まれる名前を拒否するなど、さらに検証できる可能性があります。名前の一部としてそれを含む言語は知りません。もしあれば、どのように発音されているのか知りたいです。おそらく. = \そのリストに他のものを追加することもできますが、あまり夢中にならないでください.

フォーム内のすべてのフィールドについて、受け取ると合理的に予想される入力について慎重に検討し、それに応じて入力を検証する必要があります。検証に合格しないものはすべて拒否されます。のような文字列'<script>window.location = "http://www.google.com";</script>'は、人の名前を期待するフィールドの検証に合格することは絶対にありません。

個人的には、入力をフィルタリングすることはありません。検証に合格して受け入れられるか、不合格で拒否されます。フィルタリングして悪い入力から良い入力を作ることができないため、拒否され、ユーザーはデータの再入力を求められます。たとえばStripTags

<script>window.location = "http://www.google.com";</script>

あなたを残します

window.location = " http://www.google.com ";

これはまだ有効な名前ではなく、拒否する必要があります。

検証が常に 100% 機能することはありません。そのため、ユーザー入力から受け取った値をブラウザーにエコーする前に常にエスケープする必要があります。

Zend Framework には、使用できる多数のバリデーターがあり、PHP で既に使用できるバリデーターとフィルターを忘れないでください。これらを適切に使用すれば、悪意のある入力によってアプリケーションや、さらに重要なユーザーが被害を受けるリスクを大幅に減らすことができます。

これらのバリデーターとフィルターは使用するために用意されていますが、PHP も Zend Framework も期待されるデータの種類を認識していません。そのため、ドキュメントを読んで、それらがどのように機能するか、どのように使用するか、いつ使用するかを正確に理解することが非常に重要です。それらを使用します。

The Web Application Security Projectには優れたリソースがあり、すべての Web 開発者が死ぬほど読むことを強いられるべきです。

tl;dr
入力を検証し、出力をエスケープします。

于 2012-09-30T08:02:12.250 に答える
1

フィルターを使用して、ユーザーからの入力を制限できます。フィルターについて読む

Zend Framework にはZend_Filter_StripTagsと呼ばれるフィルターがあり、すべてのタグまたは選択したタグを削除するオプションが提供されます。これは、サイト自体の例です。

$filter = new Zend_Filter_StripTags();     
print $filter->filter('<B>My content</B>'); 

その結果、削除されたコンテンツ「マイ コンテンツ」が取得されます。

あなたの場合、次の

$first_name->setRequired(true)
            ->addFilter('StringTrim')
            ->addFilter('StripTags') //Here a add a filter to strip tags
            ->addValidator('StringLength', false, array(2, $metaData['first_name']['LENGTH']))
            ->setDecorators(array('ViewHelper', 'errors'));
于 2012-09-30T08:27:45.820 に答える