先说结论
Vue HTML 模板没有进行安全过滤,一旦疏忽就会不安全。如果想要编写安全的程序,需要引入第三方库,写更多代码才能安全。
Angular HTML 模板默认已经安全过滤,随心所欲写都是安全的。如果想要编写不安全的程序(有些场景需要执行传入的可信任 Javascript),需要写更多代码。
Vue HTML 模板默认不安全
不安全举例:
<div v-html="userProvidedHtml"></div>
<a :href="userProvidedUrl">click me</a>
<iframe :src="userProvidedUrl">
<div :style="userProvidedStyles"></div>
确实在某些场景需要绑定用户提供的字符串。但用户提供的字符串,默认是不安全的,可能含有 Javasccript 字符串。
Vue 的 HTML 模板是没有进行安全过滤的,如果需要编写更安全的 HTML 模板,需要引入 sanitize-html, sanitize-url 等三方库,写更多代码做安全过滤。
如果是经验不足的开发者,很容易忽视,写出不安全的代码。
Angular HTML 模板默认安全
安全举例:
<p [innerHTML]="userProvidedHtml"></p>
<a [href]="userProvidedUrl">Click me</a>
<iframe [src]="userProvidedUrl">
<div [style.backgroud]="userProvidedStyles"></div>
Angular 的 HTML 模板已进行安全过滤的,即便是经验不足的开发者,随心所欲编写都是安全的。
如果需要执行字符串中可信任的 JavaScript,那么 Angular 也提供了方案,需要开发者多写一点代码,达到上面 Vue 不做安全过滤的效果。
一起事件
个人观点:
Vue 确实没有安全漏洞,但 Vue 是懒政,并没有帮助开发者写出更安全的 Web 应用。不重视安全的小公司和经验不足的 Vue 开发者,随意书写,确实更容易产生不安全的 Web 应用。