2

我在使用 asp.net 请求验证时遇到问题。我有一个带有搜索字段和按钮的基本页面。如果用户在搜索字段中输入一些非法字符并单击按钮,那么我当然可以在 JS 中验证他的输入,一切正常。但是,我还有很多与执行回发的搜索功能无关的 LinkBut​​ton,当它发生时,我得到了 YSOD。我知道您可以通过在页面指令或 web.config 中添加 ValidateRequest="false" 来关闭此功能,但是我想知道是否有比完全禁用请求验证更好、更优雅的解决方案。谢谢。

4

3 回答 3

2

您可以使用反 XSS 库来避免跨脚本攻击。检查此链接AntiXSS asp.net

你可以打开死亡黄屏。通过将 CustomError 模式更改为 Remoteonly。这样远程用户就不会看到 YSOD。只有本地服务器会看到 YSOD

在 web.config 添加这样的行。

<configuration>
  <system.web>
    <customErrors defaultRedirect="yourErrorPage.html"
                  mode="RemoteOnly">

    </customErrors>
  </system.web>
</configuration>
于 2012-07-04T12:49:10.750 回答
0

Sounds to me like you need to put validation groups against your form elements (could be I'm misunderstanding the question).

(This would be easier if you'd have posted some code)

<asp:Panel runat="server" DefaultButton="btnSearch">
    <asp:TextBox runat="server" ID="txtSearch" />
    <asp:RequiredFieldValidator runat="server" ControlToValidate="txtSearch" ValidationGroup="vgSearch" ErrorMessage="Search is required!" />
    <asp:Button runat="server" ID="btnSearch" ValidationGroup="vgSearch" Text="Search" />
</asp:Panel>

<asp:LinkButton runat="server" ID="btnLogin" Text="Login" ValidationGroup="vgLogin" />
<asp:LinkButton runat="server" ID="btnCakes" Text="Cakes!" ValidationGroup="vgCakes" />

Anyway, the idea is that your search form and associated validators have one validation group, and your other buttons have other validation groups, then the validator won't fire when you click another button.

I'm not actually sure if you NEED the validation groups against individual link buttons, I don't think you do, but I'm putting 'em in there to demonstrate my point.

If I've completely missed the boat, let me know :)

EDIT:

I should mention that I've just thrown the above code together, can't guarantee it's all formatted correctly, etc, etc.

于 2012-07-04T13:23:45.637 回答
0

奇怪的是,在我试图回答这个问题的第二天,一位同事要求我帮助解决同样的问题,所以这就是我目前所做的......

(请记住,虽然我已经在 .Net 中开发了很多年,但我从来不需要深入研究页面生命周期、ViewState 或任何让开发人员保持更好状态的极其复杂的部分夜晚)

最初,我认为覆盖 JavaScript 中的 PostBack 事件将允许我编辑表单帖子并删除有问题的字符,所以我尝试了一个简单的警报,但潜在危险的 Request.Form仍然出现,所以不管是什么原因导致它是在 PostBack 事件被触发之前发生。

因此,在调查了页面生命周期,覆盖了我可以使用的所有方法并进行了大量调试之后,我发现错误是在DeterminePostBackMode 方法中引发的。

现在,据我了解,此方法查看表单帖子并将其转换为 NameValueCollection,因此我构建了自己的 NameValueCollection,去掉了“<”字符(我只用该字符开始测试)。

Protected Overrides Function DeterminePostBackMode() As System.Collections.Specialized.NameValueCollection
        Dim stream As New System.IO.StreamReader(Request.InputStream)
        Dim nvCollection As New System.Collections.Specialized.NameValueCollection()
        Dim _split() As String = stream.ReadToEnd().Split("&")
        If _split.Length > 1 Then
            For i As Integer = 0 To _split.Length - 1
                Dim kv() As String = _split(i).Split("=")
                Dim _key As String = HttpUtility.UrlDecode(kv(0))
                Dim _value As String = HttpUtility.UrlDecode(kv(1))
                If _value.Contains("<") Then _value = ""
                nvCollection.Add(_key, _value)
            Next
        End If

        'For Each s As String In nvCollection
        '    Response.Write(String.Format("<p>{0}={1}</p>", s, nvCollection(s)))
        'Next

        Return nvCollection
    End Function

这非常有效,有问题的值被删除了,并且 NameValueCollection 被返回而不会导致错误......

除了我仍然看到错误消息。

目前,我已经将它跟踪到 PreInit 页面事件,并且我正在尝试解决它,我会在我取得进展时更新它。

更新:

我现在相当确定问题不在于存储在 ViewState 中的值。在阅读了这篇关于 ViewState 的优秀文章后,我尝试将 TextBox 的值设置为"<script"声明式,这意味着它不应该存储在 ViewState 中,这意味着错误不是由在 ViewState 上执行的处理引起的。

我认为。

于 2012-07-05T14:37:26.603 回答