为什么MySQL即使与ID不匹配也会获取记录?

时间:2011-10-11 16:37:53

标签: php mysql

我刚发现这个,我使用MySQL作为我的数据库。

当我做类似的事情时:

$query = $this->db->where('id', '6rubbish')->get('posts', 1);

它生成并执行此SQL:

SELECT *
FROM (`posts`)
WHERE `id` =  '6rubbish'
LIMIT 1

令人惊讶的是,它实际上是使用ID 6 获取帖子。

我发现在相同的情况下这非常容易受到攻击,因为我正在尝试与ID完全匹配,而不是进行LIKE查询。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

是。

但问题的根源是你的查询生成器库不理解变量类型,PHP是一种动态类型语言也无济于事。

我不知道你正在使用什么库,也许有一个选项告诉你传递了一个int?它应该保护你免受SQL注入,我希望,尝试:

$query = $this->db->where('id', "don't")->get('posts', 1);

并查看生成的SQL是否具有单引号转义(加倍或以反斜杠开头)。

答案 1 :(得分:0)

这是因为SELECT 6 = '6rubbish'会给你真实的,而你的身份证号码是数字类型。

答案 2 :(得分:0)

毫无疑问,您的id字段是数字数据类型。

当MySQL评估表达式时,它会将操作数转换为兼容类型(参见docs)。

'6rubbish'(一个字符串)转换为6(一个数字),因此,您得到一个匹配。