Предотвращение желтого экрана смерти
У меня проблема с проверкой запроса asp.net. У меня есть базовая страница с полем поиска и кнопкой. Если пользователь вводит некоторые недопустимые символы в поле поиска и нажимает кнопку, то, конечно, я могу проверить его ввод в JS, и все в порядке. Однако у меня также есть много LinkButton, не связанных с функцией поиска, которые выполняют обратную передачу, и когда это происходит, я получаю YSOD. Я знаю, что вы можете отключить эту функцию, добавив ValidateRequest="false" в директивах страницы или web.config, однако я хотел бы знать, есть ли лучшее и более элегантное решение, чем простое полное отключение проверки запросов. Благодарю.
3 ответа
Вы можете использовать анти-XSS библиотеку, чтобы избежать кросс-скриптовой атаки. проверьте по этой ссылке AntiXSS asp.net.
и вы можете повернуть желтый экран смерти. изменив режим CustomError на Remoteonly. так что удаленный пользователь не увидит YSOD. только локальный сервер увидит YSOD
в web.config добавить строку, как это.
<configuration>
<system.web>
<customErrors defaultRedirect="yourErrorPage.html"
mode="RemoteOnly">
</customErrors>
</system.web>
</configuration>
Как ни странно, на следующий день после того, как я попытался ответить на это, сотрудник попросил меня помочь с той же проблемой, так что вот что я делаю до сих пор...
(Имейте в виду, что, хотя я уже несколько лет занимаюсь разработкой в .Net, мне никогда не приходилось углубляться в это в жизненный цикл страницы, ViewState или в любой из ужасно сложных элементов, которые позволяют лучше работать разработчикам. ночь)
Первоначально я думал, что переопределение события PostBack в JavaScript позволит мне редактировать сообщение формы и удалить оскорбительные символы, поэтому я попытался сделать это с простым предупреждением, но потенциально опасная форма 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.
Я думаю.
Похоже, мне нужно сопоставить группы проверки с элементами формы (может быть, я неправильно понял вопрос).
(Это было бы проще, если бы вы опубликовали код)
<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" />
В любом случае, идея заключается в том, что ваша поисковая форма и связанные валидаторы имеют одну группу валидации, а другие кнопки имеют другие группы валидации, поэтому валидатор не будет срабатывать при нажатии другой кнопки.
На самом деле я не уверен, если вам НУЖНЫ группы проверки по отдельным кнопкам ссылок, я не думаю, что вы делаете, но я помещаю их туда, чтобы продемонстрировать свою точку зрения.
Если я полностью пропустил лодку, дайте мне знать:)
РЕДАКТИРОВАТЬ:
Я должен отметить, что я только что скомбинировал приведенный выше код вместе, не могу гарантировать, что он все правильно отформатирован и т. Д.