mysql - MySQL 如何将字符串转换为 bool 值?

标签 mysql sql

在利用SQL 注入(inject) 期间,我遇到了类似负载的奇怪行为:

  • test' AND SLEEP(5))# - 无效
  • 1test' AND SLEEP(5))# - 有效

我调查了问题,似乎在 (My)SQL 中进行转换可能是意外的:

  • 以下表达式的结果为 0:

    • 1 和“0”
    • 1 和“00”
    • 1 和 'x'
    • 1 和 'xx'
    • 1 和 'x0'
    • 1 和 'x1'
    • 1 和“0x”
  • 这些结果为 1:

    • 1 和 '1'
    • 1 和“11”
    • 1 和“1x”

您可以使用 fiddle 来验证它.

我想知道这种行为背后的原因是什么。是否记录在案或对此有任何引用?

最佳答案

您似乎有一个 where 条件,例如:

where 'test' and sleep(5)

这很荒谬,不是吗? bool 表达式应该所在的字符串。如果您是一个数据库,那么正确的做法是返回“'test' 在这里没有意义!”这种错误。

但是,MySQL 更加慷慨和宽容。相反,它将字符串视为一个数字 并进行静默转换。因为该数字没有前导数字,所以转换生成 0。 bool 上下文中允许使用数字。 0 恰好是表示“false”的数字方式。

所以,

where 'test' and sleep(5)

评估为:

where false and sleep(5)

“false”使 短路,不计算第二个表达式。

同样,

where '1test' and sleep(5)

评估为:

where true and sleep(5)

没有短路,第二个表达式被计算。

关于mysql - MySQL 如何将字符串转换为 bool 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49208823/

相关文章:

mysql - SQL (MySQL) 统计每个类(class)一个人的平均数

php - 如何从数据库中检索信息

MySQL 从多个 ID 获取分组连接

mysql - 显示带有 LIKE 和 NOT REGEXP 的表格

mysql - 选择两个不同列的最新条目

MySQL 查询同一列两次

sql - 在符合条件的表中查找最右边的列

java - 如何从没有主键的旧数据库表生成 POJO 类

sql - 找到一公里内最大的点簇

mysql - 是否可以编写一个 SQL 查询来返回另一个表中不存在的值?