用户名和密码验证,用 count 语句怎么样?

2018-08-30 15:35:47 +08:00
 woshilala1988

条件直接写 where username=1 and passwod=1 用 count 判断数量,等于 1 代表 OK,等于 0 代表不 OK

这样的验证方式有什么弊端吗? 我看很多人都是用 username 对比数据库用户名 对上后再对比密码

哪种方式好一点呢?

3079 次点击
所在节点    MySQL
9 条回复
CabalPHP
2018-08-30 15:42:24 +08:00
因为 username 会建唯一索引,只检索一个条件,速度很快

然后程序再校验下密码就可以了,特别是 现在都不用 md5 存密码了,用 sha 存密码不能简单的用 = 条件判断

这么做性能好,减轻瓶颈处的压力。
woshilala1988
2018-08-30 15:45:21 +08:00
@CabalPHP 感谢您的回复,意思是我这样的方式不适合 sha,只适合未加密或者 md5 的方式对吧.
看来我的思想落伍了.
CabalPHP
2018-08-30 15:50:07 +08:00
@woshilala1988

恩 还有就是索引和性能问题,即使是 md5,密码字段不用加索引,减轻数据库(索引)体积和写入速度。

密码校验交给程序做,释放一点点 mysql 的压力
woshilala1988
2018-08-30 16:06:42 +08:00
@CabalPHP 好,感谢您的认真回复.
chinvo
2018-08-30 16:13:04 +08:00
惊了你数据库存明文的?

过去用 and 的写法会有注入问题,比如 username 传进来一个 username=1 -- 后面的密码验证就会被跳过

而 SQL 支持的 hash 函数有限,不够灵活
chinvo
2018-08-30 16:15:15 +08:00
另外 sha 也是可以直接等号判断的,但是 SQL 不一定支持(比如 sha256、sha512 目前支持度就不高),而 crypt、bcrypt 等自带盐的算法不能用等号
geelaw
2018-08-30 16:19:30 +08:00
SELECT PWHASH, SALT FROM USERS WHERE USERNAME=$ARG1

然后 $ARG1 传入你的用户名,拿回 PWHASH 和 SALT,再检查 F(PW, SALT) ?= PWHASH。现在较好的 practice 是用很慢的 F,只能忍受算一次的时间。

@chinvo #5 这个跟是不是 AND 没关系,只要是交给数据库接口传参即可。
ranoff
2018-08-30 16:24:28 +08:00
赞同#1,业务层的压力可以很容易的通过扩容解决,数据层就比较难办了
casztg
2018-08-30 16:31:10 +08:00
过来学习的,mark

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

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

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

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

© 2021 V2EX