Javascript Mustache html模板的安全问题

Javascript Mustache html模板的安全问题,javascript,html,security,web-applications,mustache,Javascript,Html,Security,Web Applications,Mustache,我有一个用例,其中MustacheHTML模板的内容可能来自应用程序/最终用户(即下面代码段中的脚本标记的内容) 你好{{name}}! 由于这可能会导致恶意代码的执行,我正在这样做 只允许添加HTML标记和属性的子集 模板(在脚本标记内) 只允许转义HTML 变量,即只允许{{name}},而不允许{{{name}} 对于应用程序的安全性,还有什么需要考虑的吗?我认为如果我们遵循“小而锋利的工具”的理念,这不是一个“胡子”问题。然后,在将不安全数据(第三方JSON)映射到模板之前,您需要使

我有一个用例,其中MustacheHTML模板的内容可能来自应用程序/最终用户(即下面代码段中的脚本标记的内容)


你好{{name}}!
由于这可能会导致恶意代码的执行,我正在这样做

  • 只允许添加HTML标记和属性的子集 模板(在脚本标记内)
  • 只允许转义HTML 变量,即只允许{{name}},而不允许{{{name}}
  • 对于应用程序的安全性,还有什么需要考虑的吗?

    我认为如果我们遵循“小而锋利的工具”的理念,这不是一个“胡子”问题。然后,在将不安全数据(第三方JSON)映射到模板之前,您需要使用其他工具验证数据

    最简单的方法是替换包含不安全数据的字符串字段

    function clearJson(userStringData){
    
      return JSON.parse(userStringData, function(k,v) { 
            // string values containg something like
            // html tags or js block braces will not pass
            return String(v).match('[<>{}]') ? 'UNSAFE' : v;
      });
    }
    
    函数clearJson(userStringData){ 返回JSON.parse(userStringData,函数(k,v){ //字符串值包含如下内容 //html标记或js块大括号将无法通过 返回字符串(v).match(“[{}]”)?“不安全”:v; }); }
    代码注入领域太广,无法对您的问题给出简短的答案。您可以应用任何适合您的应用程序的高级方法:定义应用程序期望用户提供的数据格式,然后在运行时删除与这些格式不匹配的传入可疑数据。

    您应该在服务器上执行
    用户输入,而不是“仅”在客户端上执行。如果要在客户机上执行一些“坏代码”,那就太晚了;)

    这是一个有趣但很难回答的问题:不可能有一个明确的潜在安全问题列表,因为一些实际问题将被忽略,而对mustache库或应用程序代码的简单更改可能会带来一系列全新的攻击机会。为什么不在SuthaseGithub存储库中打开一个问题,作者可以更仔细地考虑你的问题?没有风险,没有,零,Zip。脚本标记只是一个隐藏的标记,除非类型是“text/javascript”,并且mustache.js不再执行任何动态代码,所以这不是问题所在。现在,如果您允许onmouseover和其他垃圾输入,您当然会遇到问题,但它们与失效的脚本标记无关。如果有疑问,请使用…谢谢。对给定数据进行模板评估后会发生什么情况。请注意,模板内容和数据都来自应用程序。关于onmouseover,我只允许HTML元素和属性的白名单,所以这不是问题。是的,将成为模板一部分的应用程序输入的清理将在服务器上进行。
    function clearJson(userStringData){
    
      return JSON.parse(userStringData, function(k,v) { 
            // string values containg something like
            // html tags or js block braces will not pass
            return String(v).match('[<>{}]') ? 'UNSAFE' : v;
      });
    }