如何在Qute模板引擎中正确注入可正常执行的JS脚本
Qute模板注入JS脚本被转义的解决方法
Qute默认会对HTML上下文的插值内容做HTML实体转义,用来防范XSS攻击,这就是你脚本里的单引号被转成'的原因。你可以通过以下两种方式解决:
方案1:模板侧使用raw过滤器(推荐,改动最小)
直接在模板的插值变量后追加.raw后缀,通知Qute不对该内容做转义直接输出:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>redirect by script</title> </head> <body> <p>Hi {name}!</p> <script> {script.raw} </script> </body> </html>
后端代码不需要做任何修改。
方案2:后端侧标记内容为安全原始值
如果你不想修改模板,可以在后端传值时将脚本内容包装为io.quarkus.qute.RawValue类型,Qute识别到该类型的参数会自动跳过转义:
import io.quarkus.qute.RawValue; @RequestScoped public class Resource { @Inject @Location("hello.html") Template hello; @Route(path = "/s/:name", methods = HttpMethod.GET) public Uni<String> rScript(RoutingContext rc) { String s = "console.log('Hi from script');"; return Uni.createFrom().completionStage(() -> hello .data("name", rc.request().getParam("name")) .data("script", new RawValue(s)) .renderAsync()); } }
注意:关闭转义会带来XSS注入风险,如果你的脚本内容包含用户可控的输入,一定要提前做严格的内容校验,禁止直接输出未校验的用户提交内容作为脚本执行。
内容的提问来源于stack exchange,提问作者Ali Malek
相关产品推荐
相关产品推荐

