如何验证或约束用户的直接SQL输入?

Shi*_*dim 6 php mysql api validation sql-injection

我将为我在其中一个站点上的开发人员提供类似data.stackexchange.com的SQL控制台.问题是我不能让他们执行所有类型的SQL.所以会有一些约束.以下是一些示例约束

  • 没有查询可以包含COUNT()函数
  • 每个查询必须包含LIMIT最大值100
  • 列数不能超过 5
  • 由于隐私区域,某些表格的数据将无法访问.
  • SELECT允许使用声明.

我现在在做什么?

我使用正则表达式来过滤这些.还计划在执行之前调用EXPLAIN或类似查询以确定其在db中的影响.

还有比正则表达更好的方法吗?它是如何在data.SE上完成的?还有什么我应该担心的吗?

更新1

可以通过限制数据库服务器中的用户权限来应用这两个规则.

  • 由于隐私区域,某些表格的数据将无法访问.
  • SELECT允许使用声明.

所以唯一的问题是验证SQL

更新2

我知道如果我写一个SQL解析器,它会做.这就像编写JS解释器一样,只是删除eval()它的坏习惯.因此,从头开始编写SQL解析器实际上不是一种选择.这里.

小智 1

您可以为 yacc 创建新语法,其中包含 SQL 子集。您可以使用此语法检查输入的 SQL。 SQL lex yacc 语法