显然我的PHP代码中存在SQL注入错误

fre*_*ret 4 php sql-injection

include "../admin/site.php"; // Setup db connection.

$appid = -1;
if (is_string($_GET["id"]))
{
    $id = mysql_real_escape_string($_GET["id"]);
    $sql = "select * from version where id=$id";
    $ver = mysql_query($sql);
    if ($id > 0 && $ver && mysql_num_rows($ver))
    {
        $appid = mysql_result($ver, 0, "AppID");
        $app = DLookUp("apps", "name", "id=$appid");
        $name = mysql_result($ver, 0, "Name");
        $notes = mysql_result($ver, 0, "Notes");
    }
    else $app = "No version by that ID";
}
else $app = "No ID";

/* some html snipped */

if (isset($app) && isset($name))
    echo $app . " v" . $name;
else
    echo "v###";

/* some html snipped */

if (isset($appid))
{
    $url = "/" . DLookUp("apps", "Page", "id=$appid");
    echo "<a href=\"$url\">Up</a> to $app...";
}
if (isset($notes))
    echo $notes;
Run Code Online (Sandbox Code Playgroud)

不知何故,这段代码允许某人查看我的数据库的全部内容.我以为mysql_real_escape_string会阻止那种攻击吗?我可以将$ id转换为一个应该解决问题的整数,但是我想知道我在这里做错了什么,所以我不会一直重复我的错误.

Eli*_*les 5

我认为问题的一部分是你没有使用引号$id,所以攻击者可能会发送id的值,1 OR 1=1而执行的SQL将是:

select * from version where id=1 OR 1=1
Run Code Online (Sandbox Code Playgroud)

mysql_real_escape_string() 只转义NULL,换行符和引号(\ x00,\n,\ r,\,','和\ x1a),因此如果不引用变量,它几乎没有帮助.