web-dev-qa-db-ja.com

正規表現でサニタイズした後にJSONを解析するJavaScript eval()— XSSは可能ですか?

正規表現をバイパスしてJavaScriptを実行することはできますか?

<script>      
  function json(a){

  if (/^\s*$/.test(a) ? 0 : /^[\],:{}\s\u2028\u2029]*$/.test(a.replace(/\\["\\\/bfnrtu]/g, "@").replace(/"[^"\\\n\r\u2028\u2029\x00-\x08\x0a-\x1f]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:[\s\u2028\u2029]*\[)+/g, ""))) 
    try{
         return eval("(" + a + ")")
    } catch (b) {}

    g(Error("Invalid JSON string: " + a))
  }

  json(window.name);    
</script>
5
LucasNN

私の これに対する即時の反応 は、いくつかの理由でポジティブではありませんでした。

  1. 正規表現を使用して複雑な言語構造を解析しようとすると 悪い考えです 。正規表現は、このような構成には適していません。
  2. ブラックリストを介したセキュリティは悪い考えです。なぜなら、定義上、攻撃者は常に一歩先を行っているからです。 ポジティブセキュリティモデル を使用する必要があります。
  3. 標準ベクトルの上で使用できるhuge数の XSSフィルター回避テクニック があります。それらをすべて検出してブロックすることはできません。
  4. eval()によるJSONのJavascript解析は セキュリティの脆弱性を考慮 です。
  5. 最新のブラウザ サポートありJSON.parse()およびJSON.stringify()を介した適切なネイティブJSON解析。
  6. 古いブラウザをサポートする必要がある場合、安全な JSONライブラリ を使用できます。これは、デコードにeval()を使用しません。

全体として、正規表現アプローチは過剰に設計されており、安全ではなく、見当違いで、冗長です。すでに解決済みの問題を解決しようとしています。 Daveにしないでください。 適切なJSON解析関数とライブラリを使用できます。

17
Polynomial

この (true");alert(9);//"

有効なJavaScriptステートメントに非常に近く、正規表現で受け入れられます。

あなたの正規表現に注意してください、誰かがそれをバイパスすることができます。

4
Brian