条件直接写 where username=1 and passwod=1 用 count 判断数量,等于 1 代表 OK,等于 0 代表不 OK
这样的验证方式有什么弊端吗? 我看很多人都是用 username 对比数据库用户名 对上后再对比密码
哪种方式好一点呢?
1
CabalPHP 2018-08-30 15:42:24 +08:00
因为 username 会建唯一索引,只检索一个条件,速度很快
然后程序再校验下密码就可以了,特别是 现在都不用 md5 存密码了,用 sha 存密码不能简单的用 = 条件判断 这么做性能好,减轻瓶颈处的压力。 |
2
woshilala1988 OP @CabalPHP 感谢您的回复,意思是我这样的方式不适合 sha,只适合未加密或者 md5 的方式对吧.
看来我的思想落伍了. |
3
CabalPHP 2018-08-30 15:50:07 +08:00
|
4
woshilala1988 OP @CabalPHP 好,感谢您的认真回复.
|
5
chinvo 2018-08-30 16:13:04 +08:00 via iPhone
惊了你数据库存明文的?
过去用 and 的写法会有注入问题,比如 username 传进来一个 username=1 -- 后面的密码验证就会被跳过 而 SQL 支持的 hash 函数有限,不够灵活 |
6
chinvo 2018-08-30 16:15:15 +08:00 via iPhone
另外 sha 也是可以直接等号判断的,但是 SQL 不一定支持(比如 sha256、sha512 目前支持度就不高),而 crypt、bcrypt 等自带盐的算法不能用等号
|
7
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 没关系,只要是交给数据库接口传参即可。 |
8
ranoff 2018-08-30 16:24:28 +08:00
赞同#1,业务层的压力可以很容易的通过扩容解决,数据层就比较难办了
|
9
casztg 2018-08-30 16:31:10 +08:00
过来学习的,mark
|