我知道,我们可以用encodeForHTML来处理HTMl,用encodeForJavascript来处理javaScript.有一个跨站脚本。在我的代码中,有一个 "Reflected fortify扫描问题"。
String errorDesc = HttpServletRequest.getParameter("error_description");
我必须使用Encoder来验证,但我很困惑,我应该在它们之间使用哪一个。因为我们不知道HttpServletRequest.getParameter的返回类型。
1. org.owasp.esapi.Encoder.encodeForHTML
2. org.owasp.esapi.Encoder.encodeForJavaScript
亲爱的提问者,我们在这里有一个相当普遍的误解,就是对输出编码和输入验证之间的区别--当你看到Encoder调用时,这就是你正在处理的东西,而输入验证是一个完全独立的操作,它与 Encoder
类。
的 Encoder
你在这里处理的方法只有在你向用户展示数据的时候才会使用,而且只能用于正确的上下文。 例如,如果应用程序是 "单页应用程序"(SPA),那么很可能你只是想确保输出是为JavaScript编码的,因为面向客户端的框架几乎肯定是JavaScript。
如果你使用的是旧式的应用程序,那么你会在任何时候为HTML编码,你将把数据放置在你的应用程序之间。<some_tag> data </some_tag>
.
XSS需要你明白一件事,对于 每一 在你的应用程序中的变量。 它的数据流,从值产生的时候(服务器,用户,DB等),了解它在传递给用户和回到系统时可能经历的所有转换。 如果值是从浏览器开始的,它将进入后端的某种Controller,在你处理这个值之前,你将对它进行白名单验证--ESAPI有一个验证器类--然后如果它通过了验证,你将确保数据库只将它作为数据处理(PreparedStatement,或者通过使用ORM框架的实用程序。
如果使用得当, Validator
类是默认的,以帮助你做到这一点。
你在这个问题中问到的方法是针对用户输入被送回浏览器的情况,无论是从数据库还是从你的会话中尚未被持久化的先前请求。