首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >esapi encodeForJavaScript新线限制?

esapi encodeForJavaScript新线限制?
EN

Stack Overflow用户
提问于 2015-01-24 01:35:03
回答 1查看 2.1K关注 0票数 2

我们在Spring项目中引入了esapi,以处理呈现到HTML和Javascript中的清理数据。我们使用的一个字段由第三方webservice设置,并将结果输出到Javascript变量中:

代码语言:javascript
复制
var errReason= '<esapi:encodeForJavaScript>${myOrder.rateErrorMessage}</esapi:encodeForJavaScript>';

问题是,WebService的结果有时会在末尾附加一个换行符。我认为encodeForJavascript应该处理换行符,但是上面的代码呈现如下:

代码语言:javascript
复制
var errReason 'This was an invalid request: missing required parameter
';

esapi是否按设计运行?是否有其他办法来处理这个问题?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-28 17:39:34

对于给定的信息,不可能是esapi导致您的问题。下列单元测试通过:

代码语言:javascript
复制
@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,并采取了巨大的自由。

代码语言:javascript
复制
@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中完成这项工作,您可以使用如下内容:

代码语言:javascript
复制
public abstract class SecureBean {
     private Encoder encoder = ESAPI.encoder();
     public String escapeForJavaScript(String input){
          return encoder.escapeForJavaScript(input);
     }
}

然后继承:

代码语言:javascript
复制
public class OrderBean extends SecureBean {
     String rateErrorMessage;  //with getters/setters assumed
}

在您的jsp中:

代码语言:javascript
复制
var errReason= '${myOrder.escapeForJavaScript(myOrder.rateErrorMessage())}';

其中有些内容有点冗长,但这里的目标是不要尝试执行JSP的呈现顺序。您还可以考虑为编码/解码编写适配器接口,以便可以交换编码器实现--esapi已经失去了OWASP的旗舰状态,并且在大约1.5年内没有进行过重大修订。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28121363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档