php - json_encode 是否足够的 XSS 保护?

标签 php javascript json

我有一个 stdClass PHP 中的对象,类似于

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

变量$bar包含不受信任的字符串。

下面的PHP模板代码是否足够的XSS保护

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

我最初的直觉 react 是安全的,因为将对象编码为 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);

(在大多数情况下)在功能上是等效的,但后者被认为是更好、更安全的代码,因为最终程序员用户不需要担心转义方案。

最佳答案

似乎这个问题的最佳答案在于 another question .

总而言之,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 的变量确实是一个对象。

关于php - json_encode 是否足够的 XSS 保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12062146/

相关文章:

php - 使用 php mysql 和 ajax 刷新 Div 中特定单元格中的数据

java - 解析 JSON 字符串时出现问题

javascript - JQuery 中的动态窗口宽度(移动旋转器)

javascript - 如何打破 SIGTERM 上的异步系列?

xml - 如何使用 XSL 转义 XML 内容以将其安全地输出为 JSON?

json - 如何在 JSON 中编码和解码 big.Int?

php - 带有 -noserver 的 GWT

php - 我应该在方法内部还是在调用页面上关闭 PDO 数据库连接?

php - 升级到 Laravel 7 后日期未转换

javascript - 初始化后更改输入字段的占位符文本