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

我与一个声誉很高的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代码已发送到客户端。

回答:

您的建议确实不正确。

mysql_real_escape_string()不适用于动态表名;它旨在转义仅 由引号分隔的字符串数据

。它不会逃脱反引号字符。这是一个很小但至关重要的区别。

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

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

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

以上是 如何防止使用动态表名进行SQL注入? 的全部内容, 来源链接: utcz.com/qa/434294.html

回到顶部