新足迹

 找回密码
 注册

精华好帖回顾

· . (2012-11-4) klosezhang · 狐狸第2次台湾行 (2017-1-4) gifox
· 人像——主角当然是我女儿 (2009-11-10) 老陶 · 房子的七年之痒-写给刚买房或要买房的同志们 (2008-11-25) shanyilin
Advertisement
Advertisement
楼主:青衫未烬

[IT] 当了5年full stack感觉好迷茫 [复制链接]

发表于 2021-6-26 19:59 来自手机 |显示全部楼层
此文章由 righttang 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 righttang 所有!转贴必须注明作者、出处和本声明,并保持内容完整
青衫未烬 发表于 2021-6-22 11:36
最近一直在leetcode刷题,昨天的tech round和之前面国内公司的tech round都没有难度,一个小时能过4-5道题 ...

楼主我问你,如果你的一个Rest API被你的的一个UI App使用,并且终端用户并不需要登录就能通过你的UI app来使用你的Rest API。

你可以通过什么手段来防止用户偷窃你UI里的token绕过你的UI来私自使用你的API?
Advertisement
Advertisement

发表于 2021-6-26 20:31 来自手机 |显示全部楼层
此文章由 sydney_1000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 sydney_1000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
righttang 发表于 2021-6-26 19:59
楼主我问你,如果你的一个Rest API被你的的一个UI App使用,并且终端用户并不需要登录就能通过你的UI app ...

哈哈,面试开始了。

发表于 2021-6-26 21:18 来自手机 |显示全部楼层
此文章由 righttang 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 righttang 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 righttang 于 2021-6-26 21:24 编辑
sydney_1000 发表于 2021-6-26 20:31
哈哈,面试开始了。


哈哈,这问题我问过很多资深程序员,他们的回答我都不怎么满意。有的还来反问我,既然都是public了,你干嘛要限制。你如果不想让别人用,那干脆设密码呀?

如果楼主能回答出来,至少在技术上我这里算过关了

发表于 2021-6-26 22:39 |显示全部楼层
此文章由 袋鼠 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 袋鼠 所有!转贴必须注明作者、出处和本声明,并保持内容完整
righttang 发表于 2021-6-26 21:18
哈哈,这问题我问过很多资深程序员,他们的回答我都不怎么满意。有的还来反问我,既然都是public了,你干 ...

这种问题应用范围很小,没什么必要拿来做面试题,因为绝大部分人没碰到过这种情况。
硬要回答的话,就把UI放server side咯。

正常情况,client side UI, 很难隐藏token. 让他们用咯,弄个throttling control不就行了。

如果你硬要说必须client side, 必须不能让用token to call api, 那我会回答老板你是不是有点轴。
大部分码农都是混口饭吃,何必搞得这么严肃。

发表于 2021-6-26 22:59 来自手机 |显示全部楼层
此文章由 gifox 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 gifox 所有!转贴必须注明作者、出处和本声明,并保持内容完整
就凭这些没有细节的资料是没办法知道你的问题出在哪里的

你实在需要一个mentor,管码农的给你来个模拟面试,然后告诉你问题在哪里

发表于 2021-6-26 23:10 |显示全部楼层
此文章由 wishpolo 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wishpolo 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 wishpolo 于 2021-6-26 23:23 编辑
righttang 发表于 2021-6-26 19:59
楼主我问你,如果你的一个Rest API被你的的一个UI App使用,并且终端用户并不需要登录就能通过你的UI app ...


很感兴趣这个问题。

为啥终端用户不登陆就能够拥有UI app的权限呢,是不是UI app的权限设计有漏洞?

UI app的token不应该在加密了的body里面么,这个问题的场景是用户通过解密从UI app得到了token?
治疗后的老鼠,33%死亡,33%康复,最后一只逃走
Advertisement
Advertisement

发表于 2021-6-26 23:25 |显示全部楼层
此文章由 wishpolo 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wishpolo 所有!转贴必须注明作者、出处和本声明,并保持内容完整
袋鼠 发表于 2021-6-26 22:39
这种问题应用范围很小,没什么必要拿来做面试题,因为绝大部分人没碰到过这种情况。
硬要回答的话,就把U ...


为啥client side UI很难隐藏token,如果都用合适的方法加密了,用户应该很难得到token然后不通过UI app使用REST api吧。
治疗后的老鼠,33%死亡,33%康复,最后一只逃走

发表于 2021-6-26 23:40 来自手机 |显示全部楼层
此文章由 iamsuper 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 iamsuper 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 iamsuper 于 2021-6-26 23:42 编辑
righttang 发表于 2021-6-26 19:59
楼主我问你,如果你的一个Rest API被你的的一个UI App使用,并且终端用户并不需要登录就能通过你的UI app ...


Cors, api只给requests来自UIApp host access?
oo

发表于 2021-6-26 23:44 |显示全部楼层
此文章由 袋鼠 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 袋鼠 所有!转贴必须注明作者、出处和本声明,并保持内容完整
wishpolo 发表于 2021-6-26 23:25
为啥client side UI很难隐藏token,如果都用合适的方法加密了,用户应该很难得到token然后不通过UI app使 ...

你可以加密啊。不过就是把加密的token拿到server再解密。
那用户直接用加密的token不一样可以call api.

如果你说加密的token发给某个server side service解密,那用户不可以发加密的token给server side service 吗。总之UI怎么传数据,用户就怎么传数据。用户不可以写个和UI一样的东西吧数据传给server吗?

比如说UI传给server的数据是abcdefg, 不需要知道这个解密后是什么,我就写个东西发abcdefg不可以吗。

我觉得这种问题没什么实际意义,就是脑筋急转弯之类的东西。
既然用户可以通过UI发数据,为什么就不能直接call api? 要做的无非就是throttling防止滥用。

发表于 2021-6-26 23:47 |显示全部楼层
此文章由 袋鼠 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 袋鼠 所有!转贴必须注明作者、出处和本声明,并保持内容完整
iamsuper 发表于 2021-6-26 23:40
Cors, api只给requests来自UIApp host access?

client side你怎么判断来自UI还是直接来自用户?UI的数据完全来自client browser, 你不能知道来自指定的UI还是另外一个browser UI.

发表于 2021-6-26 23:50 |显示全部楼层
此文章由 wishpolo 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wishpolo 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 wishpolo 于 2021-6-27 00:33 编辑
袋鼠 发表于 2021-6-26 23:44
你可以加密啊。不过就是把加密的token拿到server再解密。
那用户直接用加密的token不一样可以call api.


你理解错了我说加密的意思,没这么简单的,这个加密首先是UI app 自己加密存放token的文件或者缓存,用的时候只有UI app能够解密,然后发送到server,发送的时候则需要依靠TLS协议放在加密的body里,TLS协议每次连接的密匙都不会一样,连接关闭密匙就失效,用户使用过期加密的token发送到server,server肯定直接就拒掉了吧。

UI app使用token来调用REST API的正常设计应该把token放在被临时加密的body里,TCP/IP连接关闭加密就失效了,不可能让用户还能拿着这个密匙已经失效的加密token去让server响应了。除非token被放在未加密的地址段里去调用REST API,用户才可能很容易就拿到token吧。

token被全程加密的情况下,用户应该是很难偷到的。这种情况下除非通过使用UI app来call rest api,但没法偷到真实的token。
治疗后的老鼠,33%死亡,33%康复,最后一只逃走
Advertisement
Advertisement

发表于 2021-6-27 00:21 |显示全部楼层
此文章由 有机六兽 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 有机六兽 所有!转贴必须注明作者、出处和本声明,并保持内容完整
青衫未烬 发表于 2021-6-24 11:22
如果大公司和小公司给的差不多,但是大公司的技术栈比较老,小公司完全是最新的,前辈觉得应该怎么选呢? ...

要看你有没有做好折腾下一次的准备,如果做好了折腾下一次的准备,去小公司锻炼下,然后再跳吧。

发表于 2021-6-27 00:24 |显示全部楼层
此文章由 上班ing 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 上班ing 所有!转贴必须注明作者、出处和本声明,并保持内容完整
righttang 发表于 2021-6-26 19:59
楼主我问你,如果你的一个Rest API被你的的一个UI App使用,并且终端用户并不需要登录就能通过你的UI app ...

我们用Google reCaptcha

评分

参与人数 1积分 +2 收起 理由
righttang + 2 恭喜恭喜

查看全部评分

发表于 2021-6-27 00:42 |显示全部楼层
此文章由 有机六兽 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 有机六兽 所有!转贴必须注明作者、出处和本声明,并保持内容完整
righttang 发表于 2021-6-26 19:59
楼主我问你,如果你的一个Rest API被你的的一个UI App使用,并且终端用户并不需要登录就能通过你的UI app ...

PKCE不就是用来解决这个问题的吗?

发表于 2021-6-27 09:16 来自手机 |显示全部楼层
此文章由 青衫未烬 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 青衫未烬 所有!转贴必须注明作者、出处和本声明,并保持内容完整
righttang 发表于 2021-6-26 19:59
楼主我问你,如果你的一个Rest API被你的的一个UI App使用,并且终端用户并不需要登录就能通过你的UI app ...

设置CORS,然后每次ui访问先用client token生成限时的access token。如果UI App不是web application的话,client token就不会暴露了?第三方要定期抓包才能得到最新的access token

发表于 2021-6-27 09:18 来自手机 |显示全部楼层
此文章由 青衫未烬 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 青衫未烬 所有!转贴必须注明作者、出处和本声明,并保持内容完整
gifox 发表于 2021-6-26 22:59
就凭这些没有细节的资料是没办法知道你的问题出在哪里的

你实在需要一个mentor,管码农的给你来个模拟面试 ...

mentor要怎么找,是不是得多参加conference然后认识大牛那样?
Advertisement
Advertisement

发表于 2021-6-27 09:21 来自手机 |显示全部楼层
此文章由 青衫未烬 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 青衫未烬 所有!转贴必须注明作者、出处和本声明,并保持内容完整
有机六兽 发表于 2021-6-27 00:42
PKCE不就是用来解决这个问题的吗?

还第一次知道PKCE这个概念,果然我知识还是很匮乏!

发表于 2021-6-27 10:46 |显示全部楼层
此文章由 有机六兽 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 有机六兽 所有!转贴必须注明作者、出处和本声明,并保持内容完整
青衫未烬 发表于 2021-6-27 09:21
还第一次知道PKCE这个概念,果然我知识还是很匮乏!

术业有专攻,不必妄自菲薄,IT知识多更新又快,没有可能什么都懂的,需要的时候能够快速找到相关知识学习就好了。

发表于 2021-6-27 10:52 |显示全部楼层
此文章由 chn217 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 chn217 所有!转贴必须注明作者、出处和本声明,并保持内容完整
righttang 发表于 2021-6-26 19:59
楼主我问你,如果你的一个Rest API被你的的一个UI App使用,并且终端用户并不需要登录就能通过你的UI app ...

这种面试题的意义在哪里?目的是为了把人考倒?还是为了彰显自己的技术很牛。如果是这样的话,我大概可以问出一百个这样的题目,而且我保证你也答不上来。
君子和而不同,请勿人身攻击。

发表于 2021-6-27 10:56 来自手机 |显示全部楼层
此文章由 iamsuper 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 iamsuper 所有!转贴必须注明作者、出处和本声明,并保持内容完整
袋鼠 发表于 2021-6-26 23:47
client side你怎么判断来自UI还是直接来自用户?UI的数据完全来自client browser, 你不能知道来自指定的U ...

如果是Webapp,只有一个domain,谁看足迹不是都得在Brower打入oursteps.com.au, 足迹的backend API server可以设置Access-Control-Allow-Origin: http://www.oursteps.com.au

如果你拿了足迹的前端copy了API token去自己的网站或其他地方用是用不了的。
如果是要求authentication的API可以去搜搜jwt token, 一般可以有IP detection和短的token expiry time去减少风险。
oo

发表于 2021-6-27 11:04 |显示全部楼层
此文章由 袋鼠 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 袋鼠 所有!转贴必须注明作者、出处和本声明,并保持内容完整
wishpolo 发表于 2021-6-26 23:50
你理解错了我说加密的意思,没这么简单的,这个加密首先是UI app 自己加密存放token的文件或者缓存,用的 ...

如果UI是常见的JS SPA, 怎么加密token? JS codes都是可以看到的,你用什么方法加密而用户无法破解?
你加密的密匙在哪儿?密匙是不是得在客户端。在客户端你怎么保密密匙?

所有传到server的数据都可以看到。比如说UI发了一堆数据给server, 我可不可以同样把这堆数据用别的方式再发给server?
你怎么判断这堆数据来自UI还是别的?

理论上来说cliet side UI你几乎没什么办法做到完全保密的。
即使可以做到也超过一般码农的范围了。

这个问题的复杂程度已经远远超过一般的需求了。

你觉得有多少公司会要程序员做到这么复杂的事情?
而且正常情况下一般公司不会把安全问题交给程序员,cloud security team是干嘛的?

评分

参与人数 1积分 +3 收起 理由
starchuck + 3 感谢分享

查看全部评分

Advertisement
Advertisement

发表于 2021-6-27 11:09 |显示全部楼层
此文章由 袋鼠 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 袋鼠 所有!转贴必须注明作者、出处和本声明,并保持内容完整
iamsuper 发表于 2021-6-27 10:56
如果是Webapp,只有一个domain,谁看足迹不是都得在Brower打入oursteps.com.au, 足迹的backend API serve ...


你说的domain 是server domain. 我前面提到过把UI放server就可以了很简单。
但是那个问题显然不是要把UI放到server而是问client side UI你怎么不让用户拿到token来call rest api.

发表于 2021-6-27 11:23 |显示全部楼层
此文章由 wishpolo 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wishpolo 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 wishpolo 于 2021-6-27 11:27 编辑
袋鼠 发表于 2021-6-27 11:04
如果UI是常见的JS SPA, 怎么加密token? JS codes都是可以看到的,你用什么方法加密而用户无法破解?
你 ...


UI app的code如果客户可见让token直接暴露给客户,然后客户还能不登陆使用,这自然是一个重大的安全漏洞了。恐怕只能用AI通过行为模式来判断异常用户了。

你要是了解REST API设计中对安全的考虑的话就能知道内容和客户数据发送的时候都是能够加密了,而且加密密匙能够保证加密的token就算被人拿去也无法继续使用。不过这个确实不是单纯的coding问题了,而是需要从一开始就考虑安全和加密。

现在对程序员要求也越来越高,又要full stack,什么都懂,还要对很多东西精通,不容易啊。

治疗后的老鼠,33%死亡,33%康复,最后一只逃走

发表于 2021-6-27 11:29 来自手机 |显示全部楼层
此文章由 iamsuper 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 iamsuper 所有!转贴必须注明作者、出处和本声明,并保持内容完整
袋鼠 发表于 2021-6-27 11:09
你说的domain 是server domain. 我前面提到过把UI放server就可以了很简单。
但是那个问题显然不是要把UI ...

就算一个static 的GitHubPage不是也有host吗?我不清楚你理解的UI,只要用户的能reach到的WebUI都得有个DNS或者IP
除非你放你自己电脑上,localhost.那就没必要讨论security了。
oo

发表于 2021-6-27 13:18 来自手机 |显示全部楼层
此文章由 righttang 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 righttang 所有!转贴必须注明作者、出处和本声明,并保持内容完整
袋鼠 发表于 2021-6-26 22:39
这种问题应用范围很小,没什么必要拿来做面试题,因为绝大部分人没碰到过这种情况。
硬要回答的话,就把U ...

我同意你说的大部分码农七师不需要关心这个问题。但你说这个问题应用范围很小这个我就不同意了。

在如今UI基本都是React angular之类的Single Page App的情况下,这种个问题几乎每个网站都存在。

我举几个例子
购物网站的今日限时折扣,通过一个公开的API给UI,如何防止第三方打折网站来不停的轮询?

快递公司的Tracking 网站,后台用一个API来返回物流状态。

天气预报的网站,新闻网站,政府的各种数据网站,凡是你提供数据的网站,如果用这种架构,那就会存在这种问题。

你只想让用户通过你的网站看你的数据,不想让别人只做一层皮,就免费用你的数据。

发表于 2021-6-27 13:26 来自手机 |显示全部楼层
此文章由 righttang 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 righttang 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 righttang 于 2021-6-27 13:28 编辑
chn217 发表于 2021-6-27 10:52
这种面试题的意义在哪里?目的是为了把人考倒?还是为了彰显自己的技术很牛。如果是这样的话,我大概可以 ...


这个问题可不是我乱编的,是我们公司实实在在专门为了这个命题设计了一个Solution,从而防止了大约90%左右的Bot Traffic,节约运营成本,提升真实用户体验的。

我拿公司碰到的问题去面试来应聘的人,不是最切合实际的吗?

你要出100个你实际经历过的Case,并且最后或多或少有过解决方案的。我愿意一题一题得和你讨论,这些实战的Case Study,可比学校做的Assignment 厉害多了。真到面试环节,说起这些Case,就算并不能完全解决问题,你也是满满的自信。
Advertisement
Advertisement

发表于 2021-6-27 13:42 |显示全部楼层
此文章由 wenqingren 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wenqingren 所有!转贴必须注明作者、出处和本声明,并保持内容完整
righttang 发表于 2021-6-27 13:26
这个问题可不是我乱编的,是我们公司实实在在专门为了这个命题设计了一个Solution,从而防止了大约90%左 ...

支持层主,问项目实际碰到的问题是很有意义的,而且这样的问题可深可浅。
同样贡献一个system design的问题,如何设计一个分布式系统的throttling mechanism, 比如对每个账号,max calling rate is 5 per second. 这个问题可以从junior SDE 考到 principal SDE.

评分

参与人数 1积分 +5 收起 理由
wishpolo + 5 支持贡献

查看全部评分

发表于 2021-6-27 14:07 |显示全部楼层
此文章由 袋鼠 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 袋鼠 所有!转贴必须注明作者、出处和本声明,并保持内容完整
iamsuper 发表于 2021-6-27 11:29
就算一个static 的GitHubPage不是也有host吗?我不清楚你理解的UI,只要用户的能reach到的WebUI都得有个D ...

SPA直接invoke backend rest api的,也就时SPA的domain就是用户的domain.
cors是防止第三方截取token而不是防止用户自己用自己的token.

我的UI发出去的数据都通过我家的router吧。我如果用别的方法把同样的数据通过同一个router发出去,请问你怎么知道这个数据来自这个UI还是别的。cors根本和这个无关。

发表于 2021-6-27 14:15 |显示全部楼层
此文章由 袋鼠 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 袋鼠 所有!转贴必须注明作者、出处和本声明,并保持内容完整
righttang 发表于 2021-6-27 13:18
我同意你说的大部分码农七师不需要关心这个问题。但你说这个问题应用范围很小这个我就不同意了。

在如今 ...

你说的这个要求有一个办法,就是UI每次拿个一次性token, 用完不能再用。
这个UI拿token不需要secret key而是用别的什么办法(具体怎么不用secret key to get token我不知道)。
server side可以用managed service identity之类,client side我没办法。

如果用到secret key就会产生怎么保护key的问题。

发表于 2021-6-27 14:15 来自手机 |显示全部楼层
此文章由 righttang 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 righttang 所有!转贴必须注明作者、出处和本声明,并保持内容完整
青衫未烬 发表于 2021-6-27 09:16
设置CORS,然后每次ui访问先用client token生成限时的access token。如果UI App不是web application的话 ...

能回答出CORS, 还有用限时的Token,虽然不能完全解决问题,但这个思路方向也算对了。

PKCE这东西需要用户登录,而我前提条件是不需要用户登录的。

我设的答案是Google reCaptcha 以及类似的技术。具体面试中,我也不期望对面可以答出这个答案。

但根据你的回答,进行适当的反驳,再看你的反应,很能看出这个人到底是在背诵技术名词,还是真的做过一点东西,以及是知道怎么用的。

比如说,你提到用CORS,我就会问你,CORS主要是防止什么?如果你是第三方公司想绕过CORS限制,你会怎么做?然后甲方又有些什么方法来防范?

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部