如何通过OWASP HTML Sanitizer允许特定字符?
我正在使用OWASP Html Sanitizer来防止我的Web应用程序受到XSS攻击。 对于许多应该是纯文本的领域,Sanitizer的工作量超出了我的预期。
例如:
HtmlPolicyBuilder htmlPolicyBuilder = new HtmlPolicyBuilder();
stripAllTagsPolicy = htmlPolicyBuilder.toFactory();
stripAllTagsPolicy.sanitize('a+b'); // return a+b
stripAllTagsPolicy.sanitize('foo@example.com'); // return foo@example.com
当我有字段,如电子邮件地址有一个+
在它如foo+bar@gmail.com
我结束了在数据库中的错误数据。 所以有两个问题:
+ - @
这样的字符是否真的需要进行编码? 问题2对我来说是一个更重要的答案。
XSS的危险之处在于,一个用户可能会在他的输入数据中插入html代码,然后您将该代码插入到发送给另一个用户的网页中。
原则上有两种策略可以遵循,如果你想防范这一点。 您可以在用户输入系统时删除所有危险字符,也可以在稍后将其写回浏览器时对危险字符进行html编码。
第一个策略的例子:
用户输入数据(带html代码)
第二个策略的例子:
第一种策略比较简单,因为通常使用它们的读取数据比较少。 但是,它也更困难,因为它可能会破坏数据。 如果您需要数据以外的其他信息(例如使用电子邮件地址实际发送电子邮件),则要特别困难。 它使得它更难以在数据库中进行搜索,在pdf报告中包含数据,在电子邮件中插入数据等等。
另一种策略的优点是不会破坏输入数据,因此您稍后想要使用数据的自由度更大。 但是,实际检查您是否对所有发送给浏览器的用户提交的数据进行了html编码可能会更困难。 解决您的特定问题的方法是在网页上放置该电子邮件地址(或者如果)时,对电子邮件地址进行html编码。
XSS问题是您将用户提交的数据与控制代码混合时出现的更常见问题的示例。 SQL注入是同样问题的另一个例子。 问题是用户提交的数据被解释为指令而不是数据。 第三个不太知名的例子是,如果您将用户提交的数据混合在电子邮件中。 用户提交的数据可能包含电子邮件服务器解释为指令的字符串。 这种情况下的“危险字符”是一个换行符,后跟“From:”。
对于所有可能的控制字符或字符序列来说,验证所有输入数据是不可能的,这些字符或序列可能在某些方面被解释为将来某些潜在应用中的指令。 唯一的永久性解决方案就是在实际使用这些数据时,实际上对所有可能不安全的数据进行清理。
您可能想要使用ESAPI API来过滤特定字符。 尽管如果您想要允许特定的HTML元素或属性,您可以使用以下allowElements和allowAttributes。
//定义策略。
Function<HtmlStreamEventReceiver, HtmlSanitizer.Policy> policy
= new HtmlPolicyBuilder()
.allowElements("a", "p")
.allowAttributes("href").onElements("a")
.toFactory();
// Sanitize your output.
HtmlSanitizer.sanitize(myHtml, policy.apply(myHtmlStreamRenderer));
说实话,你应该对所有用户提供的输入做一个白名单。 如果它是一个电子邮件地址,只需使用OWASP ESAPI或其他东西来验证输入与他们的验证器和电子邮件正则表达式。
如果输入通过白名单,您应该继续并将其存储在数据库中。 将文本显示回用户时,您应该始终使用HTML编码。
您的黑名单方法不是OWASP推荐的,可能会被承诺攻击用户的人绕过。
链接地址: http://www.djcxy.com/p/63991.html上一篇: How to allow specific characters with OWASP HTML Sanitizer?