SQL = 与 LIKE = 与 LIKE BINARY 的区别,不区分大小写

8

我在使用SQL LIKE、=和LIKE BINARY时遇到了非常奇怪的行为。

注意:密码的前三个字符实际上是3Vf,查询的其余部分也是语法正确的。

SUBSTRING(password,1, 3) = "3VF"      -> returns true
SUBSTRING(password,1, 3) = "3Vf"      -> returns true

SUBSTRING(password,1, 3) LIKE "3VF"   -> returns true
SUBSTRING(password,1, 3) LIKE "3Vf"   -> returns true

然而,如果我使用LIKE BINARY,则会得到区分大小写的行为。

SUBSTRING(password,1, 3) LIKE BINARY "3VF"   -> returns false
SUBSTRING(password,1, 3) LIKE BINARY "3Vf"   -> returns true

我不理解为什么比较是不区分大小写的。考虑到密码是一个VARCHAR(64)类型。在我看到的所有在线资源中,它们都说=和LIKE都是区分大小写的。

注意:我运行的完整查询是:

SELECT * from users where username="natas16" AND SUBSTRING(password,1, 3) = XX

此外,这不是一个真实世界的应用程序,而是Natas级别。它类似于一个“黑客”游乐场。他们有不同的级别和漏洞,你应该利用它们。因此,这不是一个真实世界的例子。

http://www.overthewire.org/wargames/natas/


1
只是为了明确,您不应该将密码存储在数据库中。使用 PASSWORD('Function') 来正确地存储它。虽然您所描述的行为非常奇怪。https://dev.mysql.com/doc/refman/5.0/en/password-hashing.html - Colton
你是以明文形式保存密码吗?请使用哈希键和列排序规则设置为latin_colate_cs。 - georgecj11
1
natas是一种道德黑客游乐场。你会得到一个挑战,需要以某种方式破解它。这样做的目的是为了进行暴力破解。 - Ahmed Aeon Axan
2个回答

9

LIKE=操作是否区分大小写取决于你进行比较的字段的排序规则。如果你的字段使用了不区分大小写的排序规则(像我猜测的那样),那么得到的比较结果就是不区分大小写的。如果该字段使用了二进制或者区分大小写的排序规则,或者你使用了BINARY关键字来强制进行二进制比较,那么得到的比较结果就是区分大小写的。


谢谢,我想这是唯一的解释。由于我无法直接查看数据库模式,所以我猜这就是发生的事情。另外,这是一个常见的陷阱吗?我的意思是,我一直认为文本比较不管怎样都是区分大小写的。 - Ahmed Aeon Axan
@AhmedAeonAxan 我猜如果你不了解排序规则的工作原理,那么这可能是一个陷阱,因为你得到的结果可能会出乎意料。不确定这是多么常见的问题。大多数人实际上并不会将密码以明文形式存储在数据库中,而是对它们进行哈希处理,以便在具有所有小写字母(如md5哈希或类似方法)的介质中进行存储,这样大小写敏感性就不是问题了。 - Mike Brant
是的,我理解了。我已经编辑了我的帖子以包括这一点。这都是Natas级别的一部分。它基本上是一个沙盒,有一些你应该利用的漏洞。因此,这远非真实世界的应用程序。由于这个原因,我也无法准确地看到他们的数据库架构。但是你的答案完全描述了行为,所以我想这就是答案。 - Ahmed Aeon Axan

-1

阅读有关于排序选项的内容,以及如何从mysql中使其区分大小写 tutorial


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接