我们在Spring项目中引入了esapi,以处理呈现到HTML和Javascript中的清理数据。我们使用的一个字段由第三方webservice设置,并将结果输出到Javascript变量中:
var errReason= '<esapi:encodeForJavaScript>${myOrder.rateErrorMessage}</esapi:encodeForJavaScript>';问题是,WebService的结果有时会在末尾附加一个换行符。我认为encodeForJavascript应该处理换行符,但是上面的代码呈现如下:
var errReason 'This was an invalid request: missing required parameter
';esapi是否按设计运行?是否有其他办法来处理这个问题?
谢谢。
发布于 2015-01-28 17:39:34
对于给定的信息,不可能是esapi导致您的问题。下列单元测试通过:
@Test
public void testWindowsNewline() {
Encoder instance = ESAPI.encoder();
assertEquals("\\x0D\\x0A", instance.encodeForJavaScript("\r\n"));
}FWIW,taglibs只是esapi编码器类的包装器。
您似乎在使用嵌入在javascript字符串中的标记库,如果我在团队的代码评审中看到这种情况,我会将其标记为一个缺陷,原因如下:
JSP编译器在呈现页面时会经历多个步骤。您有HTML呈现、数据绑定和JSTL绑定,仅举几个例子。由于这种排序是特定于实现的,所以您希望尽量避免使用像这里这样的混合代码。
我怀疑JSP编译器在调用"\r\n"之前将<esapi:encodeForJavaScript></esapi:encodeForJavaScript>解释为HTML空格。
这是我过去做过的几件事。我倾向于在Controller/Service层转义。这个例子假设Spring,并采取了巨大的自由。
@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转义方法包装为所有视图bean继承的抽象类,因此,如果您真的必须在JSP中完成这项工作,您可以使用如下内容:
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的呈现顺序。您还可以考虑为编码/解码编写适配器接口,以便可以交换编码器实现--esapi已经失去了OWASP的旗舰状态,并且在大约1.5年内没有进行过重大修订。
https://stackoverflow.com/questions/28121363
复制相似问题