0

JSON 形式で他のサーバーからの投稿を受け入れる PHP スクリプトがあります。外部サーバーでマジック クォートが有効になっている場合があるため、安全のために 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);
}
?>

そうすれば、魔法の引用符が有効になっているときにストリップスラッシュを適用するだけで、今のところ JSON が壊れないようです。

于 2013-04-21T22:53:00.757 に答える