目前,当尝试提交包含下拉菜单的交易时,如果下拉菜单中的文本包含角括号,例如"<abcd>"
,由于ValidateRequest=true
,会默认抛出跨站脚本问题未处理的异常,导致500内部服务器错误。
有没有办法在HttpModule
或Glabal.asax
中拦截和修改请求对象,因为我知道请求对象是只读的。
我已经苦苦思索了将近三天,但无法得到一个具体的解决方案。如何处理这些情况才是最好的解决方案?同时,我不想在客户端对其进行编码。
目前,当尝试提交包含下拉菜单的交易时,如果下拉菜单中的文本包含角括号,例如"<abcd>"
,由于ValidateRequest=true
,会默认抛出跨站脚本问题未处理的异常,导致500内部服务器错误。
有没有办法在HttpModule
或Glabal.asax
中拦截和修改请求对象,因为我知道请求对象是只读的。
我已经苦苦思索了将近三天,但无法得到一个具体的解决方案。如何处理这些情况才是最好的解决方案?同时,我不想在客户端对其进行编码。
在列表框中编码数值 :
<asp:ListItem><abcd></asp:ListItem>
[编辑] 我意识到我的解决方案不适用。内容可能是由浏览器编码发送的,并且如果您使用标准数据绑定,下拉列表也会进行渲染编码。我认为您唯一的选择是禁用请求的验证。
这意味着您必须非常小心地处理用户输入。简单来说,使用 HttpUtility.HtmlEncode(txtXX.Text);
对每个用户输入进行编码。
有关更多信息,请参阅MSDN的Script Exploits Overview页面。
使用 HttpUtility.HtmlEncode 和 HttpUtility.HtmlDecode 来解决这个问题。
你可以将 HTML 编码的文本放入控件中,或根据需要使用这些方法(在事件之间)。
请参考以下 Stack Overflow 帖子:
使用 HttpUtility.HtmlEncode 验证用户输入
ASP.NET 中的 W3C 验证错误
如果您可以禁用验证,请按照以下步骤操作:
ASP.NET:无效的回发或回调参数
请查看 MSDN 上的 脚本攻击。
我更喜欢使用Microsoft Anti-Cross Site Scripting Library V4.0,因为它提供了许多辅助函数来编码HTML、HtmlAttribute、JavaScript、URL、XML以限制任何跨站攻击。