我正在做一个ASP.Net C# + jQuery ajax网站项目。我正在努力防止xss攻击,我知道下面不是完整的方法,但这至少是我应该做的-在接受用户的免费字符串输入时使用HtmlEncode )。而且我真的有人好心检查我是否做了正确的事情。
因此,假设我们有一个场景,其中一个页面控件是"Description“文本框,用户可以输入"free”字符串来描述他们的产品。为了防止获得xss攻击输入,在服务器端的Page方法中,我使用HtmlUtility.HtmlEncode()包装了"Description“文本,因此在进入数据库之前,字符串将被解释为纯文本,即<script>变为>script<。
接下来的部分就是我的疑问--在返回给用户之前,如何处理html编码的文本?
当用户想要查看输入的描述文本时,网站从数据库中检索并打印出来。
对描述执行html解码,这样用户就看不到那些奇怪的><字符,这合乎逻辑吗?它首先会违背使用HtmlEncode的目的吗?如果是,这是正确的jQuery行来解码并将文本打印回用户吗?
$("#txtDescription").val($(this).html(obj.Description).text();
非常非常感谢你
发布于 2013-02-11 07:49:04
您需要记住您处理的每个字符串的内容类型以及它的来源-无论是来自安全的来源还是不受信任的来源,并且还需要知道何时连接两个都是相同内容类型和信任级别的字符串。
我用
HtmlUtility.HtmlEncode()包装了"Description“文本,因此在进入数据库之前,字符串将被解释为纯文本,即<script>变为>script<。
这里听起来像是说description字段是一个纯文本字符串,而您在数据库中存储的是一个安全的超文本标记语言字符串(因为HtmlEncode的输出肯定不包含危险代码)。
这显示了过早编码内容的第一个问题。如果您正在编写要发送到服务器的SQL字符串,则预编码为HTML并不能防止SQL注入。对于SQL来说,使用SQL prepared语句是克服这一问题的好方法,但是预编码并不能使字符串在所有上下文中都是安全的。
接下来的部分就是我的疑问--在返回给用户之前,如何处理html编码的文本?
当用户想要查看输入的描述文本时,网站从数据库中检索并打印出来。
如果用户正在接收安全的HTML,而您有一个安全的HTML字符串,您可以直接将其发送给用户。
如果用户收到纯文本电子邮件,则需要将存储在数据库中的安全HTML转换为纯文本。
如果用户正在接收RSS,那么您需要确保使用XML的子字符串编写RSS。
Contextual auto-escaping可以帮助您确保值在输出中被正确编码。
发布于 2013-02-08 14:25:51
不要对进入数据库的文本进行编码。以原始的、未过滤的形式存储它。只有当字符串输出到支持HTML的上下文中(例如输出到浏览器)时,才对HTML字符进行编码。
发布于 2013-02-12 11:17:43
使用AntiXss library而不是httputility.htmlencode是一个好主意。考虑阅读文档以获得更清晰的信息。您在AntiXSS库w.r.t输入编码中有更广泛的选择。它遵循本discussion中提到的更安全的基于白名单的方法。
https://stackoverflow.com/questions/14766863
复制相似问题