V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
Delete
V2EX  ›  MySQL

SQL 实践问题求教

  •  
  •   Delete · 2018-04-03 23:16:01 +08:00 · 3313 次点击
    这是一个创建于 2207 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大神们好,我是做 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 更关键?

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

    关于第一个问题,我觉得应该不会低,至少 mysql 是这样的,其他的就不清楚了。 我觉得这类判断能在程序里做就最好不要在 sql 里做
    mingl0280
        4
    mingl0280  
       2018-04-04 03:11:02 +08:00   ❤️ 1
    这种操作是服务器验证的事情(一次性 token 验证),不要给数据库做。数据库可以做但是不是最佳选择。
    jjianwen68
        5
    jjianwen68  
       2018-04-04 08:54:14 +08:00 via Android   ❤️ 1
    应该程序中验证操作人是否有效,是否有操作权限,帖子是否有效,这些验证过,执教更新是使用帖子 ID 就够了吧
    jorneyr
        6
    jorneyr  
       2018-04-04 09:10:48 +08:00   ❤️ 1
    id 是主键吧,有索引了,如果不是,给它加索引即可,where 的时候 id 在左边,会先用 id 的索引进行搜索,然后再和 uid 比较,效率没问题。
    加个 uid 还是有必要的,权限验证并不会进行数据粒度的验证,只是判断你有没有某种权限的操作,不会判断这种操作下的数据是否属于你,操作不属于自己的数据应该尽量避免。
    zhongkouwei
        7
    zhongkouwei  
       2018-04-04 09:37:16 +08:00   ❤️ 1
    从性能上讲,有索引的话 uid 条件会被忽略。这样做确实可以在一定程度解决安全问题。但权限验证和数据接口应该是解耦的吧。比如有这样一个逻辑:管理员要修改这条帖子,难道再另外写条 sql 吗
    fanhaipeng0403
        8
    fanhaipeng0403  
       2018-04-04 09:51:25 +08:00   ❤️ 1
    对 HTTP API 的参数进行签名,防止篡改,比改 SQL 更关键
    rxzxf1993
        9
    rxzxf1993  
       2018-04-04 09:55:17 +08:00   ❤️ 1
    请求加 token 就好了 跟 sql 无关
    vincenttone
        10
    vincenttone  
       2018-04-04 11:07:01 +08:00   ❤️ 1
    1. id 是主键的话,加不加 uid 一个效果。
    2. 你的意思是黑客拿得到 id 拿不到 uid 吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1179 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 18:16 · PVG 02:16 · LAX 11:16 · JFK 14:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.