データベース ID フィールドを ViewState に保存する必要がありますか?

StackOverflow https://stackoverflow.com/questions/103000

  •  01-07-2019
  •  | 
  •  

質問

データベースからレコードを取得し、それを Web ページ (ASP.NET を使用しています) に表示する必要がありますが、そのレコードの ID (主キー) をどこかに保存して、後でその ID を使用してデータベースに戻ることができるようにします (おそらくアップデートを行うためです)。

これを行うには、ID を ViewState や非表示フィールドに保存するなど、おそらくいくつかの方法があることはわかっていますが、最良の方法は何ですか?また、他の方法ではなくこの方法を選択する理由は何ですか?

役に立ちましたか?

解決

場合によります。

誰かがレコード ID を見ても構いませんか?そうした場合、非表示フィールドとビューステートの両方が適切ではなくなります。セッション状態に保存するか、ビューステートを暗号化する必要があります。

誰かが偽の ID でフォームを送信しても気にしますか?使用すると、非表示フィールドを使用できなくなります (おまけとして CSRF 保護を考慮する必要があります)。

変更できないようにしたいが、(何らかの作業をすれば) 閲覧できるようにすることは気にしませんか?viewstate を使用し、ページ (またはグローバル) でenableViewStateMac="true" を設定します。

非表示にして保護したいが、セッション状態を使用できないのですか?次の web.config エントリを設定してビューステートを暗号化します。

<pages enableViewState="true" enableViewStateMac="true" />
<machineKey ... validation="3DES" />

他のヒント

エンドユーザーにIDを知らせたいですか?たとえば、ID 値がデータベースの標準 1,1 シードである場合、その数値を見て顧客の数を確認できます。(ビューステートのように) 値を暗号化すると、キーを解読するのがはるかに難しくなります (ただし、不可能ではありません)。

別の方法は、それをセッションに保存することです。これにより、アプリケーションに(単なる整数の場合は非常に小さい)パフォーマンスの影響が生じますが、ユーザーとしてその主キーがまったく表示されないことを意味します。また、オブジェクトをアプリケーションの他の部分に公開しますが、公開したくない場合もあれば、公開したくない場合もあります (セッション オブジェクトは、クリアされるか、設定された時間 (5 分など) が経過するか、ブラウザ ウィンドウが閉じるまで、いずれか早く起こるまで残ります)。 。

ビューステートの値により、ポストバックのたびにクライアントに余分な負荷がかかります。これは、ビューステートはページのオブジェクトを保存するだけでなく、戻るボタンを使用した場合にオブジェクトを記憶するためです。つまり、ポストバックするたびにビューステートが少し大きくなり、使いにくくなります。これらは、ブラウザが別のページに移動するまでそのページにのみ存在します。

このようにページに ID を保存するときは、必ずプロパティを作成します

public int CustomerID {
    get { return ViewState("CustomerID"); }
    set { ViewState("CustomerID") = value; }
}

または

    Public Property CustomerID() As Integer
        Get
            Return ViewState("CustomerID")
        End Get
        Set(ByVal value As Integer)
            ViewState("CustomerID") = value
        End Set
    End Property

そうすることで、Viewstate からセッション変数または非表示のフォーム フィールドに変更する場合は、プロパティ参照で変更するだけで、ページの残りの部分は "Page.CustomerID" を使用して変数にアクセスできます。

ViewState はオプションです。現在閲覧しているページでのみ有効です。Session オブジェクトのような他のリソースへのリクエストは引き継がれません。

非表示フィールドも機能しますが、ページのソースを閲覧できる賢い人にアプリケーションに関する情報が少しずつ漏洩することになります。

レコード全体を ViewState に保存して、サーバーへの再度の往復を回避することもできます。

私は個人的に、セッションに何かを入れることには非常に懸念しています。ワーカー プロセスが何度も循環し、セッション状態が失われてしまいました。

あなたが問題を説明したように、私はそれを非表示フィールドまたはページのビューステートに置きます。

また、このようなデータをどこに配置するかを決定するときは、常にデータの範囲に注目してください。範囲は単一ページですか、それともセッション全体ですか?答えが「セッション」の場合は、それを Cookie に入れます。(免責事項:私たちは Cookie が有効であることがわかっているイントラネット アプリを作成します。)

単純な ID がクエリ文字列で渡すことを選択した場合、ポストバックを行う必要がなくなり、ユーザーや検索エンジンにとってページにアクセスしやすくなります。

Session["MyId"]=myval;

これはもう少し安全で、基本的にビューステートに置くのと同じ仕組みを提供します。

隠しフィールドにそのようなものを貼り付ける傾向があるので、少しだけやってください

 <asp:label runat=server id=lblThingID visible=false />
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top