我stdClass
在 PHP 中有一个对象,例如
$o = new stdClass;
$o->foo = $bar
该变量$bar
包含不受信任的字符串。
下面的PHP模板代码是否足够XSS防护
<script type="text/javascript">
var o = <?php echo json_encode($o); ?>;
</script>
我最初的直觉反应是这是安全的,因为将对象编码为 JSON 将确保任何潜在的 javascript 漏洞通过被包含为 JSON 字符串属性对象而变得惰性。像这样的东西
$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>
如果这被认为是不安全的,那么是否有一种标准、成熟的方法可以将简单stdClass
对象序列化为 JSON 字符串,以便在<script/>
HTML 文档的一部分中使用。
期待第一个快速答案,我意识到剥离任何 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);
(在大多数情况下)在功能上是等效的,但后者被认为是更好、更安全的代码,因为最终程序员用户不需要担心转义方案。