Javascript 调用的 api 如何防止被第三方调用 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
miyuki
V2EX    程序员

Javascript 调用的 api 如何防止被第三方调用

  •  
  •   miyuki 2016-01-15 21:45:32 +08:00 4891 次点击
    这是一个创建于 3629 天前的主题,其中的信息可能已经有所发展或是发生改变。
    因为源码直接公开在浏览器了,有哪些方法可以尽力阻止第三方去调用呢
    22 条回复    2016-01-17 00:45:06 +08:00
    phoenixlzx
        1
    phoenixlzx  
       2016-01-15 21:56:29 +08:00   1
    目前的一个简单思路,虽然还是有被 hack 调用的可能..

    1. CSRF 或 API Token ,一个在页面顶部或底部 DOM 里的随机 key ,在请求的时候一律带在 parameter 里
    2. referral 控制,非本站的 referral 拒绝访问( Edge 会挂掉
    3. CORS 同源请求控制,和 referral 类似的效果,不过是浏览器会自动禁止调用而不是等你的 web server 拒绝
    ChiangDi
        2
    ChiangDi  
       2016-01-15 21:58:54 +08:00   1
    没办法吧,微信网页版和网易云音乐 api 都被分析出来了。
    qgy18
        3
    qgy18  
       2016-01-15 22:04:47 +08:00 via iPhone   1
    几乎不可能, 12306 做了那么多策略还是有完全独立于浏览器的抢票软件; you-get 支持那么多网站的视频地址提取。

    HTTP 协议分析太容易了,私有协议都各种破解,参考各种游戏外挂。

    总之,还是看成本和收益,如果分析协议带来的收益高于成本很多,那就危险了。
    aprikyblue
        4
    aprikyblue  
       2016-01-16 00:48:17 +08:00   1
    如 3l 所说完全杜绝不太可能。。不过增加调用难度和成本还是可以的,一般 api 没到非去调用你的程度
    flydogs
        5
    flydogs  
       2016-01-16 06:55:41 +08:00 via iPhone   1
    api 提供方限定 ip
    ryanking8215
        6
    ryanking8215  
       2016-01-16 08:05:52 +08:00 via iPhone   1
    div class="reply_content">Api key, security key?
    Roycom
        7
    Roycom  
       2016-01-16 08:39:12 +08:00 via iPhone   1
    白名单域名
    miyuki
        8
    miyuki  
    OP
       2016-01-16 09:01:13 +08:00
    @ryanking8215

    这个是不行的, Js 在浏览器可以直接看到源码,会暴露出 Key
    plantain
        9
    plantain  
       2016-01-16 10:29:40 +08:00   1
    不可能的吧,总是可以模拟请求的。
    不知道为什么会有这种需求,如果 API 能保证安全,而且加了调用频率限制,就不怕被直接调用了。
    shyling
        10
    shyling  
       2016-01-16 10:29:53 +08:00
    很多规定仅仅在浏览器里有效。。
    nozama
        11
    nozama  
       2016-01-16 11:10:06 +08:00 via iPhone   1
    随机改变 API 规则、、让第三方调用者“计划赶不上变化”
    zhjits
        12
    zhjits  
       2016-01-16 11:16:17 +08:00   3
    换个思路,把你的 API 做成即使开放也没什么问题的程度。

    Welcome to the Internet.
    smilingpoplar
        13
    smilingpoplar  
       2016-01-16 11:33:23 +08:00   1
    phoenixlzx
        14
    phoenixlzx  
       2016-01-16 11:35:36 +08:00   1
    @miyuki 要看你防止什么样的,仅仅一个动态 API key 就需要每个 session 先请求一次你的页面
    referral 和 CORS 也是针对浏览器里调用,如果写客户端的话那基本就各种没辙了...

    楼上说的把 API 做成可以开放的想法很不错。
    loading
        15
    loading  
       2016-01-16 11:37:55 +08:00   1
    普通的基本不行,你看连 QQ 协议都通过抓包搞出来了~

    只有各种 ID 认证。
    decaywood
        16
    decaywood  
       2016-01-16 14:43:14 +08:00   1
    完全杜绝不太可能,但是可以限制一个请求次数,比如一分钟超过多少次就被列为非法用户,通过验证码来增加调用成本就好了。
    wd0g
        17
    wd0g  
       2016-01-16 15:41:39 +08:00   1
    referral 可以伪造的,这条路不行
    可以简单的把 api 的请求参数或者认证固定或随机频率更换
    ryanking8215
        18
    ryanking8215  
       2016-01-16 17:00:22 +08:00 via iPhone   1
    @miyuki 参考 amazon 的 s3 restful api ,用 security key 做签名
    WildCat
        19
    WildCat  
       2016-01-16 17:19:29 +08:00   1
    跳出浏览器吧,我觉得还是自己做客户端才是最能保密呢
    sengxian
        20
    sengxian  
       2016-01-16 17:34:30 +08:00   1
    加大调用难度,真正的有心人你防不住,唯一要防的就是那些半吊子功夫写程序又喜欢拿出分享的人。
    canesten
        21
    canesten  
       2016-01-16 18:31:57 +08:00   1
    @WildCat
    都保不了
    各种网游的通信协议也是想破就破
    脱机外挂泛滥
    仅仅是反编译汇编比 JS 门槛高一些
    最后你都要有客户端
    都要有机器代码逻辑暴露出来
    有加壳就有脱壳
    有编译就有反编译
    有加密就有解密
    现在好像没有不能逆向的东西
    zhuangzhuang1988
        22
    zhuangzhuang1988  
       2016-01-17 00:45:06 +08:00 via Android   1
    也想过,貌似不可能。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     917 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 21:12 PVG 05:12 LAX 13:12 JFK 16:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86