2

URL のハッシュにいくつかの JavaScript 変数を格納する方法を探しています。私の目的は、ユーザーがブックマークを使用して Web アプリケーションの特定の状態を復元できるようにすることです。

あるアプローチで JSON シリアライゼーションを使用する可能性があることに気がつきました。つまり、変数を次のように保存します

var params = { var1: window.val1, var2: window.val2 }
window.location.hash = JSON.stringify(params)

このようにそれらを回復します

var paramStr = window.location.hash.substring(1) // substring removes the initial "#"
var params = JSON.parse(paramStr)
window.var1 = params.var1
window.var2 = params.var2

これは、私がやりたいことを行うための最も単純で簡潔な手法のようです。私には理解しやすく、たとえば、この人気のある SO 提案よりも少ないコード行を使用します。とはいえ、不安でもあります。悪意のあるユーザーが URL に任意のコードを書き込むことができ、私のアプリがそれを実行する可能性があります。これは危険に思えますが、私は Web プログラミングにかなり慣れていないので、これがどれほど大きな問題なのかわかりません。

window.location.hash変数を安全に保存するために上で概説した手法は使用できますか? そうでない場合、なぜですか?起こりうる最悪の事態は何ですか?

4

3 に答える 3

5

はい、任意のデータを解析しても安全です。JSONパーサーは、オブジェクト/配列/文字列/数値の定義とは異なることを行うコードを実行しません。ネイティブのものはまったく使用evalしません(そして非ネイティブのものは使用する前にJSONデータを検証しますeval)。

コードがそれらの変数で「悪い」ことをしないと仮定して、それを事前定義された(グローバル)変数に割り当てることも安全です。

ただし、それを任意のグローバル変数に割り当てることは必ずしも安全ではありません。JSONに関数を含めることはできませんが、グローバルを誰にも上書きできないようにする必要があります。

于 2013-01-13T22:01:17.477 に答える
4

悪意のあるユーザーがURLに任意のコードを書き込む可能性があります[...]この手法は[...]安全に使用できますか?

安全です。JSON.parse()古いアプローチに対する利点の1つは、eval()安全であり、任意のコードが実行されないことです。

別の質問は次のとおりです。JSONをハッシュに入れるのは良い考えですか?もっと簡潔に表現したいと思います。

于 2013-01-13T22:01:44.450 に答える
0

教訓の1つは、すべてのユーザー入力が決して信頼されるべきではないということです。

常にすべてを検証します。アプリの場合、オフラインのみの場合は、悪意のあるユーザーが何を入力しても、自分のコンピューターにのみ影響するため、実際には問題になりません。

サーバー側のアクティビティが含まれる場合は、受け取った入力に意味があることを確認する必要があります。たとえば、ユーザーが保存されたファイルにアクセスしようとしている場合、ユーザーにはそのファイルを表示する権限がありますか?

隠すことにはセキュリティがないため、ハッシュ内のJSONは複雑な暗号化方式と同じくらい安全です。

于 2013-01-13T22:01:27.457 に答える