我知道,我们可以使用encodeForHTML来处理HTMl,使用encodeForJavascript来处理javaScript。 我的代码中有一个跨站点脚本:“Reflected fortify scan Problem”
String errorDesc = HttpServletRequest.getParameter("error_description");
我必须使用编码器来验证这一点,但我很困惑应该在它们之间使用哪一个。由于我们不知道 HttpServletRequest.getParameter 的返回类型。
1. org.owasp.esapi.Encoder.encodeForHTML
2. org.owasp.esapi.Encoder.encodeForJavaScript
最佳答案
亲爱的提问者,我们对输出编码之间的差异有一个相当常见的误解——这是您在查看编码器调用时所使用的内容,而输入验证是一个完全独立的操作,它具有与 Encoder
关系不大类(class)。
Encoder
您在这里处理的方法仅在向用户呈现数据时使用,并且仅用于正确的上下文。例如,如果应用程序是“单页应用程序”(SPA),那么您很可能只想确保输出针对 JavaScript 进行编码,因为面向客户端的框架几乎肯定是 JavaScript。
如果您使用的是较旧风格的应用程序,那么只要您要将数据放置在 <some_tag> data </some_tag>
之间,您就可以对 HTML 进行编码。 。
XSS 要求您了解应用程序中每个变量的一件事:它的数据流,从生成值时开始(服务器、用户、数据库等)并了解所有转换它可能会在遍历到用户并返回到系统时发生。如果该值在浏览器中启动,它将进入后端的某种 Controller ,在处理该值之前,您将对其进行白名单验证 - ESAPI 有一个 validator 类 - 然后如果它通过验证,您将确保数据库仅将其视为数据(PreparedStatement,或通过使用 ORM 框架的实用程序。)最佳实践是
- 规范化数据
- 根据规范化值进行验证
- 如果有效,则丢弃规范化值并存储原始数据
如果使用得当,Validator
默认类可以帮助您执行此操作。
您在此问题中询问的方法适用于将用户输入发送回浏览器的情况,无论是从数据库还是从 session 中尚未保留的先前请求。
关于java - org.owasp.esapi.Encoder.encodeForHTML 和 org.owasp.esapi.Encoder.encodeForJavaScript 方法之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62144738/