Page 407 - AngularJS权威教程
P. 407

29.2  URL 白名单    387


                  在这段代码中,其运行原理与解析原始文本为安全文本一致。这次,还要添加第三个元素,                                           19
              也就是在作用域中调用runJs()的按钮。
                  正如在HTML绑定中看到的,我们会监控这个JavaScript代码片段:                                               20

                  .controller('MyController', ['$scope', '$sce', function($scope, $sce) {
                      // 在email.rawJs上设置监控
                      $scope.$watch('email.rawJs', function(v) {                                     21
                          if(v) {
                              $scope.email.jsBody = $sce.trustAsJs($scope.email.rawJs);
                          }                                                                          22
                      });
                  }]);
                  注意,这次我们没有使用trustAsHtml,而是使用trustAsJs()方法。这个方法会告诉Angular                            23
              将指定的文本解析为可执行的JavaScript代码。调用结束后,这会得到一个可以在应用程序上下文
              中使用eval()执行的、安全的、已解析的JavaScript代码片段。                                                   24

                  现在可以将runJs()方法设置给用户,然后可以应用email.rawJS来运行这个代码片段。

                  // ...                                                                             25
                  $scope.runJs = function() {
                      eval($scope.email.jsBody.toString());
                  };                                                                                 26
                      对于在JavaScript代码片段上执行eval,还有更智能的方法。但是不推荐在产品中
                  使用eval。                                                                            27
                  Angular中还提供了内置的保护机制:只能从加载应用的同一域中以及应用所在的协议内加
              载模板。Angular通过在templateUrl上强制调用$sce.getTrustedResourceUrl来对它进行保护。                       28

                  这个协议不能替代浏览器的同源策略以及跨域资源共享(CORS)。这些策略仍然能够有效保
              护浏览器。                                                                                  29
                  但是可以通过使用$sceDelegateProvider设置域白名单或者黑名单的方式来改写这个值。
                                                                                                     30
              29.2  URL 白名单
                                                                                                     31
                  在模块的config()函数内可以设置新的白名单和黑名单。

                  angular.module('myApp', [])                                                        32
                      .config(['$sceDelegateProvider', function($sceDelegateProvider) {
                          // 设置一个新的白名单
                          $sceDelegateProvider.resourceUrlWhitelist(['self']);                       33
                  }]);

                  可以使用resourceUrlWhitelist()方法设置新的白名单。这个函数接受一个可选的参数。
                                                                                                     34
                   白名单列表(数组)。

                  如果没有传入参数,那么这个函数就作为一个getter方法,同时返回当前设置的白名单数组。                                       35
                  如果传入了白名单参数,resourceUrlWhitelist就会使用新的数组替换原来的数组。

                  每个数组元素必须是一个正则表达式或者是字符串'self'。当设置为'self'时,Angular会                                  36
   402   403   404   405   406   407   408   409   410   411   412