Laravel Livewire flash消息无法使用<br>标签实现换行的问题
问题原因
<br>标签无法实现换行和Livewire框架本身没有关联,核心原因是Blade模板默认的{{ }}输出语法会自动转义所有HTML特殊字符,你写入flash消息的<br>会被转义成普通文本展示,不会被浏览器识别为换行标签。
解决方案
根据你的业务场景选择以下任意一种方案即可:
方案1:不转义原生输出(仅适用于flash内容完全由开发管控、无用户可控内容的场景)
将渲染flash消息的模板代码从默认转义输出改为原生HTML输出,直接让浏览器解析你写入的<br>标签:{{-- 原转义写法,会把<br>识别为普通文本 --}} @if(session()->has('message')) <div class="alert alert-success"> {{ session('message') }} </div> @endif {{-- 修改为不转义的原生输出 --}} @if(session()->has('message')) <div class="alert alert-success"> {!! session('message') !!} </div> @endif注意:如果flash消息中包含用户提交、上传的可控内容,禁止使用该写法,否则会存在XSS注入风险。你当前使用的是固定写死的业务提示文案,用该写法不存在安全问题。
方案2:文本换行加安全转义(通用安全方案,推荐使用)
不需要在flash消息中手写<br>标签,设置flash时直接用\n作为文本换行符,渲染时先对内容做安全转义,再通过nl2br函数把文本换行符转换成浏览器可识别的<br>标签,兼顾安全性和换行效果。
首先修改flash消息设置代码:session()->flash('message', "你的个人资料更新申请已提交至MySalafiSpouse团队。待MSS门户审核通过后,我们会尽快通过邮件回复你;若你的资料设置为公开状态,审核通过后也会同步转发至我们的各社交媒体平台!\nBarakAllāhu Feekum,\nMySalafiSpouse团队");再修改模板渲染代码:
@if(session()->has('message')) <div class="alert alert-success"> {{ nl2br(e(session('message'))) }} </div> @endif该写法会先通过
e()函数转义所有HTML特殊字符,从根源避免XSS风险,再自动将文本换行转换为<br>标签,无论flash内容是固定文案还是包含用户输入内容都可以安全使用。
内容的提问来源于stack exchange,提问作者Usama Riaz
相关产品推荐
相关产品推荐

