关于 xss:一旦某个东西是 HTML 或 URL 编码的,它应该被解码吗?编码是否足够?

Once something is HTML or URL encoded should it ever be decoded? Is encoding enough?

第一次使用 AntiXSS 4。为了使我的应用程序更安全,我在 QueryString 参数上使用了 Microsoft.Security.Application.Encoder.UrlEncode 和
Microsoft.Security.Application.Encoder.HtmlEncode 对输入到表单域的参数进行编码。

我有多个,如果您能尝试回答所有问题,我将不胜感激(不必同时回答或由同一个人回答 - 任何回避者都会非常有帮助)。

我的第一个问题是我是否适当地使用了这些方法(也就是说,我是否在适当的情况下使用了适当的 AntiXSS 方法)?

我的第二个问题是,一旦我对某些内容进行了编码,是否应该对其进行解码。我很困惑,因为我知道 HttpUtility 类提供了编码和解码的方法,那么为什么在 AntiXSS 中不这样做呢?如果这有帮助,我编码的参数将永远不会被视为应用程序内的文本以外的任何内容。

我的第三个问题与第三个问题有关,但我想强调它,因为它很重要(并且可能是我整体困惑的根源)。我听说 .NET 框架会自动解码像 QueryStrings 这样的东西,因此不需要显式解码方法。如果是这样,那么如果要撤消它,那么首先对 HTML 进行编码有什么意义。它只是……似乎不安全?我错过了什么,特别是因为如上所述 HttpUtility 类提供解码。

最后一个问题,AntiXSS 是否有助于防止 SQL 注入,还是只能防止 XSS 攻击?


  • 很难说你是否正确使用它。如果您在构建查询字符串时使用 UrlEncode,然后将其作为页面中的链接输出,那么是的,这是正确的。如果您在将某些内容作为值写出时是 Html 编码,那么是的,那是正确的(好吧,如果它是通过 HTML 属性设置的,您应该使用 HtmlAttributeEncode,但它们几乎相同。)

  • .NET 解码器使用 AntiXSS 的编码值,所以我没有必要重写它们 grin

  • 编码的重点是你在输出的时候就做了。因此,例如,如果用户在表单上输入了 window.alert('Numpty!) 并且您只需将该输入原始放入输出中,javascript 就会运行。如果您先对其进行编码,您会看到 < 变成 < 等等。

  • 不,SQL 注入是一个完全不同的问题。