在Angular中使用$ scope安全地使用eval()

时间:2015-02-14 15:48:20

标签: javascript angularjs angularjs-scope

这样安全吗?或者这会容易受到代码注入?

$scope.placeholder = function(value, def) {
    var val = eval("$rootScope.master.user." + value);
    if (val) {
        return val;
    } else {
        return def;
    }
};

我使用的是括号表示法,但是我意识到如果我在下面的示例中传入了一个像Address.addr1这样的对象,我就无法做到:

<input type="email" ng-model="user.email"  placeholder="{{placeholder('email', 'Email...')}}" /><br/>
<input type="text" ng-model="user.Address.addr1"  placeholder="{{placeholder('Address.addr1', 'Addr. Line 1...')}}" />

我认为这可能会回答我的问题,但我不确定: Is using javascript eval() safe for simple calculations in inputs?

2 个答案:

答案 0 :(得分:2)

您只需使用Bracket notation即可。

var val = $rootScope.master.user[value];

你肯定不需要评估。您应该阅读Why is using the JavaScript eval function a bad idea?

答案 1 :(得分:2)

你有什么理由不这样做吗?你的问题确实可以解释XY问题,就像克莱斯所说:

<input type="email" ng-model="user.email"  
       placeholder="{{ user.email || 'Email...'}}" /><br/>
<input type="text" ng-model="user.Address.addr1"  
        placeholder="{{ user.Address.addr1 || 'Addr. Line 1...'}}" />

或者更好的是,问题仍然是你为什么要这样做。当字段为空时,占位符仅具有任何用途,因此只提供静态值:

<input type="email" ng-model="user.email" placeholder="Email..." /><br/>
<input type="text" ng-model="user.Address.addr1" placeholder="Addr. Line 1..." />