4

例として仮定www.mydomain.com?param1=exampleします。

キーと値のペアのリストである 2 番目のパラメーターを格納する最良の方法は何ですか? 私が使用する分に&param2=key|value,key|value。縦線を使用して値からキーを分離し、コンマとのペアを使用します。等号の後のすべてがencodeURIComponent(). これはうまくいきます。

ただし、ユーザーは値を制御できます...そして賢明な人間として、ユーザーがおそらく最初に行うことは、パラメーターパーサーを壊す値の1つとして垂直バーまたはコンマを貼り付けることであることを私たちは皆知っています。これを行うより良い方法はありますか?PHP ユーザーが関連付けられた配列を URL に格納することについて話しているのを見てきましたが、私は純粋な JavaScript ソリューションを探しています。

4

4 に答える 4

6

PHP (およびその他のサーバー側言語) は、クエリ文字列での配列の受け渡しをサポートしています。

www.mydomain.com?param1=example&param2[key1]=value1&param2[key2]=value2

PHP は GET 文字列を次のように解析します。

array(2) {
  ["param1"]=>
  string(7) "example"
  ["param2"]=>
  array(2) {
    ["key1"]=>
    string(6) "value1"
    ["key2"]=>
    string(6) "value2"
  }
}

キーを渡さない場合は、数値配列になります。

www.mydomain.com?param1=example&param2[]=value1&param2[]=value2

次のように解析されます。

array(2) {
  ["param1"]=>
  string(7) "example"
  ["param2"]=>
  array(2) {
    [0]=>
    string(6) "value1"
    [1]=>
    string(6) "value2"
  }
}

UPDATE : JavaScript でクエリ文字列を解析することもできます。

これは、私が作成した簡単な jQuery プラグインです。

$.parseQuery = function(str) {
    var ret = {};
    $.each(str.split("&"), function() {
        var data = this.split('='),
            name = decodeURIComponent(data.shift()),
            val = decodeURIComponent(data.join("=")).replace('+', ' '),
            nameVal = name.match(/(.*)\[(.*)\]/);

        if (nameVal === null) {
            ret[name] = val;
        }
        else {
            name = nameVal[1];
            nameVal = nameVal[2];
            if (!ret[name]) {
                ret[name] = nameVal ? {} : [];
            }
            if ($.isPlainObject(ret[name])) {
                ret[name][nameVal] = val;
            }
            else if($.isArray(ret[name])){
                ret[name].push(val);
            }
        }
    });
    return ret;
};

次に、次のことができます$.parseQuery('param1=example&param2[]=value1&param2[]=value2');

于 2012-08-29T14:44:48.383 に答える
0

考えられる解決策は、ユーザー入力のパイプとコンマを URL に投稿する前にエスケープすることです。

つまり、ユーザー入力値をサニタイズし、|and,をコードを壊さないものに置き換えるか、完全に削除することを意味します。

于 2012-08-29T14:30:54.577 に答える
0

偶然の改ざんを防ぐために、チェックサムを追加し、値を base-64 エンコードしてから、結果の文字列を encodeURIComponent() することができます。( Javascript を使用して Base64 にエンコードするにはどうすればよいですか?およびJavaScript CRC32を参照してください。)

もちろん、これは本当に決心した人があなたの値をいじるのを防ぐことはできませんが、単に URL をいじるのが好きな人の速度を低下させます。

于 2012-08-29T14:52:56.430 に答える
-1

キーと値のペアのリストをシリアル化することを考えるとき、すぐにクエリ文字列の使用を思いつきます。

基本 (逆シリアル化を示すために使用される JSON) の場合:

foo=bar&foo=baz&fizz=buzz&alpha&beta=

本質的には次のとおりです。

{
    foo: [
        'bar',
        'baz'
    ],
    fizz: 'buzz',
    alpha: null,
    beta: ''
}

ただし、特殊文字はエスケープする必要があります。

foo=bar%26baz

本質的には次のとおりです。

{
    foo: 'bar&baz'
}

これが意味することは、クエリ文字列を別のクエリ文字列の値として渡すことができるということです:

foo=bar%3Dbaz%26fizz%3Dbuzz

本質的には次のとおりです。

{
    foo: 'bar=baz&fizz=buzz'
}

そしてfoo、生成するために解析できます:

{
    bar: baz,
    fizz: buzz
}

そうは言っても、エンコード/デコード中に間違いを犯すのは非常に簡単であり、二重エンコードと二重デコードを開始するとすぐに、問題が発生することが保証されています. 可能であれば、単一のクエリ文字列を使用して必要なすべてのデータを含め、クエリ文字列内にクエリ文字列を埋め込まないでください。

于 2012-08-29T14:39:33.350 に答える