MySQL注入问题


MySQL Injection Problem

我最近一直在用PHP编写我的网站,我为自己在查询中使用输入之前净化输入的良好做法感到非常自豪。一切都很顺利,直到我的朋友说我需要消毒我的输入。当我试图向他解释它已经消毒时,他告诉我,他在我的数据库中的"用户"表中找到了所有内容。我不知道怎么做,所以我想我会发布我做错了什么,让我的消毒不起作用。以下是他利用的PHP代码:

start_mysql(); // Starts the databases stuff, etc.
$id = mysql_real_escape_string($_GET['id']);
$game = mysql_query("SELECT * FROM `games` WHERE `id` = $id LIMIT 0, 1");

他所做的只是更改id参数,使他能够在我的数据库中使用SQL注入。我以为mysql_real_sescape_string转义了所有这样的字符,但显然我错了。我用一个正常的字符串做了一些测试,看看会发生什么,这就是

URL:/game.php?id="OR"="

echo($_GET['id']); // This echo'd: '' OR '''' = ''
echo(mysql_real_escape_string($_GET['id'])); // This echo'd: '''' OR '''''''' = ''''

所以,我的简单问题是,我做错了什么?

您需要将转义字符串放在单引号中:

WHERE `id` = '$id' 

由于id是一个整数参数,并且在SQL中没有用单引号将其括起来,因此$id的值将直接发送到查询中。如果您期望的是一个整数id,那么您应该验证$_GET['id']的值是一个有效的整数。

$id = intval($_GET['id']);

马特,

mysql_real_eescape_string()将只过滤某些字符,如果你真的想防止注入攻击,请查看另一篇Stack Overflow文章,该文章建议你使用Prepared语句:

编制报表

PHP手工录入Prepared statements

编辑:还可以查看Slaks和Michael关于用单引号包装变量的帖子。

祝你好运!

H

强制转换ID。如果它是字符串,它将强制转换为0。$id=(int)$_GET['id'];

此外,MySQL支持查询中字符串和数字的引号。

$game = mysql_query("SELECT * FROM `games` WHERE `id` = '$id' LIMIT 0, 1");

您需要使用参数绑定api。问题出在这段代码中:

WHERE `id` = $id

您正在将用户输入直接插入到SQL语句中。这是SQL注入攻击敞开的大门

您没有使用参数化查询。

MDB2允许这样做,尽管该库可能会失宠。

您的配置很可能具有magic_quote_gpc,这是PHP中一种古老的尝试,可以神奇地确保脚本的安全。事实证明,它有多个缺陷,后来被弃用,并计划在5.4中完全删除,我最后一次听说它

如果你有权访问php.ini配置,你应该禁用它。否则,你可以修改你的脚本以将其考虑在内,并清除你的输入。

所有这些都记录在这里:http://www.php.net/manual/en/security.magicquotes.disabling.php

除此之外,mysqli_real_escape_string()没有任何问题。

使用mysql_real_escape_string()不能阻止SQL注入。它用于转义特殊字符,如单引号(')、双引号(")等。

为了防止SQL注入,您必须使用PHP中的PDO语句和过滤函数来净化用户数据。