1

我有一个 SQL 选择语句,当它与 URL 中输入的变量值匹配时,它旨在从 MySQL 数据库中选择数据,因此如果?id=12附加到 URL,它应该返回id等于 12 的数据库行。

当我试图通过在 URL 中输入奇数值来破坏脚本时,我遇到了这个奇怪的问题:如果用户在 URL 中输入数字后跟一些文本,它会匹配在 URL 中输入的字符串的数字部分,例如:

...index.php?id=12agsgs

将匹配记录 where id = 12,这不是预期的。

如果文本出现在数字之前,则返回错误或空结果,如预期的那样:

...index.php?id=agsgs12

给出空或错误。

一切都很简单;变量的代码GET是:

if (isset($_GET['id'])) {
    $id = $dbConnect->real_escape_string($_GET['id']);
}

SQL 选择代码为:

$sql = "SELECT * FROM `tablename` WHERE `id` = '$id'" ;

中的字段idtablename一个自动递增的整数索引字段。所以输入.../index.php?id=12agsgs应该返回一个空的结果。

我错过了一些非常明显的事情吗?这似乎很奇怪,我无法理解正在发生的事情。任何帮助将一如既往地感激不尽!

4

2 回答 2

2

那是 MySQL12agsgs为您“有用地”转换为数字(并得出 12),因为它知道该id列是数字的。您可以通过BINARY比较使其停止:

SELECT * FROM `tablename` WHERE BINARY `id` = '$id'
于 2013-06-13T17:13:42.670 回答
1

当操作数之一是数字时,MySQL 将字符串转换为数字。它称为类型转换,并在手册中进行了介绍。

你可以在这个简单的小提琴中看到这一点

于 2013-06-13T17:15:26.443 回答