RT,APP 的接口,需要防护 csrf 吗?不防护 csrf 的话,总感觉不安全呀,防护的话,该怎么做呢?总不能再单独给个接口传 token 吧。。。。
#3 楼 @ghn645568344 给接口加上时间戳,设置有效时间窗口,并且在提交参数的时候根据密钥计算签名,服务端验证。当然 app 端记得把密钥存好,做好代码混淆,这样差不多就抓不到了。
#4 楼 @ghn645568344 你没有任何方法完美防止接口被非 API 调用。
不如想一下,即使被非 API 调用,如何避免这些调用对你 API 产生实际影响。
CSRF 对 API 没有用。token 对 API 也是作为验证,非 API 调用可以模拟 token 的机制,照样调用你,所以对防止恶意请求没有作用。
#14 楼 @hooopo 正是如此,我觉得大家的讨论一开始就偏离了,CSRF 是“跨站请求伪造”,API(尤其是楼主所说的 APP)根本就不存在“跨站”的问题。所以回答应该是:不是接口需要不需要 CSRF 防护,而是接口完全不能做、没办法做 CSRF 防护。然后才应该是讨论怎么保证 API 的安全性,比如 https 防监听、token 认证之类的。
帮大家复习下:CSRF 是一种依赖 web 浏览器的、被混淆过的代理人攻击(deputy attack)。
请注意加粗字体。
总的来说,这是楼主一个对 CSRF 完全缺乏了解,只是囫囵吞枣知道这是一个安全防范措施的初学者提出的一个伪问题,所以务必首先要纠正这个问题本身。也就是说,这个问题是一个病态的问题,错误的问题,我觉得有必要澄清这一点,防止以讹传讹
我们是这样搞的:
1、APP和服务器接口先约定好一个密钥;
2、登录之后服务器接口返回一个Token;
3、APP在之后需要验证的请求中都要加上这个Token,以及进行签名。
签名方式其实跟很多支付接口一样,把所有的参数加上约定好的密钥进行Sha1或者MD5加密,得到签名字符串,传到服务器接口后再进行验证。
安全问题:
我们会在参数里边加一个timestamp字段,获取当前的时间戳,类似:1485159939.454,一并放进参数列表并签名。
服务器接口会检测时间戳不能误差超出2分钟,然后会在REDIS里边记录这个时间戳(2分钟后自动删除),用来判断重复请求。
这样就算不是https,被抓包了,重复请求就会报错。
仅供参考。
#19 楼 @sefier https://en.m.wikipedia.org/wiki/App
App, apps or APP may refer to:
- Mobile app, software designed to run on smartphones and other mobile devices
- Application software that causes a computer to perform tasks for computer users
- Web application or web app, software designed to run inside a web browser
CSRF 是跨站攻击,只对普通的「网站」(当然也包括网站应用)有效。如果是不走网页访问,而是直接调用 API 的话,CSRF 本身就是无效的。CSRF 不能防止第三方直接调用接口。
先说结论:现代应用不需要 CSRF Token。 CSRF 攻击关键在于 cookie,如果 cookie 里不含登陆令牌,你把登录令牌放到其它 header 里就没问题。因为 CSRF 所利用的 form 和四个特殊 tag 都无法添加 header。现代应用的 API 不接受 form 提交,都是 json 风格的,现代的 web 浏览器都具备 CSP,samesite 等防范机制。CSRF 攻击排名过去十年下降了两位。具体看这个解释,如何不用 CSRF Token:https://danielw.cn/web-security-xss-csrf-cn#csrf
https://stackoverflow.com/questions/10741339/do-csrf-attacks-apply-to-apis 有类似的提问,结果是 Rest 风格的 api 项目 如果不依赖 cookies 做安全验证的话,则不需要预防 CSRF.
CSRF attacks rely on cookies being implicitly sent with all requests to a particular domain. If your API endpoints do not allow cookie-based authentication, you should be good.
APP 中加个 HTTPS 证书验证就能防止 proxy 类的解密了
楼主的问题其实是个业务问题 再严密的网络传输也会有数据被监听的可能 极端情况就是电信机房拿着你 HPPTS 的证书就可以镜像你的流量(当然这个有判头)
这个问题要拆解一下,问题 1 是 如何确保传输过程安全 问题 2 是 如何反爬 这是两回事儿 这里就不提 CSRF 了 跟楼主的实际问题不符
问题 1 用 token+HTTPS+APP 中自己做证书检验 就可以保证传输安全
问题 2 强制手机号码登录 记录访问日志 到达一定访问量直接 ban 设备 或者 不用手机号码登录 用设备码等唯一标识 从业务角度反爬 而不是从安全角度 有 N 种手段能让服务端接口觉得“请求”是从正常 APP 发过来的 所以从安全角度只能提高防护的上限 从根本上无解(魔高一尺道高一丈的逻辑)