SQL字符串的正则表达式只允许对变量命名表进行SELECT查询?

时间:2013-03-28 12:11:44

标签: mysql sql regex

表名是可变的,但可以肯定的是,只允许SELECT并排除某些表(即Users,Log)。我正在创建一个报表,用户只需输入sql查询即可生成模板报告。

SELECT 'field1' As 'foo', 'field2' as 'bar'.. 'fieldn' 
FROM 'table1',..'tablen'
JOIN ... ON ...
WHERE CONDITION

虽然我想我可以在现有表的html选择列表中使用表名。

还要使用户只有SELECT用户才能使用operator_appname @ localhost访问除用户和日志以外的所有表吗?在这种情况下,我不需要打扰查询的正则表达式检查?

(这将是PHP)

(理想情况下,我只想要一个单一的textarea,管理员只需输入他们的查询,我的报告功能就可以获取输出并很好地呈现它等。)

2 个答案:

答案 0 :(得分:2)

我建议你重新考虑你的设计。

  • 如果不完全解析SQL,识别有效的select语句(并排除所有其他语句)基本上是不可能的。正则表达式不能胜任这项任务。

  • 即使您只允许select语句,用户也可以对您的数据库执行拒绝服务攻击。创建永远运行的select语句非常容易(我们都已完成)。恶意用户可能会匆忙崩溃您的网站。即使是善意的用户也可能偶然这样做。

为用户提供更有限的创建报告选项会更好。让他们从列表中选择某些表和列,并为它们创建适当的查询。

可能有免费的MySQL报告软件可以作为一个很好的起点,虽然我自己也没有这方面的经验。

答案 1 :(得分:0)

我认为您应该重新考虑应用程序的设计。 用户和日志表应位于一个数据库中,包含报告数据的表应位于另一个数据库中。

如果您将它们全部放在一个数据库中,那么只需创建另一个数据库,链接它们,然后从一个数据库到另一个数据库创建同义词,仅用于用户可以通过查询访问的表。

用户将在您刚刚创建的数据库上运行查询,并且他将仅限于那些包含同义词的表。

我不知道这是否是最佳选择,因为您对案例的描述相对模糊,但根据我所掌握的信息,这可能是一个解决方案。