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

时间:2012-12-26 03:04:06

标签: 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 个答案:

答案 0 :(得分:1)

您可以为yacc创建包含SQL子集的新语法。比你能用这个语法检查输入SQL。 SQL lex yacc grammar