0

我有一个 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 进行处理。

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

4

1 回答 1

0

我在 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);
}
?>

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

于 2013-04-21T22:53:00.757 回答