Do not implement encodeJSON() based on encodeJS()
authorTim Düsterhus <duesterhus@woltlab.com>
Thu, 20 Jan 2022 10:12:37 +0000 (11:12 +0100)
committerTim Düsterhus <duesterhus@woltlab.com>
Thu, 20 Jan 2022 10:13:13 +0000 (11:13 +0100)
JSON strings are more restricted than JavaScript strings, by implementing
encodeJSON() based on encodeJS() we need to reverse some of the encoding.

Simplify this by implementing encodeJSON() as a standalone function.

wcfsetup/install/files/lib/util/StringUtil.class.php

index 8c806458ae07dd1ed776dd3203a5242e6c28ca76..46206d87367fb71a93a70af0475997dbe499a310 100644 (file)
@@ -143,12 +143,12 @@ final class StringUtil
      */
     public static function encodeJSON($string)
     {
-        $string = self::encodeJS($string);
+        $string = self::unifyNewlines($string);
 
-        $string = self::encodeHTML($string);
+        // This differs from encodeJS() by not encoding the single quote.
+        $string = \str_replace(["\\", '"', "\n", "/"], ["\\\\", '\\"', '\\n', '\\/'], $string);
 
-        // single quotes must be encoded as HTML entity
-        return \str_replace("\\'", "&#39;", $string);
+        return self::encodeHTML($string);
     }
 
     /**