如何防止使用动态表名进行SQL注入?
我与一个声誉很高的PHP专家进行了讨论:
PDO在这里没有用。以及mysql_real_escape_string。质量极差。
这当然很酷,但是老实说我不知道建议使用mysql_real_escape_string
or 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