SQL 实践问题求教

2018-04-03 23:16:01 +08:00
 Delete

大神们好,我是做 Java Web 开发的新手,最近遇到个问题如下:

MySQL 问题,一个帖子 [tiezi],属于某个用户 [uid] 的。
那么,更新一个帖子的字段 [status],是直接
UPDATE tiezi SET status = 1 WHERE id = 1000

还是说,要加上帖子所属的用户 ID,例如
UPDATE tiezi SET status = 1 WHERE id = 1000 AND uid = 123;

  1. 后面这条 SQL 的查询效率会不会变低? id 是主键,性能应该就没影响了吧

  2. 想这么做的原因是,有一个 HTTP API 是修改帖子 status 的,uid 是调用这条 SQL 的登录用户,如果那个人的登录验证被黑客拿到了,黑客又知道了这条 HTTP API,那黑客岂不是可以修改不属于他的帖子的 status 了,所以后面加一个 uid 校验应该不亏吧。。。

老司机们觉得我这个安全性担心有没有必要?

还是说,对 HTTP API 的参数进行签名,防止篡改,比改 SQL 更关键?

3321 次点击
所在节点    MySQL
10 条回复
Mitt
2018-04-03 23:24:19 +08:00
安全设计问题 不应该动 sql 语句 治标不治本
hcymk2
2018-04-03 23:26:00 +08:00
uid = 123 估计会被数据库自动优化掉。
m939594960
2018-04-03 23:43:25 +08:00
首先你这个安全性的担心一定是有必要的,一切用户的输入都要默认认为是不安全的。 如果不判断 uid 这种叫平行越权是存在很大问题的。

关于第一个问题,我觉得应该不会低,至少 mysql 是这样的,其他的就不清楚了。 我觉得这类判断能在程序里做就最好不要在 sql 里做
mingl0280
2018-04-04 03:11:02 +08:00
这种操作是服务器验证的事情(一次性 token 验证),不要给数据库做。数据库可以做但是不是最佳选择。
jjianwen68
2018-04-04 08:54:14 +08:00
应该程序中验证操作人是否有效,是否有操作权限,帖子是否有效,这些验证过,执教更新是使用帖子 ID 就够了吧
jorneyr
2018-04-04 09:10:48 +08:00
id 是主键吧,有索引了,如果不是,给它加索引即可,where 的时候 id 在左边,会先用 id 的索引进行搜索,然后再和 uid 比较,效率没问题。
加个 uid 还是有必要的,权限验证并不会进行数据粒度的验证,只是判断你有没有某种权限的操作,不会判断这种操作下的数据是否属于你,操作不属于自己的数据应该尽量避免。
zhongkouwei
2018-04-04 09:37:16 +08:00
从性能上讲,有索引的话 uid 条件会被忽略。这样做确实可以在一定程度解决安全问题。但权限验证和数据接口应该是解耦的吧。比如有这样一个逻辑:管理员要修改这条帖子,难道再另外写条 sql 吗
fanhaipeng0403
2018-04-04 09:51:25 +08:00
对 HTTP API 的参数进行签名,防止篡改,比改 SQL 更关键
rxzxf1993
2018-04-04 09:55:17 +08:00
请求加 token 就好了 跟 sql 无关
vincenttone
2018-04-04 11:07:01 +08:00
1. id 是主键的话,加不加 uid 一个效果。
2. 你的意思是黑客拿得到 id 拿不到 uid 吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/444124

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX