奇怪的$ _GET行为

时间:2013-08-11 17:11:17

标签: php mysql 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>");
 }

2 个答案:

答案 0 :(得分:1)

这是因为在将字符串转换为数字时,MySQL对输入进行了“随时随地”的处理。

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

查看this section of the manual以获取更多信息。

答案 1 :(得分: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。