在 commons lang3 中使用 StringEscapeUtils.escapeJavaScript() 的替代方法

Alternative to using StringEscapeUtils.escapeJavaScript() in commons lang3

我的任务是将我们的代码从使用 org.apache.commons.lang 更新为 org.apache.commons.lang3,我发现新版本的 StringEscapeUtils 不再具有方法 escapeJavaScript() 但是我们在整个代码中的很多地方都使用了它。

我一直在阅读文档,似乎 StringEscapeUtils 的整个内容都被重写为 lang3 (see release notes lang 3.3.2) and with this rewrite they removed escapeJavaScript() however they haven't said what to use as an alternative in any of their documentation (Not that I can see anyway). Here's the what's new documentation.

所以我的问题是,我不是唯一注意到并遇到过这个问题的人,那么除了使用 StringEscapeUtils.escapeJavaScript() 之外还有什么替代方法?

escapeEcmaScriptescapeJson 中的任何一个都是合适的替代品。

根据 Apache Commons 弃用页面,我们应该使用:

  • Apache Commons 文本

我能够通过检测何时对 base64 数据标签进行 htmlEncoding 来修改 owasp 代码来解决此问题,这似乎没有必要。

我相信这是安全的,因为此代码不执行 security checks,而只是避免对数据 url 执行 encodeHTML。如果有人不知道,我想知道。谢谢!

  private static void encodeHtmlOnto(
      String plainText, Appendable output, @Nullable String braceReplacement)
          throws IOException {

    if(plainText!=null && plainText.startsWith("data:image")) {
      //Don't touch the base64 encoded images. This messes up the diffing of things.
      output.append(plainText);
      return;
    }
...

以下 owasp 代码补丁将使它单独保留 img 数据标签。

Index: org/owasp/html/Encoding.java
<+>UTF-8
===================================================================
diff --git a/api/app-ejb/src/main/java/org/owasp/html/Encoding.java b/api/app-ejb/src/main/java/org/owasp/html/Encoding.java
--- a/api/app-ejb/src/main/java/org/owasp/html/Encoding.java    (revision c5c815dda1f5c89d2e515d676b8c143591b68d8c)
+++ b/api/app-ejb/src/main/java/org/owasp/html/Encoding.java    (date 1649080667669)
@@ -166,6 +166,7 @@
   static void encodeHtmlAttribOnto(String plainText, Appendable output)
       throws IOException {
     encodeHtmlOnto(plainText, output, "{\u200B");
+    output.append(plainText);
   }
 
   /**
@@ -234,6 +235,13 @@
   private static void encodeHtmlOnto(
       String plainText, Appendable output, @Nullable String braceReplacement)
           throws IOException {
+
+    if(plainText!=null && plainText.startsWith("data:image")) {
+      //Don't touch the base64 encoded images. This messes up the diffing of things.
+      output.append(plainText);
+      return;
+    }
+
     int n = plainText.length();
     int pos = 0;
     for (int i = 0; i < n; ++i) {