如何清理MySQL表名

时间:2015-04-28 19:45:17

标签: php mysql security

这个简单的表名称是否足以阻止SQL注入?

$table = str_replace('`', '', $table);
$table = '`'.$table.'`';

注意:我使用PDO。

2 个答案:

答案 0 :(得分:2)

如果您允许用户选择他们查询的表,那么唯一的方法就是"清理"并确认没有黑客将是允许表的白名单。您的方法也将无法允许其他数据库模式。这也可以像查询特定数据库中的表列表一样简单。

我没有使用mysql实例来尝试查找错误的表名。我可以说,尽管我无法思考(或真正测试和验证)绕过这种情况的方法,但我可以说我可以想到几种查询会直接失败的方法。尝试访问其他数据库otherDB.tableName或从具有联接的多个表中进行选择。虽然这可能会导致错误,但您仍然不希望有机会找到可以通过的内容。

答案 1 :(得分:1)

如果您想要超级安全并避免错误,可以查询INFORMATION_SCHEMA以检查表是否存在。然后您将知道表存在,并且可以更早地捕获无效表。您还可以限制特定架构。

  1. 将输入拆分为DB和Table(如有必要)

  2. 从information_schema.tables中选择table_name,table_schema,其中table_schema ='db'和table_name ='tableName'(注意:您可以在此处使用参数化查询来防止注入)

  3. 如果收到回复,也可以使用返回的值(table_schema.table_name),否则不是有效的表

  4. 然后执行您的查询,知道该表存在且有效

  5. 检查information_schema的额外查询可能会导致一些开销,但也许您可以针对您的特定需求进行优化。