1

表名是可变的,但可以肯定的是只允许 SELECT 并且排除某些表(即用户、日志)。我正在制作一个报告表单,用户可以在其中输入 sql 查询来制作模板报告。

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

虽然我认为我可以在现有表的 html 选择列表中包含表名。

还要让用户reporter_appname@localhost 仅对除Users 和Log 之外的所有表具有SELECT 访问权限?在那种情况下,我不需要对查询进行正则表达式检查?

(这将在 PHP 中)

(理想情况下,我只想要一个文本区域,管理员可以在其中键入他们的查询,然后我的报告功能将获取输出并很好地呈现它等等。)

4

2 回答 2

2

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

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

  • 即使您只允许选择语句,用户也可以对您的数据库执行拒绝服务攻击。创建永远运行的选择语句非常容易(我们都做过)。恶意用户可能会在匆忙中使您的网站崩溃。即使是好心的用户也可能会意外地这样做。

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

可能有免费的 MySQL 报告软件可以作为一个很好的起点,尽管我自己对此没有任何经验。

于 2013-03-28T12:32:07.153 回答
0

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

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

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

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

于 2013-03-28T12:41:36.017 回答