我正在获取存储在MySQL中的JSON代码并且它有额外的斜杠,我必须删除它才能在JavaScript中解析它,然后我将它打印在页面上。现在我正在做以下事情:
switch
这是一个示例JSON代码,因为它来自MySQL:
$save = str_replace("\n", "<br>", $save); // Replace new line characters with <br>
$save = str_replace('\\"', '"', $save); // top-level JSON
$save = str_replace('\\\\"', '\"', $save); // HTML inside top level JSON
$save = str_replace('\\\\\\\\\\"', '\\\\\"', $save); // HTML inside second level JSON
以下是它应该如何正确解析(使用jsonlint.com进行测试):
{\"id\":2335,\"editor\":{\"selected_shape\":\"spot-7488\"},\"general\":{\"name\":\"HTML Test\",\"shortcode\":\"html-test\",\"width\":1280,\"height\":776},\"spots\":[{\"id\":\"spot-7488\",\"x\":9.9,\"y\":22.6,\"default_style\":{\"use_icon\":1},\"tooltip_content\":{\"content_type\":\"content-builder\",\"plain_text\":\"<p class=\\\"test\\\">Test</p>\",\"squares_json\":\"{\\\"containers\\\":[{\\\"id\\\":\\\"sq-container-293021\\\",\\\"settings\\\":{\\\"elements\\\":[{\\\"settings\\\":{\\\"name\\\":\\\"Paragraph\\\",\\\"iconClass\\\":\\\"fa fa-paragraph\\\"},\\\"options\\\":{\\\"text\\\":{\\\"text\\\":\\\"<p class=\\\\\\\"test\\\\\\\">Test</p>\\\"}}}]}}]}\"}}]}
请注意我在JSON中有HTML代码,这是在另一个JSON中,这是它有点混乱的地方。
我的问题 - 是否有PHP的函数或库(JS也可以使用),它涵盖了所有这些极端情况,因为我确信有人会找到破解脚本的方法。
谢谢!
答案 0 :(得分:0)
简短的答案,非常不合适,是你使用stripslashes。这个答案不充分的原因是你的JSON字符串可能已经转义或多次调用 addslashes 而你必须每次都调用一次striplashes这发生了。
正确的解决方案是找出斜杠的添加位置,并且a)避免添加斜线或b)理解为什么斜杠在那里并做出相应的响应。我坚信创建破解JSON的过程就是问题所在。
在某些情况下,通常会在PHP中添加斜杠:
magic_quotes已开启。这是一个旧的PHP功能,已被删除。基本思想是PHP用于自动转义传入请求中的引号,以便让您只将传入的字符串塞入数据库。你猜怎么着? 不安全。
add_slashes。为什么叫这个?有些人在将数据粘贴到数据库之前将其用作转义数据的错误方法。其他人使用它来防止HTML在回显变量时破坏(可能应该使用htmlspecialchars)。当您在字符串中定义代码时,它也可以在各种其他 meta 情况下派上用场。
转义数据输入时。最常见的转义函数是mysqli_real_escape_string。在将数据库插入数据库之前转义值以防止sql注入和其他攻击非常重要,但是你永远不应该逃避两次。
因此,您的代码可能是双重转义的东西,或者调用了addslashes或者magic_quotes之类的东西导致了问题,但我怀疑这是另一个问题:某些JS代码可能正在提供这个JSON不是一个合适的JSON字符串,而是一个已被转义的字符串,以便在javascript 中定义字符串。
如果您使用上面的示例JSON字符串,并在其周围打一些引号:
var myJSON = "<put your string here>";
然后 SURPRISE 你的javascript没有被破坏,var myJSON包含一个实际上是有效JSON的字符串,可以被解析成一个有效的JSON对象:
var myJSON = "{\"id\":2335,\"editor\":{\"selected_shape\":\"spot-7488\"},\"general\":{\"name\":\"HTML Test\",\"shortcode\":\"html-test\",\"width\":1280,\"height\":776},\"spots\":[{\"id\":\"spot-7488\",\"x\":9.9,\"y\":22.6,\"default_style\":{\"use_icon\":1},\"tooltip_content\":{\"content_type\":\"content-builder\",\"plain_text\":\"<p class=\\\"test\\\">Test</p>\",\"squares_json\":\"{\\\"containers\\\":[{\\\"id\\\":\\\"sq-container-293021\\\",\\\"settings\\\":{\\\"elements\\\":[{\\\"settings\\\":{\\\"name\\\":\\\"Paragraph\\\",\\\"iconClass\\\":\\\"fa fa-paragraph\\\"},\\\"options\\\":{\\\"text\\\":{\\\"text\\\":\\\"<p class=\\\\\\\"test\\\\\\\">Test</p>\\\"}}}]}}]}\"}}]}";
console.log(JSON.parse(myJSON)); // this is an actual object
这里的关键是检查这个JSON到达你系统的入口点。我怀疑一些AJAX请求创建了一些对象,而不是发送该对象的有效JSON,而是发送一个JSON对象的转义字符串。
编辑:
这是一个简单的例子,说明当编码太多时会发生什么。尝试在浏览器中运行此JS并观察控制台输出:
var myObj = {"key":"here is my value"};
console.log(myObj);
var myJSON = JSON.stringify(myObj);
console.log(myJSON);
var doubleEncoded = JSON.stringify(myJSON);
console.log(doubleEncoded);