2

ASP.netで小さな問題が発生しています。ページに依存し、ユーザーがアクセスできないようにする必要がある小さなDataTableがあります。私が意味するのは:

  1. DataTableのデータをHiddenfield内に保存すると、hiddenfieldはページに依存します(複数の同じページリクエストに対して異なる値)が、ユーザーがコンテンツを変更してポストバックできるため、ユーザーがアクセスできなくなります。

  2. Datatableをセッションに保存すると、ユーザーはアクセスできなくなります(これは良いことです)が、ページのコンテンツの一部はこの値に依存するため、ユーザーがページを複数回(異なるタブで)開くと、セッションは次のように更新されます。要求された最後のページのコンテンツ、したがってポストバックが発生した場合、「古い」ページは適切にレンダリングされません。

例:整数変数を取ります。これは機密情報です。この値をに保存して、ユーザーが変更できないようにする必要があります。また、ページごとに異なる値を設定することもできます(非表示フィールドが機能するのと同じです)。どうやってやるの?ありがとう!

PS:C#でASP.net4.0を使用しています

4

1 に答える 1

3

非表示フィールドに一意のキーを追加します。このキーを使用して、ページのインスタンスに固有の一意のセッション値にアクセスします。誰かが他人の一意のキーを推測したとしても、セッション キーがなければ役に立ちません。

例:

<input type="hidden" value="234092735029730" id="InstanceId" runat="server" />

ページのインスタンスが初めてレンダリングされるときに、この値を生成します。

if( !Page.IsPostback ){
    this.InstanceId.Value = GenerateKey().ToString();
}

そのページに固有のセッションから値を取得する場合:

string key = this.InstanceId.Value;
var value = Session[key];

ページ固有の ID を生成するには、次のようにします。

using System.Security.Cryptography;

private static RNGCryptoServiceProvider _crypto = new RNGCryptoServiceProvider();

public static long GenerateKey(){
    byte[] bytes = new byte[8];
    _crypto.GetBytes( bytes );
    return BitConverter.ToInt64( bytes, 0 );
}

セッションは必ずしも 100% 安全であるとは限りませんが (セッション固定攻撃など)、クライアントに送信されるデータに情報を格納するよりも桁違いに安全です。

于 2013-01-11T20:15:17.533 に答える