安全传递 php 变量到 javascript 的唯一可靠方式是使用 json_encode() 输出合法 js 字面量,避免引号错位、null 报错和 xss 漏洞;它确保类型准确(如 null、数组、含特殊字符字符串),laravel 中须用 {!! json_encode($var) !!} 而非 {!! $var !!} 或 {{ $var }}。

直接用 echo 把 PHP 变量塞进 <script></script> 里,90% 的人会踩坑——不是引号错位、就是 null 导致 JS 语法报错,更严重的是 XSS 漏洞。安全传递的唯一可靠路径是:让 PHP 输出合法、可解析、类型准确的 JS 字面量,而不是“拼字符串”。
为什么 json_encode() 是默认首选
它把 PHP 的 null、true、array、含中文/换行/单双引号的字符串,全部转成标准 JSON,JS 解析后类型完全一致。比如:
$user = ['name' => '张三', 'id' => null, 'bio' => "他爱写
代码"];
用 json_encode($user, JSON_UNESCAPED_UNICODE) 输出:{"name":"张三","id":null,"bio":"他爱写\n代码"}
JS 中直接赋值:const user = {...},user.id 就是真正的 null,不是空字符串或 undefined。
不加 json_encode() 直接 {!! $user !!} 或 {{ $user }},数组会变成 "Array",null 会消失成 let id = ;,直接报错。
内联脚本中引号和拼接的常见翻车点
错误写法:var url = '= base_url('home/alone/') ?>'+id;
问题有二:base_url() 参数用了单引号,导致 PHP 解析中断;'+id 被当成 JS 字符串字面量,不是变量。
正确做法分两层处理:
- PHP 部分用双引号包裹整个 JS 字符串,避免内部引号冲突:
echo "<script>var url = '" . base_url('home/alone/') . "' + id;</script>"; - 更推荐统一用
json_encode()处理所有动态段:var url = = json_encode(base_url('home/alone/')) ?> + id; - 如果只是拼接简单标量(如 ID),且确定无特殊字符,可用
intval()或(int)强制转整型,避免字符串注入风险
Laravel Blade 中 {!! !!} 和 {{ }} 的陷阱
{!! $var !!} 不做任何转义,等于把 PHP 值原样吐进 JS,极其危险;{{ $var }} 会 HTML 实体编码(如 "),JS 解析失败。
必须用:{!! json_encode($var) !!} ——注意是 !! 包裹 json_encode,不是包裹原始变量。
特别注意这些值:
-
$var = 0→{{ $var }}输出0(合法),但json_encode(0)也是0,类型更明确 -
$var = ''→{{ $var }}输出空,破坏 JS 结构;json_encode('')输出"",安全 -
$var = false→{{ $var }}输出空;json_encode(false)输出false,JS 可识别
用户输入必须过 json_encode(),别信 addslashes()
addslashes() 只防单引号,对换行、Unicode、<script></script> 标签完全无效。XSS 风险仍在。
哪怕只是输出一个用户名:$username = $_GET['name'] ?? '';
必须写:var name = = json_encode($username, JSON_UNESCAPED_UNICODE) ?>;
不要手动拼接引号、不要用 htmlspecialchars() 替代 json_encode()、不要在 JS 里再调用 JSON.parse() ——json_encode() 输出的就是合法 JS 值,直接赋值即可。
最易被忽略的是:即使变量看着“很干净”,只要来源不可控($_GET、$_POST、数据库读取),就必须走 json_encode()。这不是过度防御,是 JS 解析器的硬性要求。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











