您何时致电Microsoft.Security.Application.AntiXss.HtmlEncode
?您是在用户提交信息时执行此操作还是在显示信息时执行此操作?
如姓名,姓氏,城市,州,邮编等基本内容怎么样?
答案 0 :(得分:12)
您在显示信息时执行此操作。保留原始输入,将其转换为在网页上显示。假设您以其他方式显示它,例如将其导出到Excel中。在这种情况下,您需要导出保存的原始文件。
对每个字符串进行编码。
答案 1 :(得分:4)
您应该只在最后一刻对数据进行编码或转义,无论是在将数据放入数据库之前,还是在屏幕上显示。如果编码太快,则存在意外双重编码的风险(您经常会在新手的网站上看到&
- 包括我自己)。
如果您确实希望早于编码,请采取措施避免双重编码。 Joel撰写了一篇关于匈牙利符号的良好用法的文章,他主张使用前缀来确定变量中存储的内容。例如:“us”表示不安全的字符串,“ss”表示安全字符串。
usFirstName = getUserInput('firstName')
ssFirstName = cleanString(usFirstName);
另请注意,信息类型(城市,邮政编码等)无关紧要 - 任何未经检查的信息都会造成麻烦。
答案 2 :(得分:2)
这取决于你的情况。在我工作的地方,多年来公司都没有HTML编码,所以当我们开始这样做时,几乎不可能找到系统中的每个位置,用户输入可以显示在页面上。
相反,我们选择在进入系统的过程中对输入进行消毒,因为输入点少于输出点。我们在将数据输入数据库之前立即进行清理,虽然我们不使用Microsoft的AntiXss库,但我们使用一组自制程序方法,根据输入类型将HTML标记和字符的范围列入白名单。
如果您从头开始设计系统,或者您的系统很小(或管理得好)足以编码输出,请遵循Corey的建议。这绝对是更好的方法。
答案 3 :(得分:1)
编码不是数据的属性,它是传输机制的属性。因此,您应该在收到数据时对数据进行取消编码,并在传输之前对其进行适当编码。传输机制决定了哪种编码是必要的。
这个原则适用于您的传输机制是HTML,HTTP,烟雾信号等。技巧是知道如何手动执行编码类型,以及各种框架何时自动执行这些步骤。例如,ASP.NET将编码分配给System.Web.UI.WebControls.Button的Text的数据,但不分配给分配给System.Web.UI.WebControls.Literal文本的文本。 jQuery将编码您使用.innerText()设置的内容,但不会使用.innerHtml()设置的内容。