2013-02-08 289 views
5

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

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

下面的部分是我所怀疑的 - 如何处理html编码的文本,然后将其返回给用户?

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

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

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

谢谢你非常非常

回答

1

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

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

这听起来像你说的描述字段是纯文本字符串,然后你要在数据库中存储是安全的HTML的字符串(因为HtmlEncode的输出保证不含有危险码)。

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

接下来的部分是我怀疑 - 如何处理html编码的文本,然后再返回给用户?

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

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

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

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

Contextual auto-escaping可以帮助您确保值在输出上正确编码。

6

不编码的文本进入数据库。以未经过滤的原始形式存放它。只有当字符串输出到支持HTML的上下文中(如输出到浏览器)时才对HTML字符进行编码。

+0

嗨Kolink,谢谢你的回复:)。最好是将文本保存到数据库中,使用未经过滤的原始格式,但是在进入数据库之前,我的系统需要进行包装,不管怎样,我不知道如何将其打印回用户 – user1487182

+0

我们应该向用户打印奇怪的字符,还是在打印之前先解码字符是正常的做法?如果是这样,如何处理这部分?我需要打印这些值回文本框和它显示像" > <脚本>警报(' XSS ')< /脚本>谢谢你这么多 – user1487182

+1

这将是有益的事情,如果有人说出为什么你不应该编码文本进入数据库......特别是因为答案有5票(页面上最多)。 – EleventyOne

0

使用AntiXss library代替httputility.htmlencode是个好主意。考虑阅读文档以获得更加清晰的内容。您在AntiXSS库w.r.t输入编码中有更广泛的选项。它遵循这个discussion中提到的更安全的基于白名单的方法。