esapi encodeForJavaScript 换行限制?
esapi encodeForJavaScript Newlines Limitation?
我们将 esapi 引入了我们的 Spring JSP 项目来处理渲染到 HTML 和 Javascript 中的净化数据。我们使用的一个字段是由第三方网络服务设置的,我们将结果输出到一个 Javascript 变量中:
var errReason= '<esapi:encodeForJavaScript>${myOrder.rateErrorMessage}</esapi:encodeForJavaScript>';
问题是 WebService 的结果有时会在末尾附加一个换行符。我原以为 encodeForJavascript 应该处理换行符,但上面的代码呈现如下:
var errReason 'This was an invalid request: missing required parameter
';
esapi 是否按设计运行?有没有其他方法可以解决这个问题?
谢谢。
根据给定的信息,这里不可能是 esapi 导致了您的问题。以下单元测试通过:
@Test
public void testWindowsNewline() {
Encoder instance = ESAPI.encoder();
assertEquals("\x0D\x0A", instance.encodeForJavaScript("\r\n"));
}
FWIW,taglibs are just wrappers around the esapi encoder class.
您似乎正在使用嵌入在 javascript 字符串中的标签库,如果我在我的团队的代码审查中看到这种情况,我会将其标记为缺陷,原因如下:
JSP 编译器在呈现页面时会经历多个步骤。您有 HTML 呈现、数据绑定和 JSTL 绑定,仅举几例。由于此顺序是特定于实现的,因此您想尝试避免像此处那样混合代码。
我怀疑 JSP 编译器在调用 <esapi:encodeForJavaScript></esapi:encodeForJavaScript>
之前将 "\r\n"
解释为 HTML 空格。
以下是我过去做过的一些事情。我倾向于在 Controller/Service 层转义。此示例假定 Spring MVC,并且具有很大的自由度。
@Controller
public class FooController {
//This should actually be done in a service class, but this is for demo
private Encoder = ESAPI.encoder();
@Autowired
private DataService dataService;
//logic for handling request
public String returnStringEscapedForJavascriptContext(){
OrderBean myOrder = dataService.getMyOrder();
String unescaped = myOrder.getRateErrorMessage();
String escapedAsJavascriptData = encoder.encodeForJavaScript(unescaped);
return escapedAsJavascriptData ;
}
}
如果您将 myOrder
转换为 viewBean 等,同样的基本逻辑将适用。
另一种解决方案是将安全的 esapi 转义方法包装为一个抽象 class,如果您真的必须在 JSP 中完成这项工作,那么您的所有视图 bean 都是从中继承的。你可以有这样的东西:
public abstract class SecureBean {
private Encoder encoder = ESAPI.encoder();
public String escapeForJavaScript(String input){
return encoder.escapeForJavaScript(input);
}
}
然后继承:
public class OrderBean extends SecureBean {
String rateErrorMessage; //with getters/setters assumed
}
现在在你的 jsp:
var errReason= '${myOrder.escapeForJavaScript(myOrder.rateErrorMessage())}';
有些内容有点冗长,但这里的目标是不要尝试和踩踏 JSP 的渲染顺序。您还可以考虑为 encoding/decoding 编写一个适配器接口,这样您就可以换掉编码器实现——esapi 已经失去了 OWASP 的旗舰地位,并且在 ~1.5 年内没有进行重大修订。
我们将 esapi 引入了我们的 Spring JSP 项目来处理渲染到 HTML 和 Javascript 中的净化数据。我们使用的一个字段是由第三方网络服务设置的,我们将结果输出到一个 Javascript 变量中:
var errReason= '<esapi:encodeForJavaScript>${myOrder.rateErrorMessage}</esapi:encodeForJavaScript>';
问题是 WebService 的结果有时会在末尾附加一个换行符。我原以为 encodeForJavascript 应该处理换行符,但上面的代码呈现如下:
var errReason 'This was an invalid request: missing required parameter
';
esapi 是否按设计运行?有没有其他方法可以解决这个问题?
谢谢。
根据给定的信息,这里不可能是 esapi 导致了您的问题。以下单元测试通过:
@Test
public void testWindowsNewline() {
Encoder instance = ESAPI.encoder();
assertEquals("\x0D\x0A", instance.encodeForJavaScript("\r\n"));
}
FWIW,taglibs are just wrappers around the esapi encoder class.
您似乎正在使用嵌入在 javascript 字符串中的标签库,如果我在我的团队的代码审查中看到这种情况,我会将其标记为缺陷,原因如下:
JSP 编译器在呈现页面时会经历多个步骤。您有 HTML 呈现、数据绑定和 JSTL 绑定,仅举几例。由于此顺序是特定于实现的,因此您想尝试避免像此处那样混合代码。
我怀疑 JSP 编译器在调用 <esapi:encodeForJavaScript></esapi:encodeForJavaScript>
之前将 "\r\n"
解释为 HTML 空格。
以下是我过去做过的一些事情。我倾向于在 Controller/Service 层转义。此示例假定 Spring MVC,并且具有很大的自由度。
@Controller
public class FooController {
//This should actually be done in a service class, but this is for demo
private Encoder = ESAPI.encoder();
@Autowired
private DataService dataService;
//logic for handling request
public String returnStringEscapedForJavascriptContext(){
OrderBean myOrder = dataService.getMyOrder();
String unescaped = myOrder.getRateErrorMessage();
String escapedAsJavascriptData = encoder.encodeForJavaScript(unescaped);
return escapedAsJavascriptData ;
}
}
如果您将 myOrder
转换为 viewBean 等,同样的基本逻辑将适用。
另一种解决方案是将安全的 esapi 转义方法包装为一个抽象 class,如果您真的必须在 JSP 中完成这项工作,那么您的所有视图 bean 都是从中继承的。你可以有这样的东西:
public abstract class SecureBean {
private Encoder encoder = ESAPI.encoder();
public String escapeForJavaScript(String input){
return encoder.escapeForJavaScript(input);
}
}
然后继承:
public class OrderBean extends SecureBean {
String rateErrorMessage; //with getters/setters assumed
}
现在在你的 jsp:
var errReason= '${myOrder.escapeForJavaScript(myOrder.rateErrorMessage())}';
有些内容有点冗长,但这里的目标是不要尝试和踩踏 JSP 的渲染顺序。您还可以考虑为 encoding/decoding 编写一个适配器接口,这样您就可以换掉编码器实现——esapi 已经失去了 OWASP 的旗舰地位,并且在 ~1.5 年内没有进行重大修订。