You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Smarty模板中PHP JSON字符串转义正确用法求助

解决Smarty模板中JSON转义导致JS报错的问题

我之前也碰到过一模一样的问题——给Smarty传JSON字符串,一用默认转义JS就炸,不转义又担心安全。其实核心问题是Smarty默认的HTML转义会破坏JSON的结构,得用专门针对JS的转义方式才行,下面给你一步步说正确的实现:

先搞懂为什么之前会报错

Smarty自带的escape函数默认是做HTML转义的,它会把JSON里的双引号转成"、尖括号转成<这类实体字符。比如原本合法的JSON {"name":"test"},转义后就变成了{"name":"test"},JS解析这种字符串的时候自然会报错,因为这已经不是标准的JSON格式了。

正确的实现步骤

1. PHP端的准备(你已经做了SANITIZE,这里补充优化点)

确保你的MyObject序列化成JSON时,已经做了基础的安全处理,比如用json_encode的时候加上几个参数,能提前规避一些XSS风险:

// 假设$myObject是你的业务数据,已经完成SANITIZE
$safeJson = json_encode(
    $myObject,
    JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_QUOT
);
// 把处理好的JSON赋值给Smarty变量
$smarty->assign('myJsonData', $safeJson);

这些参数会把HTML标签、&符号、双引号转成Unicode编码,进一步降低注入风险,和你已经做的SANITIZE形成双重保障。

2. Smarty模板端的正确转义

不要用默认的HTML转义,改用Smarty的javascript类型转义,它会专门处理JS里的特殊字符(比如单引号、换行、反斜杠),但不会破坏JSON的结构:

<script>
    // 方法一:用JSON.parse解析转义后的字符串
    var myData = JSON.parse('{$myJsonData|escape:"javascript"}');
    
    // 方法二:如果你的JSON是对象/数组格式,也可以直接赋值(更简洁)
    // var myData = {$myJsonData|escape:"javascript"};
</script>

escape:"javascript"会帮你转义掉JS语法里的危险字符,但保留JSON本身的双引号和结构,这样JS就能正常解析使用了。

额外的安全提醒

  • 不要省略PHP端的json_encode参数:虽然模板端做了转义,但PHP端提前处理特殊字符能进一步降低安全风险
  • 不要直接把未转义的JSON硬写到JS里:哪怕你觉得数据很安全,也可能因为特殊字符(比如换行、单引号)导致JS语法错误,转义是必要的

内容的提问来源于stack exchange,提问作者Abid Hussain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:25:38