首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用动态表名防止SQL注入?

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

Stack Overflow用户
提问于 2011-04-28 07:16:37
回答 3查看 4.4K关注 0票数 20

我和一位声望很高的PHP家伙讨论了一下:

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

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

代码语言:javascript
复制
<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());

进入到这个

代码语言:javascript
复制
$layer = mysql_real_escape_string($_GET['layer']);
$query = "SELECT Category, COUNT(BUSNAME)
FROM `".$layer."` GROUP BY Category";

,考虑到JavaScript代码在客户端获得发送。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-28 07:19:29

你的建议确实是不正确的。

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

所以我可以在这里插入一个SQL注入,我只需要使用一个结束的反引号。

PDO does not provide sanitation for dynamic table names, either

这就是为什么最好不要使用动态表名,或者如果有必要的话,将它们与有效值列表进行比较,比如来自SHOW TABLES命令的表列表。

我也没有完全意识到这一点,可能是因为重复了同样糟糕的建议而感到内疚,直到Shrapnel上校在这里向我指出了这一点。

票数 40
EN

Stack Overflow用户

发布于 2011-05-19 05:49:52

为了便于记录,下面是修复这个漏洞的示例代码。

代码语言:javascript
复制
$allowed_tables = array('table1', 'table2');
$clas = $_POST['clas'];
if (in_array($clas, $allowed_tables)) {
    $query = "SELECT * FROM `$clas`";
}
票数 5
EN

Stack Overflow用户

发布于 2011-04-28 07:43:17

为了回答如何实际修复代码:

代码语言:javascript
复制
'...FROM `' . str_replace('`', '``', $tableName) . '`...'

这将复制表名中的所有反引号(这就是在MySQL中进行转义的方式)。

有一件事我不确定,那就是这是否是“编码安全的”(如何正确地调用它?)通常建议使用mysql_real_escape_string而不是addslashes,因为前者将MySQL连接的编码考虑在内。也许这个问题也适用于这里。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5811834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档