php - 如何验证或限制用户的直接 SQL 输入?

标签 php mysql api validation sql-injection

我将在我拥有的网站之一上为开发人员提供 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/

相关文章:

php - 如何覆盖 CActiveDataProvider 方法以在 Yii 中默认以降序显示 CGridview

php - 连接到单独的 'Database Connect File'

php - 我如何在 php 中执行这两个查询?

ios - 解析数据后如何循环API调用Swift

java - Reddit api Oauth : Server returned HTTP response code: 411 for URL error

php - Laravel 分页添加获取参数

php - 通过使用 MySQL 查询添加一个字符来更新所有列值

php - 在 php 中键入提示

c# - 将 Entity Framework 6 与 MySQL 结合使用

ruby-on-rails - 从 ActiveResource 请求中删除 .xml 扩展名