当您可以简单地使用 对数据进行编码时HttpUtility.HtmlEncode
,我们为什么要使用AntiXss.HtmlEncode
?
为什么白名单方法比黑名单方法更好?
另外,在 Anti XSS 库中,我在哪里指定白名单?
当您可以简单地使用 对数据进行编码时HttpUtility.HtmlEncode
,我们为什么要使用AntiXss.HtmlEncode
?
为什么白名单方法比黑名单方法更好?
另外,在 Anti XSS 库中,我在哪里指定白名单?
您无法使用 AntiXSS 库指定或更改白名单,这在您考虑时并不奇怪。AntiXSS 库默认编码所有不在以下范围内的字符:0..9a..zA..Z。这组字符是安全的(因此在白名单上),不需要对它们进行编码。请注意,AntiXSS 库有不同的 javascript、html 和 url 编码列表。请不要对 url 使用 html 编码,因为您的应用程序中会存在安全漏洞。
请注意,上的白名单与上HtmlEncode
的白名单不同GetSafeHtmlFragment
。HtmlEncode
你说“请对不在白名单上的每个字符进行编码GetSafeHtmlFragment
”,然后说“请删除所有不在白名单上的标签和属性”。
当您使用 ASP.NET 4.0 时,我建议您不要(直接)使用 AntiXSS 库,而只需使用内置机制(例如 HttpUtility)来编码 Html。ASP.NET 4.0允许您在配置文件中配置一个 HttpEncoder。您可以编写自己的HttpEncoder
使用 AntiXSS 库的库(AntiXSS 库的未来版本可能会包含一个HttpEncoder
实现)。通过这样做,您的整个应用程序(以及所有 ASP.NET 控件和自定义控件)将使用白名单编码而不是黑名单编码。
ASP.NET 4.0 还为编码文本引入了一个新的代码块。您可以使用名字:<%: Model.FirstName %>
。但是,我个人觉得<%= HttpUtility.HtmlEncode(Model.FirstName) %>
更明确。
白名单总是比黑名单更安全——只要想想哪个更安全,列出所有不允许参加聚会的人或只允许参加聚会的人。(基本上黑名单只能处理明显的或以前使用过的攻击)。
AntiXss 库还包括 Javascript 或属性等的 Encode 方法。
我尝试实现 AntiXss 库,它确实可以很好地删除脚本标签。但未能使用 HTML 做到这一点。请参阅下面的示例
<a href="http://west-wind.com">West Wind</a><br>Hello<br>Please login with the form below before proceeding:<form action="”mybadsite.aspx”"><table><tbody><tr><td>Login:</td><td><input type="text" name="x_x_x_x_x_x_x_x_x_x_x_x_x_login"></td></tr><tr><td>Password:</td><td><input type="text" name="x_x_x_x_x_x_x_x_x_x_x_x_x_password"> </td></tr></tbody></table><input type="submit" value="LOGIN"></form>