在android中重新字符串化

zbq4xfa0  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(503)

我有一个字符串,我想在kotlin(android)中字符串化,但似乎 org.json.* 不支持获取字符串并重新对其进行字符串化,相反,它总是先尝试解析它。

val str = "test=\"123\""
val stringified = JSONObject(str).toString() // JSONException: Value a of type java.lang.String cannot be converted to `JSONObject`

此功能的用例是以安全的方式将数据传递给webview中的js。

val json = "test=\"123\""
webview.evaluateJavascript("window.onData(${json})")
// on the JS side it will look like this: window.onData(test="123")
// this is both invalid and insecure since it opens the door for raw JS injection

任何手动执行的尝试都会导致不安全的js字符串,而且可能是无效的
不应使用此示例: val insecureJSON = "'${str.replace("\\", "\\\\").replace("\"", "\\\"").replace("'", "\'")}'" 期望的行为:

val json = jsonStringifyString("test=\"123\"")
webview.evaluateJavascript("window.onData(${json})")
// rendered JS: window.onData("test=\"123\"")

在android中有没有一种简单的字符串化方法?

zhte4eai

zhte4eai1#

最后使用了 JSONArray 类并移除数组 Package 以欺骗类将普通字符串字符串化

fun jsonStringifyString(str: String): String {
    val jsonStr = JSONArray().put(str).toString()
    return jsonStr.substring(1, jsonStr.length - 1) // remove first and last char
}

val serializedData = jsonStringifyString("test=\"123\"");

webview.evaluateJavascript("window.onData(${serializedData})")
// rendered JS: window.onData("test=\"123\"")

相关问题