我将在我拥有的网站之一上为开发人员提供 SQL 控制台,例如 data.stackexchange.com。问题是我不能让他们执行所有类型的 SQL。所以会有一些限制。下面是一些示例约束
- 任何查询都不能包含
COUNT()
函数 - 每个查询必须包含
LIMIT
,最大值为100
- 列数不能超过
5
- 由于隐私区域的原因,部分表格的数据将无法访问。
- 只允许使用
SELECT
语句。
我现在在做什么?
我使用正则表达式来过滤这些。还计划在执行之前调用 EXPLAIN 或类似查询以确定其对数据库的影响。
有没有比正则表达式更好的方法?它是如何在 data.SE 上完成的?还有什么我应该担心的吗?
更新1
这两个规则可以通过限制数据库服务器中的用户权限来应用。
- 由于隐私区域的原因,部分表格的数据将无法访问。
- 只允许使用
SELECT
语句。
所以唯一的问题是验证 SQL
更新2
我知道如果我编写一个 SQL 解析器它就可以了。这就像编写 JS 解释器只是删除 eval()
作为其不良做法。因此,从头开始编写 SQL 解析器确实不是一种选择。在这里。
最佳答案
您可以为包含 SQL 子集的 yacc 创建新语法。比你能够用这个语法检查输入的 SQL。 SQL lex yacc grammar
关于php - 如何验证或限制用户的直接 SQL 输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14035569/