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 年内没有进行重大修订。