在网页设计中,模板是一个类似于 HTML 的文件,其中散布着程序指令,这些指令将在运行时由 Web 服务器或浏览器中的 JavaScript 代码解释。
模板是一个静态文件,用于通过插入数据库检索或者从 HTTP 提取的动态内容来生成 HTML 。
当模板引擎将动态内容视为要执行的代码而不是要插入的数据时,就会发生模板注入漏洞。
这会允许攻击者在服务器或受害者的浏览器中执行恶意代码。
Angular 中的模板注入
Angular 应用由一组分层组件组成,这些组件封装了应用程序逻辑和状态信息。每组件在浏览器中使用模板呈现,该模板描述要输出的给定状态的 HTML元件。React模板将使用"{{"和"}}"分隔符安全的差值状态,并允许组件以侦听使用事件处理程序的用户交互。使用"@Component"装饰器将模板附加到组件。
可以使用"templateUrl"选项,提供相应模板文件的相对或绝对路径:
模板也可以使用"模板"选项作为内联字符串提供:
当不受信任的输入传递到"模板"选项时,Angular中会发生模板注入漏洞,当模板字符串由字符串串联生成时:
避免以这种方式动态生成的模板。
相反,将状态加载到组件中,并使用 Angular 的内置插值逻辑,可安全地转义任何不受信任的内容:
React 中的模板注入大多数 React 开发人员使用 JSX 以 JavaScript 语法制作原生的 HTML 标签。
JSX 让动态渲染变得容易
对应于从服务器加载的数据的页面元素。
在构建过程中将代码转译为 JavaScript 时,提供所有 React 组件在 JSX 中定义,通常可以免受模板注入攻击。
然而,React 组件可以直接从运行时使用
函数的低级 API。
如果使用不受信任的方式调用此方法内容,很容易受到模板注入攻击:
如果调用
攻击者还可以控制 HTML 标签的属性和内容React 组件上的函数:
React 中模板注入漏洞的最终来源是href属性,如果链接的href属性或者import语句是从不受信任的内容动态生成的,攻击者可以通过提供带有javascript:前缀的 URL:
评论留言