1

xml シリアライズ オブジェクトを Cookie に保存しようとしていますが、次のようなエラーが発生します。

A potentially dangerous Request.Cookies value was detected from the client (KundeContextCookie="<?xml version="1.0" ...")

フォームの入力フィールドに JavaScript コードのようなものを保存しようとすると、同様のケースから問題が発生することがわかっています。

ここでのベストプラクティスは何ですか? asp.net フレームワークからこの警告を抑制する方法 (私が説明したフォームの問題のような) はありますか、または代わりに JSON をシリアル化する必要がありますか、それともバイナリでシリアル化する必要がありますか? シリアル化されたデータを Cookie に保存するときの一般的な方法は何ですか?

編集:フィードバックをありがとう。ID よりも多くのデータを Cookie に保存したい理由は、私が制御できないサービスから本当に必要なオブジェクトを取得するのに約 2 秒かかるためです。完全なオブジェクトからいくつかのプロパティを保持する軽量オブジェクト 'KundeContext' を作成しましたが、これらは 90% の時間で使用されます。このようにして、ページの 10% で低速サービスを呼び出すだけで済みます。Id のみを保存した場合でも、ほとんどすべてのページでサービスを呼び出す必要があります。

すべての文字列と int を別々に保存することもできますが、オブジェクトには「contactinformation」や「address」などの他の軽量オブジェクトがあり、それらのプロパティごとに手動で保存するのは面倒です。

4

4 に答える 4

5

シリアル化されたデータを Cookie に保存することは、非常に悪い考えです。ユーザーは Cookie データを完全に制御できるため、このメカニズムを使用して悪意のあるデータを提供するのは簡単すぎます。言い換えれば逆シリアル化コードの弱点はすぐに悪用可能になります (または少なくとも何かをクラッシュさせる方法)。

代わりに、Cookie で可能な限り単純な識別子のみを保持し、形式を簡単に検証できるタイプ (GUID など) のみを保持します。次に、シリアル化されたデータをサーバー側 (データベース、ファイルシステム上の XML ファイルなど) に保存し、その識別子を使用して取得します。

編集: また、このシナリオでは、識別子が十分にランダムであることを確認して、ユーザーが互いの識別子を推測し、自分の識別子を少し変更するだけでお互いになりすますことが不可能になるようにします。ここでも、GUID (または ASP.NET セッション識別子) は、この目的に非常に適しています。

質問の所有者によるシナリオの明確化後の 2 番目の編集: この場合、なぜ独自の Cookie を使用するのですか? 元のオブジェクトまたはセッション状態の軽量オブジェクト (Session オブジェクト) への参照を保持している場合、ASP.NET は非常に効率的な方法ですべての実装の詳細を処理します。

于 2008-09-23T07:51:11.070 に答える
1

私はデータを XML で Cookie に保存しません。初心者向けの Cookie サイズには制限があります (以前は、Cookie を含むすべてのヘッダーで 4K でした)。a|b|c や個別の Cookie 値など、代わりに区切り文字などの冗長でないエンコーディング戦略を選択します。区切り符号化により、値のデコードが特に簡単かつ迅速になります。

表示されるエラーは、ヘッダーが XSS 攻撃のように見えることを訴える ASP.NET です。

于 2008-09-23T07:48:55.583 に答える
1

View Stateを調べます。おそらく、Cookie を使用する代わりに、ViewState のポストバック全体でデータを保持したいと思うでしょう。それ以外の場合は、代わりに XML をサーバーに格納し、そのデータの一意の識別子を Cookie に格納する必要があります。

于 2008-09-23T07:51:11.943 に答える
0

セッション状態を使用して値を保存することを検討してください。Cookie を使用してセッション ID を保存するように構成できます。これは、値がユーザー側で表示または変更できないため、より安全でもあります。

もう 1 つの方法は、分散キャッシュ メカニズムを使用して値を格納することです。私の現在のお気に入りはMemcachedです。

于 2008-09-23T08:38:51.203 に答える