1

バックグラウンド:

私は、ヘッダーがUserControlであり、タグ、リンク、ボタン、およびその上のすべてがoutput.Writeで追加される非常に古いプロジェクトに取り組んでいます。それは本当に大きなファイルであり、そのまま動作し続ける必要があります。

特徴:

ユーザーがリンクをクリックしてより安全な側に移動したときにパスワードを要求するdivを作成しています。ajaxリクエストを実行し、パスワードが有効な場合はトークンを返します。このトークンを非表示フィールドに設定し、ボタンをクリックして、そのトークンを他のページに送信します。

問題:

出力を使用して生成しています。フォーム、入力、ボタンを記述し、送信しようとすると、無効なポストバックまたはコールバック引数を取得します。

これは私がそれを生成する方法です:

        mystringbuilder.Append("<div id='blackout' style='display: none'>")
        mystringbuilder.Append("</div>")
        mystringbuilder.Append("<div id='adminPassword' style='display: none;' class='popupcont'>")
        mystringbuilder.Append("   <a href='#' onclick=""return closeDiv('adminPassword','',0);"" class=""pclose""></a>")
        mystringbuilder.Append("  <br />")
        mystringbuilder.Append("Password: <input type='password' name='txtPassword' id='txtPassword'/><br>")
        mystringbuilder.Append("<button type='button' id='btnLogin'> Login </button>")
        mystringbuilder.Append(String.Format(" <input style='display:none' type='text' name='hidUsername' id='hidUsername' value='{0}'/>", User.UserName))
        mystringbuilder.Append(" <FORM action='/tokenLogin.aspx' method='post'>")
        mystringbuilder.Append(" <input style='display:none' type='text' name='hidAuthToken' id='hidAuthToken'/>")
        mystringbuilder.Append("<button type='submit' style='display:none' id='btnTransfer'> Transfer </button>")
        mystringbuilder.Append("</FORM>")
        mystringbuilder.Append("</div>")

これを追加しようとしましたが、それでも同じ結果が得られます。

 Page.ClientScript.RegisterForEventValidation("hidAuthToken")

 Page.ClientScript.RegisterForEventValidation("btnTransfer")

私が試すことができる回避策はありますか?これはヘッダーにあり、すべてのページで無効にするため、検証を無効にすることはできません。

4

1 に答える 1

1

どんな種類の回避策でも脆弱性にさらされることになりますが、私のお気に入りはファントムボタンです。

ページの任意の場所にASPボタンを配置し、その表示をnoneに設定します。次に、そのポストバックをハイジャックして、常に有効なポストバックイベントが発生するようにします。グリッド内に動的に作成されたボタンに対して、これを常に実行します。

私の推測では、ログインボタンがajax呼び出しを実行してから、送信ボタンのクリックイベントをトリガーします。それが私がこの答えを表現する方法です。

したがって、配置した場合:

<asp:button runat="server" ID="btnPhantom" UseSubmitBehavior="false" Visible="false" />

ページのどこかで、次のようにコードを変更します。

mystringbuilder.Append(string.format"<input type='button' style='display:none' id='btnTransfer' value='Transfer' onclick='javascript: {0}'/>", Page.ClientScript.getPostBackEventReference(btnPhantom,null) )

次に、ページの読み込みで、ファントムボタンのイベントを監視する必要があります。

C#

String tEventTarget = Request("__EVENTTARGET).ToString();
if(tEventTarget == btnPhantom.UniqueID){
    //read input from request and redirect
}

VB

Dim tEventTarget as String = Request("__EVENTTARGET).ToString

If tEventTarget = btnPhantom.UniqueID Then
   //read input from request and redirect 
End IF

私は、ページが認識していない動的制御のためにこれを常に行います。これはちょっとしたハックであり、私が言ったように、これを行うための最も安全な方法ではないかもしれませんが、プレーンテキストの認証トークンをテキストボックスに保存することもそれほど安全ではありません;)。

于 2013-03-14T20:16:25.237 に答える