私はstdClass
PHPのようなオブジェクトを持っています
$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);
は (ほとんどのコンテキストで) 機能的に同等ですが、エンド プログラマー ユーザーがスキームのエスケープについて心配する必要がないため、後者の方がより適切で安全なコードと見なされます。