0

嗨,我试图用我的脚本修复一个错误。问题是我的 get 查询仍然适用于额外的字母。

所以,edit.php?id=1有效,也有效edit.php?id=1hello(显然不应该)。发生了什么?

$idtoedit = mysql_real_escape_string($_GET["id"]);

//Check if ID exists
$doesidexist = mysql_query("SELECT `id` FROM Data WHERE `id` = \"$idtoedit\"");
if (mysql_num_rows($doesidexist) == 0) {
    die("<div class=\"alert alert-error\"><h4 class=\"alert-heading\">Error</h4><p>ID does not exist.</p><p><a class=\"btn btn-danger\" href=\"javascript:history.go(-1)\">Go Back</a></p></div></div></body></html>");
 }
4

2 回答 2

1

这是因为 MySQL 在将字符串转换为数字时对输入的“任何事情”处理。

您构建的 SQL 查询将输入作为字符串("围绕它的 s)传递,因此如果左侧的列=具有数字类型(id示例中的列),mysql 将尝试将其转换为数字.

查看手册的这一部分以获取更多信息。

于 2013-08-11T17:17:32.877 回答
0

mysql_real_escape_string仅“清理”变量,因此在查询中使用它是安全的,但是它不会将其转换为整数,而且不应该这样做。您可以使用PDO和参数化查询来执行此操作,否则您必须自己手动转换,即

$idtoedit = (int) mysql_real_escape_string($_GET["id"]);

PDO示例:

$sth = $pdoObject->prepare('SELECT `id` FROM Data WHERE `id` = ?');
$sth->bindParam(1, $_GET["id"], PDO::PARAM_INT);
$sth->execute();

编辑:还没有真正回答你的问题,所以澄清一下:就像 complex857 所说,MySQL 尝试根据列类型对其进行转换,因此转换1hello结果为整数值 1。

于 2013-08-11T17:20:05.403 回答