1

背景:

我正在处理一个非常古老的项目,其中标题是 UserControl,标签、链接、按钮和上面的所有内容都添加了 output.Write。它是一个非常大的文件,需要保持原样工作。

特征:

我正在创建一个 div,当用户单击链接以转到更安全的一侧时,它会要求输入密码,我执行 ajax 请求,如果密码有效,它会返回一个令牌,我将此令牌设置为隐藏字段和单击按钮将该令牌提交到其他页面。

问题:

我正在生成输出。编写表单、输入和按钮,当我尝试提交时,我得到 Invalid postback 或 callback 参数。

这就是我生成它的方式:

        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 按钮,并将其显示设置为无。然后你劫持它的回发,这样你总是有一个有效的回发事件。我一直在为网格中动态创建的按钮执行此操作。

我的假设是您的登录按钮执行 ajax 调用,然后触发提交按钮的单击事件。所以这就是我要如何措辞这个答案。

所以如果你放置:

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

somwhere 在您的页面上,然后您将像这样修改您的代码:

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 回答