ビューステートを変更できることをどこかで読みましたが、それを達成するための手順が見つかりませんでした。
例:ラベルのビューステートを変更したいのですが、最初はラベル テキストが「こんにちは..」で、ポストバックでビューステートを変更して「こんにちは」に変更したいと考えています。
任意の提案をいただければ幸いです。
ビューステートを変更できることをどこかで読みましたが、それを達成するための手順が見つかりませんでした。
例:ラベルのビューステートを変更したいのですが、最初はラベル テキストが「こんにちは..」で、ポストバックでビューステートを変更して「こんにちは」に変更したいと考えています。
任意の提案をいただければ幸いです。
コード内からViewStateを変更するのではなく、エンドユーザーとして__VIEWSTATE非表示フィールドを悪意を持って変更することについて話していると思います。これは、アプリケーションの設定によっては、実行可能である場合と実行できない場合があります(できれば実行できない場合があります)。それをかなり難しくする2つは、EnableViewStateMacとViewStateEncryptionModeです。これらは多くの場合<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フィールドを実際に変更することはできません。
コード ビハインドでラベル オブジェクトの Text プロパティを設定するだけで、ラベルのビューステートを変更できます。組み込みの ASP.NET コントロールのほとんどのプロパティはビューステートによってサポートされているため、プロパティを設定すると、そのコントロールのビューステートが間接的に変更されます。
.aspx で:
<asp:Label id="myLabel" Text="Hi.." />
.aspx.cs で:
myLabel.Text = "Hello";
PostBack イベントの値をリセットできませんでしたか? のような:
mylabel.Text = "こんにちは";
ビュー ステートは、ページの隠しフィールドに格納されます。ビュー ステートはデータをハッシュ形式 [エンコード形式] で保存しますが、正しい値に変更することは容易ではなく、ビュー ステートのテンパリングにつながります。
Viewstate を変更する必要があり、適切なエンコードとデコードのアルゴリズムを知る必要があります。
したがって、ビュー ステートを変更しようとしないでください。
短い答えは、できるということです。
ビュー ステートを変更するには、基本的に次のことを行う必要があります。
この記事では、View State の解析について詳しく説明します。また、ビュー ステートの解析/デコードに使用できるツールへの参照も含まれています: ASP.NET ビュー ステートについて.