假设有很多个人,每人有很多条消息,数据库保存的主键是消息的 ID。 这样子返回给前端直接是给 ID 么?总感觉这样子很容易出问题啊。 而且前端每次发 ID 过来都要验证权限,不然其他人的消息都会给爬下来~尤其主键是自增整数序列的更简单 各位有更好的解决办法么?
不知道你是想做什么 一般来说都不太会直接用主键吧 自豪地采用 CNodeJS ionic
获取数据的时候,后端再验证一次权限
@wenshiqi0 例如,返回一个消息列表给前端,点其中一条查看具体的消息内容。前端得告诉后端点的是那一条消息,那么发消息列表的时候是不是要将每条消息在数据库中的 ID 传给前端呢?这样前端请求单条消息的具体内容再将数据库中的 ID 传给后端。 但这样直接把数据库中的主键值暴露出来了,一疏忽就会出问题
@gvforjob 您写个controller层 过滤一下啊
不要用 2L 的方案,效率很低的。
暴露数据库的 id 并不是什么大问题,cnode 的主题和评论都是直接使用 mongodb 的 id 来定位资源的。
但在你这个地方,我建议的做法是,用一个对称加密的算法,把 ID (最好再加上一段盐)加密一下,服务器拿到客户请求的消息标识时,解析出真实数据库 id。这样 1. 防枚举 2. 压力都在 server 端。
2L 的方案给数据库增加了很多无端压力。
还有一种方案是,在消息的那张表中,通过 md5(id + hash) 的方式再多存一个字段。
并且说起来,消息存储根本不应该使用 sql 啊。不使用 sql 哪来的自增 id。
@alsotang 既然是加密,就不安全,就有可能被暴力破解,况且加密很消耗CPU. 做个membercache缓存来验证,刚查出来没多久的数据肯定命中缓存,数据库就没有压力,而且理论上是绝对安全的. 这种叫做 记录级别 的权限控制. 如果靠加密ID号来限制, 那么,编程的时候,又很有可能在别的地方泄露不该看的消息, 比如搜索功能 只有做到理论上绝对安全, 编程又方便,又不容易疏漏, 才是好的方案