【发布时间】:2017-04-02 10:42:05
【问题描述】:
我们有一个使用 ASP.Net 和 C# 的旧版 Web 应用程序,为此我们收到了大约 400 个由 Veracode 扫描引发的跨站点脚本缺陷。
我创建了一个示例 Web 应用程序并模拟了这个问题,发现每当我们直接使用任何字符串输入时,它都会引发缺陷。
做HttpUtility.HtmlEncode(TextBox1.Text);"satisfies the veracode,但是在所有 400 个地方应用这个更改是不可行的,因为那时会有大量的工作和测试工作。
我正在寻找某种方式在 httphandler 中实现一些插件,以便所有输入都在一个地方编码,我们不必在任何地方更改它。
如果可以的话,有人可以指导我吗?即使您可以指导我进近,至少也足以有一个方向。
非常感谢。
StringOps strop = new StringOps();
string txt1, txt2;
txt1 = HttpUtility.HtmlEncode(TextBox1.Text);
txt2 = HttpUtility.HtmlEncode(TextBox2.Text);
Response.Write(strop.Add(txt1, txt2));
如果我删除 HttpUtility.HTMLEncode 行,Veracode 会抱怨它。由于我们在很多地方都在做这个字符串操作,所以在任何地方实现这个都是不可行的。这是否有可能在一个地方实现这种编码,并且所有响应和请求都应该通过该管道,例如HTTPHandler 和 HTTPModule。
【问题讨论】:
-
请edit您的问题包括minimal reproducible example,包括输入和输出。您肯定不想对所有输入进行百分比编码,您只需要对再次打印为 HTML 的输入进行编码。
-
@Alok 你的意思是应用程序将原始输入字符串直接写入响应,从而绕过所有 ASP.NET 的安全检查和保护?那么是的,你必须修复每一行有问题的代码。 并且向所有文本框添加验证,以便它们首先不允许无效输入。
-
是的,如果你要去
Response.Write(TextBox1.Text),你会过得很糟糕。这种模式在您的代码中出现的次数那么多吗? -
@Alok,您正在使用
Response.Write绕过任何此类接口。这会将 raw 文本发送到客户端。 为什么你还是要这样做?这是一种 REST 服务吗?无论如何,错误在于您没有验证您的输入。编码只会隐藏验证工具中的错误。如果客户端输入x'; drop table users; --,它不会阻止例如SQL注入 -
好吧,我的感觉是,即使你找到了一些方法来防止 XSS 在一个地方,Veracode 也可能无法识别这种方法,并且当它没有看到使用的 HtmlEncode 时仍然会抱怨。这只是一种感觉。