atjiu / pybbs

更实用的Java开发的社区(论坛),Better use of Java development community (forum)
GNU Affero General Public License v3.0
1.87k stars 711 forks source link

user.token security issue #193

Closed saaspeter closed 2 months ago

saaspeter commented 2 months ago

Hi:

  你好,我看到在页面点击登录后调用“/api/login”接口,这个接口中直接把user表中的token值拿出来存入cookie中了。而token的刷新好像是在页面上点击刷新token才做刷新的。这样只要拿到这个token就可以伪造登录了,直到用户自己手动刷新这个token。

  推荐的做法是登录的时候生成新的真随机的cookie,长度也不能太短,把这个随机值存在db中和user_id对应,然后再把这个值写入cookie,带有默认时间。检查cookie的时候要检查是否超时。(如果需要长时间登录,需要再写入一个remember me cookie)

   另外,/api/**开头的api好像都没有做权限验证,postman可以直接call通。
atjiu commented 2 months ago

感谢反馈,针对你说的两点问题我解释一下

  1. 你推荐的做法其实跟我直接拿用户的token写到cookie本质是一样的
  2. /api/ 下的部分接口是无需token的,确实能直接访问
saaspeter commented 2 months ago

你好。第1点的推荐做法是web系统常见的用法,最大区别是:每次登录都需要生成一个新的cookie,有默认时间,例如:2小时,我看code目前好像是token一直有效,可以手动刷新。如果token是每次登录都一样的,那么一旦cookie泄漏了长时间能被使用。另外,最好能做到:即便db表中的cookie token值被看到了(例如:技术客服有可能能看到这个值的),也不能被冒用登录。(当然如果application要求不严格,也可以不实现这点。)。另外如果web需要实现多浏览器登录,这个token最好单独放一个表,会有多个记录的。

系统做的挺好的。但有规模型公司对安全是有要求的,最好符合业界常见做法。