【问题标题】:Can we say we are safe from XSS attacks if we remove all script and java words from input如果我们从输入中删除所有脚本和 java 单词,我们可以说我们免受 XSS 攻击吗
【发布时间】:2013-04-23 12:33:56
【问题描述】:

我正在使用 asp.net htmleditorextender,不幸的是,现在没有有效的 XSS 清理程序。因此,作为快速解决方案,我将替换用户输入中的所有脚本和 java 单词,如下所示

    var regex = new Regex("script", RegexOptions.IgnoreCase);
    srSendText = regex.Replace(srSendText, "");

    regex = new Regex("java", RegexOptions.IgnoreCase);
    srSendText = regex.Replace(srSendText, "");

我可以假设我免受 XSS 攻击吗?

实际上我正在使用 htmlagilitypack 反 xss 消毒剂,但它甚至没有删除脚本标签,所以完全没用

【问题讨论】:

  • 只要确保在将输入呈现为 HTML 之前正确转义输入(或在输入时转义)就是通常防止 XSS 的方法
  • 你试过自己攻击它吗?
  • 我喜欢 razor 的原因之一:如果你犯了一个错误,你通常会以双重编码数据结束,而不是打开一个 XSS 漏洞。这两件事中的一件很容易被发现并且没有风险;另一个是微妙的,非常危险......
  • 其他一些潜在漏洞:stackoverflow.com/questions/5779875/…

标签: c# asp.net xss sanitization


【解决方案1】:

不,你不能。

攻击者可以通过例如将script 编码为script 来轻松绕过此类检查。

确保代码免受 XSS 攻击的方法是确保任何可能来自用户的内容在没有适当编码的情况下绝不会放入页面中,以确保文本中的任何代码都不会被执行。

【讨论】:

  • 我明白了。所以我需要先解码替换然后编码并保存:)
  • @MonsterMMORPG:不。替换几个关键字并不能保护你。您应该在将文本放入页面时对其进行编码,以便根本不执行标记,而不是尝试删除危险的关键字以便执行标记。
  • 我该怎么做?你能举个例子吗?我不应该解码并向用户显示吗?
  • @MonsterMMORPG:这取决于您使用的应用程序类型。例如,在 Web 表单应用程序中,您使用 <%= Server.HtmlEncode(text) %> 对输出进行编码。
  • 我想编码的文本是由浏览器解码但不作为脚本执行的吧?
【解决方案2】:

在我看来,自定义 XSS 预防通常是不可以的,因为您应该始终使用库。然而剥离scriptjava 是不够的,任何传递到服务器的东西都应该使用HttpUtility.HtmlEncode,它将对来自用户的任何输入进行编码。

还要确保在配置文件中设置了validateRequest="true"

其他危险标签可能包括:

  • 小程序
  • 身体
  • 嵌入
  • 框架
  • 脚本
  • 框架集
  • html
  • iframe
  • img
  • 风格
  • 链接
  • 对象

http://msdn.microsoft.com/en-us/library/ff649310.aspx

【讨论】:

猜你喜欢
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
相关资源
最近更新 更多