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

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

我这次讨论的名声很高PHP盖伊:

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

这当然很酷,但我真的不知道建议使用mysql_real_escape_string或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代码得到客户端发送。


绝地无双
浏览 1595回答 3
3回答

噜噜哒

为了记录在案,这里有修复这个洞的示例代码。$allowed_tables&nbsp;=&nbsp;array('table1',&nbsp;'table2');$clas&nbsp;=&nbsp;$_POST['clas'];if&nbsp;(in_array($clas,&nbsp;$allowed_tables))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;$query&nbsp;=&nbsp;"SELECT&nbsp;*&nbsp;FROM&nbsp;`$clas`";}

慕标5832272

为了回答如何实际修复代码:'...FROM&nbsp;`'&nbsp;.&nbsp;str_replace('`',&nbsp;'``',&nbsp;$tableName)&nbsp;.&nbsp;'`...'这重复了表名中的所有回退(MySQL中的转义就是这样完成的)。有一件事我不确定,那就是这是否是“编码安全”(如何正确称呼它)。一个典型的建议mysql_real_escape_string而不是addslashes,因为前者考虑到MySQL连接的编码。也许这个问题也适用于这里。
打开App,查看更多内容
随时随地看视频慕课网APP