大神们好,我是做 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;
后面这条 SQL 的查询效率会不会变低? id 是主键,性能应该就没影响了吧
想这么做的原因是,有一个 HTTP API 是修改帖子 status 的,uid 是调用这条 SQL 的登录用户,如果那个人的登录验证被黑客拿到了,黑客又知道了这条 HTTP API,那黑客岂不是可以修改不属于他的帖子的 status 了,所以后面加一个 uid 校验应该不亏吧。。。
老司机们觉得我这个安全性担心有没有必要?
还是说,对 HTTP API 的参数进行签名,防止篡改,比改 SQL 更关键?
1
Mitt 2018-04-03 23:24:19 +08:00 via iPhone 1
安全设计问题 不应该动 sql 语句 治标不治本
|
2
hcymk2 2018-04-03 23:26:00 +08:00 1
uid = 123 估计会被数据库自动优化掉。
|
3
m939594960 2018-04-03 23:43:25 +08:00 1
首先你这个安全性的担心一定是有必要的,一切用户的输入都要默认认为是不安全的。 如果不判断 uid 这种叫平行越权是存在很大问题的。
关于第一个问题,我觉得应该不会低,至少 mysql 是这样的,其他的就不清楚了。 我觉得这类判断能在程序里做就最好不要在 sql 里做 |
4
mingl0280 2018-04-04 03:11:02 +08:00 1
这种操作是服务器验证的事情(一次性 token 验证),不要给数据库做。数据库可以做但是不是最佳选择。
|
5
jjianwen68 2018-04-04 08:54:14 +08:00 via Android 1
应该程序中验证操作人是否有效,是否有操作权限,帖子是否有效,这些验证过,执教更新是使用帖子 ID 就够了吧
|
6
jorneyr 2018-04-04 09:10:48 +08:00 1
id 是主键吧,有索引了,如果不是,给它加索引即可,where 的时候 id 在左边,会先用 id 的索引进行搜索,然后再和 uid 比较,效率没问题。
加个 uid 还是有必要的,权限验证并不会进行数据粒度的验证,只是判断你有没有某种权限的操作,不会判断这种操作下的数据是否属于你,操作不属于自己的数据应该尽量避免。 |
7
zhongkouwei 2018-04-04 09:37:16 +08:00 1
从性能上讲,有索引的话 uid 条件会被忽略。这样做确实可以在一定程度解决安全问题。但权限验证和数据接口应该是解耦的吧。比如有这样一个逻辑:管理员要修改这条帖子,难道再另外写条 sql 吗
|
8
fanhaipeng0403 2018-04-04 09:51:25 +08:00 1
对 HTTP API 的参数进行签名,防止篡改,比改 SQL 更关键
|
9
rxzxf1993 2018-04-04 09:55:17 +08:00 1
请求加 token 就好了 跟 sql 无关
|
10
vincenttone 2018-04-04 11:07:01 +08:00 1
1. id 是主键的话,加不加 uid 一个效果。
2. 你的意思是黑客拿得到 id 拿不到 uid 吗? |