5

我正在开发一个 ASP.Net C# + jQuery ajax 网站项目。我试图防止 xss 攻击,我知道下面不是完整的方法,但这至少是我应该做的 - 在接受用户的免费字符串输入时使用 HtmlEncode)。我真的有人来检查我是否做对了。

因此,假设我们有一个场景,其中一个页面控件是“描述”文本框,用户可以输入用于描述其产品的“免费”字符串。为了防止得到 xss 攻击输入,在服务器端的页面方法中,我使用 包裹了“描述”文本HtmlUtility.HtmlEncode(),因此字符串在进入数据库之前将被解释为纯文本,即<script>变为&gt;script&lt;.

接下来的部分是我的疑问 - 如何在将 html 编码文本返回给用户之前处理它?

当用户想要查看输入的描述文本时,网站从数据库中检索并打印出来。

对描述执行 html 解码是否合乎逻辑,这样用户就不会看到那些奇怪的&gt;&lt;字符?它会破坏首先使用 HtmlEncode 的目的吗?如果是,这是正确的 jQuery 行来解码和打印文本给用户???

$("#txtDescription").val($(this).html(obj.Description).text();

非常非常感谢你

4

3 回答 3

6

不要对进入数据库的文本进行编码。以原始、未过滤的形式存储它。如果将字符串输出到支持 HTML 的上下文(例如输出到浏览器),则仅对 HTML 字符进行编码。

于 2013-02-08T06:25:50.617 回答
1

您需要记住您处理的每个字符串的内容类型以及它的来源 - 无论是来自安全来源还是不受信任的来源,并且还需要知道何时连接两个字符串,它们都是相同的内容类型和信任的字符串-等级。

我使用 包裹了“描述”文本HtmlUtility.HtmlEncode(),因此在进入数据库之前字符串将被解释为纯文本,即<script>变为&gt;script&lt;.

在这里,您好像在说描述字段是纯文本字符串,而您在数据库中存储的是安全 HTML 字符串(因为HtmlEncode保证 的输出不包含危险代码)。

这显示了过早编码内容的第一个问题。如果您正在编写要发送到服务器的 SQL 字符串,则预编码为 HTML 并不能保护您免受 SQL 注入。对于 SQL,使用 SQL 准备语句是克服此问题的好方法,但预编码不会使字符串在所有上下文中都是安全的。

接下来的部分是我的疑问 - 如何在将 html 编码文本返回给用户之前处理它?

当用户想要查看输入的描述文本时,网站从数据库中检索并打印出来。

如果用户正在接收安全 HTML,并且您有一个安全 HTML 字符串,则可以将其发送给用户。

如果用户正在接收纯文本电子邮件,那么您需要将存储在数据库中的安全 HTML 转换为纯文本。

如果用户正在接收 RSS,那么您需要确保使用 XML 的子字符串来编写 RSS。

上下文自动转义可以帮助您确保在输出时正确编码值。

于 2013-02-10T23:49:04.110 回答
0

使用AntiXss 库而不是 httputility.htmlencode是个好主意。考虑阅读文档以获得更清晰的信息。您在 AntiXSS 库 wrt 输入编码中有更广泛的选择。它遵循本讨论中提到的更安全的基于白名单的方法。

于 2013-02-12T03:17:43.233 回答