【问题标题】:JSON post with magic quotes plus a quote character in the data带有魔术引号的 JSON 帖子加上数据中的引号字符
【发布时间】:2013-02-07 18:08:11
【问题描述】:

我有一个 PHP 脚本,它接受来自其他服务器的 JSON 格式的帖子。有时外部服务器启用了魔术引号,所以为了安全起见,我通过 stripslashes() 传递它。但是,当发布的数据也有引号字符时,我遇到了问题。这也被远程服务器转义,然后我的服务器上的 stripslashes 也错误地剥离了它,从而破坏了 JSON。

例如,我可以轻松地传递和接受以下 JSON:

stuff = {"items":["item1","item2"],
"urls":["url1","url2"],
"pics":["pic1","pic2"]};

但是,这会中断:

stuff = {"items":["item_including_quotes1","item_including_quotes2"],
"urls":["url1","url2"],
"pics":["pic1","pic2"]};

我无法控制远程数组值,它们可以包含单引号和双引号。我确实可以控制他们如何准备发送。目前的 javascript 看起来像这样:

encodeURIComponent(JSON.stringify(stuff));

PHP 看起来像这样:

json_decode(stripslashes(urldecode($_POST["stuff"])));

此数据使用 javascript JSON.stringify 和 encodeuricompnent 发布,并使用 PHP json_decode 和 urldecode 处理。

我考虑了一个正则表达式,仅当它们出现在括号 [] 之间时才删除反斜杠,但这似乎很笨拙。是否有更优雅的解决方案来仅删除某些斜线?

【问题讨论】:

  • 我通过将对象元素发送到一个用 " 替换引号的函数来解决这个问题。在 stringify 调用之前,然后在 php 脚本中解码 html 实体。有兴趣看看是否有人有更优雅的解决方案。

标签: php json stringify


【解决方案1】:

我在 JSON 结构中的字符串值中传递 HTML 代码,遇到了同样的问题。 但是,我不必替换引号,因为 JSON.stringify 给了我一个格式良好的字符串。

我所做的是实现了此处所述的修改后的功能: http://www.php.net/manual/en/security.magicquotes.disabling.php

<?php
if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}
?>

这样,它只在启用魔术引号时应用斜杠,到目前为止它似乎没有破坏我的 JSON。

【讨论】:

    猜你喜欢
    • 2010-09-18
    • 2010-12-21
    • 2019-08-09
    • 1970-01-01
    • 2012-05-20
    • 2012-10-16
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多