2

ビューステートを変更できることをどこかで読みましたが、それを達成するための手順が見つかりませんでした。

例:ラベルのビューステートを変更したいのですが、最初はラベル テキストが「こんにちは..」で、ポストバックでビューステートを変更して「こんにちは」に変更したいと考えています。

任意の提案をいただければ幸いです。

4

5 に答える 5

4

コード内からViewStateを変更するのではなく、エンドユーザーとして__VIEWSTATE非表示フィールドを悪意を持って変更することについて話していると思います。これは、アプリケーションの設定によっては、実行可能である場合と実行できない場合があります(できれば実行できない場合があります)。それをかなり難しくする2つは、EnableViewStateMacViewStateEncryptionModeです。これらは多くの場合<pages>、Web.configの要素に設定されます。

ViewStateEncryptionModeは、ViewStateの改ざんを防ぐようには実際には設計されていません。これは、ViewStateに埋め込んだコンテンツを不明瞭にすることを目的としています。たとえば、自分に関する秘密情報をViewStateに追加することにした場合(たとえばViewState["secretinfo"] = "My social security number is xxx-xx-xxxx.";)、ページにアクセスしてページを読み込むユーザーは、__ VIEWSTATEフィールドを取得し、base64デコーダーを介して実行して、社会保障番号を見つけることができます。もちろん、ViewStateを暗号化しています。

例として、これは私が簡単なグーグル検索で見つけた.aspxページです。ソースを表示し、ViewStateを取得して、このbase64デコーダーに貼り付けます。いくつかの醜い文字の中には、プレーンテキストがたくさんあります。このViewStateは明らかに暗号化されていません(これはおそらく悪いことではありません)。

好奇心旺盛な人や悪意のある人の場合は、ViewStateで見つけたテキストの一部を変更し、base64として再エンコードして、__VIEWSTATEフィールドに戻すことができます。(多くのブラウザーでは、JSコンソールを開いて入力するだけdocument.querySelector("[name=__VIEWSTATE]").value = "whatever your base64 text is";です。)これで、フォームを送信すると、ページは変更されたViewStateでポストバックされます。

ここで、EnableViewStateMacが役立ちます。MSDNが指摘しているように、この設定は、悪意のあるユーザーが__VIEWSTATEフィールドを改ざんするのを防ぐための設定であるため、実稼働サイトでは常に有効にする必要があります。単純化しすぎると、基本的に__VIEWSTATE値のハッシュ(実際にはメッセージ認証コード)を計算し、これを__VIEWSTATEと一緒に送信します。(文字列の最後に埋め込まれ、デコードされてプレーンテキストの文字列に戻されません。)__ VIEWSTATE内のテキストを変更すると、メッセージはMACと一致しなくなり、.NETはこれをキャッチしてスローします。リクエストを処理する前に例外が発生します。

TL; DR
EnableViewStateMacがオンになっている限り(必要です)、__VIEWSTATEフィールドを実際に変更することはできません。

于 2012-05-28T15:25:55.453 に答える
1

コード ビハインドでラベル オブジェクトの Text プロパティを設定するだけで、ラベルのビューステートを変更できます。組み込みの ASP.NET コントロールのほとんどのプロパティはビューステートによってサポートされているため、プロパティを設定すると、そのコントロールのビューステートが間接的に変更されます。

.aspx で:

<asp:Label id="myLabel" Text="Hi.." />

.aspx.cs で:

myLabel.Text = "Hello";
于 2012-05-28T14:18:46.037 に答える
1

PostBack イベントの値をリセットできませんでしたか? のような:

    mylabel.Text = "こんにちは";

于 2012-05-28T14:18:52.417 に答える
1

ビュー ステートは、ページの隠しフィールドに格納されます。ビュー ステートはデータをハッシュ形式 [エンコード形式] で保存しますが、正しい値に変更することは容易ではなく、ビュー ステートのテンパリングにつながります。

Viewstate を変更する必要があり、適切なエンコードとデコードのアルゴリズムを知る必要があります。

したがって、ビュー ステートを変更しようとしないでください。

于 2012-05-28T14:23:27.907 に答える
0

短い答えは、できるということです。

ビュー ステートを変更するには、基本的に次のことを行う必要があります。

  1. ビューステートを逆シリアル化する
  2. ラベル テキストに関連付けられているキーと値のペアを特定します (この時点では、キーと値のペアを含む Xml 辞書になっています)。
  3. 変更
  4. ビュー ステートをシリアル化する

この記事では、View State の解析について詳しく説明します。また、ビュー ステートの解析/デコードに使用できるツールへの参照も含まれています: ASP.NET ビュー ステートについて.

于 2012-05-28T15:04:17.600 に答える