关于angularJs中的unsafe:

By | 2015/08/25

最近在做一个Cordova的项目,之前有没有说过…… 无所谓了,我在里面的发短信和打电话都简单的使用了tel:和sms:的链接值,有没有人不知道?就是这样的:

<a href="tel:12312312123">打电话</a>
<a href="sms:12312312123">发短信</a>

手机上的浏览器看到这样的链接,就会自动调出短信和拨号的界面啦,其实很早之前的mailto:,也是类似这样的东西。

不过在cordova中,光这样写是不行的,你还要在config.xml中增加如下的声明才行:

    <access origin="tel:*" launch-external="yes"/>
    <access origin="geo:*" launch-external="yes"/>
    <access origin="mailto:*" launch-external="yes"/>
    <access origin="sms:*" launch-external="yes"/>
    <access origin="market:*" launch-external="yes"/>

据说来自IBM对Cordova的贡献,有够会来事儿啊:)

但是即便如此,我发现还是不行,为啥呢,经过旷日持久的debug后,发现生产的代码发现居然是<a href="unsafe:sms:12312312123">xxx</a>,为啥,unsafe是什么鬼?
30_3999_3f233fc945f475a
angularJS新手表示压力很大,请教google大神后,有善良的叔叔拯救了我,原来angular对href是有安全检查的,只能生成它认为安全的链接。AngularJS真是为我们的安全操碎了心……而我也更加明白了{{}}并不是一个简单的模板替换,它真的把我们的html重新编译了一遍!

解决方法如下~

angular.module('app').config( [
    '$compileProvider',
    function( $compileProvider )
    {   
        $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|tel|file|sms):/);
        // Angular v1.2 之前使用 $compileProvider.urlSanitizationWhitelist(...)
    }
]);

7 thoughts on “关于angularJs中的unsafe:

  1. henry

    找了一下午 就这篇blog好用, 感谢分享

    Reply
  2. ccc

    哎哟我去 感谢大婶呀!刚好项目也遇到这个问题,顺便说下 如果 a标签的href 里头 填写 javascript: void(0),辣么在白名单上添加这个就行了, 填写javascript:; 是无效的

    Reply
  3. 盛照鑫

    javascript: void(0) 是怎么写的? |ftp|mailto|tel|file|sms|javascript不行吗

    Reply
    1. xishui Post author

      没试过,应该直接在ng-click中return false?

      Reply

发表评论

您的电子邮箱地址不会被公开。