我正在开发一个ASP.Net C#+ jQuery ajax网站项目。我试图阻止xss攻击,我知道下面不是完整的方法,但这至少是我应该做的 - 在接受用户的免费字符串输入时使用HtmlEncode)。我真的有人要检查我是否做了正确的事。
因此,假设我们有一个场景,其中一个页面控件是“描述”文本框,用户可以输入用于描述其产品的“免费”字符串。为了防止获取xss攻击输入,在服务器端页面方法中,我使用HtmlUtility.HtmlEncode()
包装了“描述”文本,因此在进入数据库之前字符串将被解释为纯文本,即<script>
变为>script<
。
接下来的部分是我有疑问的 - 如何处理html编码的文本,然后再将其返回给用户?
当用户想要查看输入的描述文本时,从数据库中检索网站并将其打印出来。
对描述执行html解码是否合乎逻辑,以便用户不会看到那些奇怪的><
个字符?它首先会破坏使用HtmlEncode的目的吗?如果是的话,这是正确的jQuery行解码并将文本打印回用户???
$("#txtDescription").val($(this).html(obj.Description).text();
非常感谢
答案 0 :(得分:6)
不要对进入数据库的文本进行编码。以原始未经过滤的形式存放。只有当字符串输出到支持HTML的上下文(例如输出到浏览器)时,才对HTML字符进行编码。
答案 1 :(得分:1)
您需要记住您处理的每个字符串的内容类型及其来源 - 无论是来自安全来源还是来自不受信任的来源,还要知道何时连接两个字符串都是相同内容的字符串 - 类型和信任级别。
我使用
HtmlUtility.HtmlEncode()
整理了“说明”文字,因此在进入数据库之前,该字符串将被解释为纯文本,即<script>
变为>script<
。
这听起来好像你说的描述字段是一串纯文本,你在数据库中存储的是一串安全的HTML(因为HtmlEncode
的输出保证不包含危险的代码)。
这显示了过早编码内容的第一个问题。如果您正在编写要发送到服务器的SQL字符串,则预编码为HTML不会保护您免受SQL注入。使用SQL预处理语句是克服SQL的一种好方法,但预编码不会在所有上下文中使字符串安全。
接下来的部分是我有疑问的 - 如何处理html编码的文本,然后再将其返回给用户?
当用户想要查看输入的描述文本时,从数据库中检索网站并将其打印出来。
如果用户正在接收安全的HTML,并且您有一串安全的HTML,则可以将其发送给用户。
如果用户收到纯文本电子邮件,则需要将存储在数据库中的安全HTML转换为纯文本。
如果用户正在接收RSS,那么您需要确保使用XML的子字符串撰写RSS。
Contextual auto-escaping可以帮助您确保在输出中正确编码值。
答案 2 :(得分:0)
使用AntiXss library代替httputility.htmlencode是个好主意。考虑阅读文档以获得更清晰的信息。您在AntiXSS库w.r.t输入编码中有更多选项。它遵循本discussion中提到的更安全的基于白名单的方法。