如何防止使用动态表名进行SQL注入?

问题描述

您的建议确实不正确。

MysqL_real_escape_string()不适用于动态表名;它旨在转义仅 由引号分隔的字符串数据 。它不会逃脱反引号字符。这是一个很小但至关重要的区别。

因此,我可以在其中插入一个sql注入,我只需要使用结束反引号即可。

这就是为什么最好不要使用动态表名,或者必须使用动态表名将其与有效值列表(例如SHOW TABLES命令中的表列表)进行比较的原因。

我也没有真正意识到这一点,并且可能重复同样的坏建议而感到内gui,直到在这里也由Shrapnel上校向我指出了。

解决方法

我与一个声誉很高的PHP专家进行了讨论:

PDO在这里没有用。以及mysql_real_escape_string。质量极差。

这当然很酷,但是老实说我不知道​​建议使用mysql_real_escape_stringor PDO修复此代码有什么问题:

<script type="text/javascript">
    var layer;

    window.location.href = "example3.php?layer="+ layer;

    <?php
        //Make a MySQL connection
        $query = "SELECT Category,COUNT(BUSNAME)
          FROM ".$_GET['layer']." GROUP BY Category";
        $result = mysql_query($query) or die(mysql_error());

入这个

$layer = mysql_real_escape_string($_GET['layer']);
$query = "SELECT Category,COUNT(BUSNAME)
FROM `".$layer."` GROUP BY Category";

,考虑到JavaScript代码已发送到客户端。