在我的角度应用程序中,我想让用户定义高级过滤器表达式来过滤显示的对象。我正在查看不同的库,似乎filtrex正在做我想要的,但它允许的表达量可能不足以达到我的目的。
我在考虑简单地使用角度表达式。我将实例化一个新的角度模块(以确保我的应用程序中定义的过滤器或rootScope变量不会成为问题),只需在其中运行$parse
。
由于我的用户定义的过滤器表达式将保存在应用程序中并在其他用户打开应用程序时运行,因此在过滤器表达式中不能输入任何有害代码至关重要。
因此我的问题是:用户是否可以安全地定义角度表达式?或者他们是否允许以任何方式做有害的事情,例如修改dom,重定向到另一个页面,发出HTTP请求,或者其他我现在想不到的东西?
答案 0 :(得分:1)
根据Angular security guide,永远不应执行用户提供的表达式。
在Angular 1.5之前,表达式在沙箱中执行,以防止编程风格不佳(不防止安全漏洞)。在Angular的每个版本中,都找到了逃离沙箱的方法。通过在网络上搜索angular sandbox escape
可以找到许多示例,可以找到有关该问题的简短概述here。
在Angular 1.6中,沙箱has been removed,因此从表达式运行任意JavaScript应该更容易。
因此,让用户定义角度表达式绝对不安全。