Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsp esapi encodeForJavaScript换行限制?_Jsp_Esapi - Fatal编程技术网

Jsp esapi encodeForJavaScript换行限制?

Jsp esapi encodeForJavaScript换行限制?,jsp,esapi,Jsp,Esapi,我们在SpringJSP项目中引入了esapi,以处理呈现为HTML和Javascript的净化数据。我们使用的一个字段由第三方Web服务设置,并将结果输出到Javascript变量中: var errReason= '<esapi:encodeForJavaScript>${myOrder.rateErrorMessage}</esapi:encodeForJavaScript>'; esapi是否按设计运行?有没有其他办法来处理这个问题 谢谢。根据给定的信息,这里的

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

var errReason= '<esapi:encodeForJavaScript>${myOrder.rateErrorMessage}</esapi:encodeForJavaScript>';
esapi是否按设计运行?有没有其他办法来处理这个问题


谢谢。

根据给定的信息,这里的问题不可能是esapi造成的。以下单元测试通过:

@Test
public void testWindowsNewline() { 
     Encoder instance = ESAPI.encoder(); 
     assertEquals("\\x0D\\x0A", instance.encodeForJavaScript("\r\n")); 
}
FWIW

您似乎正在使用javascript字符串中嵌入的标记库,如果我在团队的代码审查中看到这一点,我会将其标记为缺陷,原因如下:

JSP编译器在呈现页面时要经历多个步骤。您有HTML呈现、数据绑定和JSTL绑定,仅举几个例子。因为这种排序是特定于实现的,所以您希望尽量避免像这里这样混合代码

我怀疑JSP编译器在调用
之前将
“\r\n”
解释为HTML空白

以下是我过去做过的几件事。我倾向于在控制器/服务层转义。这个例子假设了SpringMVC,并且有很大的自由度

@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中执行此项工作,您可以有如下内容:

var errReason 'This was an invalid request: missing required parameter
';
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年内还没有进行过大的修改。p> 需要更多的背景。Web服务是在JSP本身上调用的,还是在控制器的后端处理的?另外,您是如何提取似乎要呈现的值的?我认为您根本不需要该上下文。。。但在这种情况下,Web服务是在后端调用的。它保存到数据库中并加载到JSP中。我通过将Web服务的返回编组到POJO并从那里将其写入db来提取该值。但为什么这些都很重要呢?底线是,我有一个Java字符串对象,它的最后一个字符是换行符,而esapi没有正确地处理它。如果我没有解释清楚这种情况,请让我知道,我会尽量详细说明。我不相信ESAPI是你的问题。试试这个JUnit:[
public void testWindowsNewline(){Encoder instance=ESAPI.Encoder();assertEquals(“\\x0D\\x0A”,instance.encodeForJavaScript(“\r\n”);}
]ESAPI的taglibs只是包装对该方法的调用,顺便说一句,我怀疑问题是因为您在javascript上下文中对jsp进行转义,而我们实际上应该在服务层进行转义。非常有用。我一直在忙于另一个实现,所以我无法回到这个问题上来,但我认为你是对的。我将在控制器中转义该值,并将其传递到视图中。感谢您的洞察力和辛勤工作。