22

私はstdClassPHPのようなオブジェクトを持っています

$o = new stdClass;
$o->foo = $bar

変数$barに信頼できない文字列が含まれています。

次の PHP テンプレート コードは十分な XSS 保護ですか?

<script type="text/javascript">
    var o = <?php echo json_encode($o); ?>;
</script>

私の最初の直感的な反応は、JSON としてオブジェクトをエンコードすると、JSON 文字列プロパティ オブジェクトとして含まれることによって、潜在的な JavaScript の悪用が確実に無効になるため、安全であるということですこのようなもの

$o = new stdClass;
$o->foo = "<script type=\"text/javascript\">alert(document.cookie)</script>";
?>
<script type="text/javascript">
    var o = <?php echo json_encode($o) ?>;    
</script>    

このような出力が得られます

<script type="text/javascript">
    var o = {"foo":"<script type=\"text\/javascript\">alert(document.cookie) <\/script>"};    
</script>    

これが安全でないことがわかっている場合、HTML ドキュメントstdClassの一部で使用するために、単純なオブジェクトを JSON 文字列にシリアル化する標準的で成熟した方法はありますか。<script/>

最初の簡単な回答を見越して、HTML タグを削除するか、そうでなければ JSON オブジェクトの各要素を XSS フィルタリングすることでうまくいくと思いますが、これを行う簡潔な方法を探しています。この方法に似ています

//$eBar = addslashes($bar);
$sql = sprintf("SELECT * FROM table WHERE foo = '%s'",mysql_real_escape_string($bar));

この

$sql = $db->select('SELECT * from table where foo = ?', $bar);

は (ほとんどのコンテキストで) 機能的に同等ですが、エンド プログラマー ユーザーがスキームのエスケープについて心配する必要がないため、後者の方がより適切で安全なコードと見なされます。

4

5 に答える 5

10

この質問に対する最良の答えは、別の質問にあるようです。

要約すると、PHP の JSON エンコーダーはすべての非 ASCII 文字をエスケープするため、JSON プロパティの Javascript 文字列部分を拡張するために改行/キャリッジ リターンを挿入することはできません。これは、他の JSON エンコーダーには当てはまらない場合があります。

ただし、生の文字列を JSON エンコードに渡すと、通常の XSS 攻撃につながる可能性があります。次の定数の組み合わせをお勧めします。

var v= <?php echo json_encode($value, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS); ?>;

または、渡された変数json_encodeが実際にオブジェクトであることを確認してください。

于 2012-08-22T15:34:40.233 に答える
2

XSS は非常に広範であり、発行している信頼できないデータが安全かどうかをいつでも知ることは実際には不可能です。

答えは、状況によるということです。 json_encode単独でエスケープすることはまったくありません。シリアライゼーションの目的でのみ使用しています。使用するエスケープ関数はhtmlspecialchars.

ただし、使用するかどうかにもよりますhtmlspecialchars。たとえば、またはをo.foo使用して値を挿入しますinnerHTMLtextContent? 後者は二重エスケープにつながりますが、前者はスクリプトを挿入します。eval(JSで)使用する場合はどうですか?

ちなみに、mysql のエスケープと機能的に同等addslashesではありません。

最初からこのように JavaScript と PHP を混在させるつもりはありませんが、それはまた別の話です。

于 2012-08-21T20:06:36.587 に答える
1

私がしていることは、安全であると想定する前にjsonオブジェクトを評価することです。メソッドはプロトタイプではevalJSON(true)であり、jqueryにも同様の実装があると思います。JSONを使用したxss標準についてはよくわかりませんが、これは役に立ちます

于 2012-08-21T20:13:05.797 に答える