要不要直接给前端数据库的 ID ?
发布于 4 年前 作者 gvforjob 5387 次浏览 最后一次编辑是 3 年前 来自 问答

假设有很多个人,每人有很多条消息,数据库保存的主键是消息的 ID。 这样子返回给前端直接是给 ID 么?总感觉这样子很容易出问题啊。 而且前端每次发 ID 过来都要验证权限,不然其他人的消息都会给爬下来~尤其主键是自增整数序列的更简单 各位有更好的解决办法么?

7 回复

不知道你是想做什么 一般来说都不太会直接用主键吧 自豪地采用 CNodeJS ionic

获取数据的时候,后端再验证一次权限

@wenshiqi0 例如,返回一个消息列表给前端,点其中一条查看具体的消息内容。前端得告诉后端点的是那一条消息,那么发消息列表的时候是不是要将每条消息在数据库中的 ID 传给前端呢?这样前端请求单条消息的具体内容再将数据库中的 ID 传给后端。 但这样直接把数据库中的主键值暴露出来了,一疏忽就会出问题

@gvforjob 您写个controller层 过滤一下啊

@151263

不要用 2L 的方案,效率很低的。

暴露数据库的 id 并不是什么大问题,cnode 的主题和评论都是直接使用 mongodb 的 id 来定位资源的。

但在你这个地方,我建议的做法是,用一个对称加密的算法,把 ID (最好再加上一段盐)加密一下,服务器拿到客户请求的消息标识时,解析出真实数据库 id。这样 1. 防枚举 2. 压力都在 server 端。

2L 的方案给数据库增加了很多无端压力。

还有一种方案是,在消息的那张表中,通过 md5(id + hash) 的方式再多存一个字段。

并且说起来,消息存储根本不应该使用 sql 啊。不使用 sql 哪来的自增 id。

@alsotang 既然是加密,就不安全,就有可能被暴力破解,况且加密很消耗CPU. 做个membercache缓存来验证,刚查出来没多久的数据肯定命中缓存,数据库就没有压力,而且理论上是绝对安全的. 这种叫做 记录级别 的权限控制. 如果靠加密ID号来限制, 那么,编程的时候,又很有可能在别的地方泄露不该看的消息, 比如搜索功能 只有做到理论上绝对安全, 编程又方便,又不容易疏漏, 才是好的方案

回到顶部