sql - 在公共(public) API 中允许一些 SQL?

标签 sql api

我公开了一个或多或少的公共(public) API,允许用户从数据库中查询数据集。由于用户需要过滤掉特定的数据集,我很想接受 SELECT 语句的 WHERE 部分作为 API 参数。因此,用户可以根据自己的意愿执行复杂的查询,而不必担心 API 接口(interface)困惑。

我知道我必须捕获 SQL 注入(inject)尝试。

您是否认为这会绕过 API 过多地包装数据库的目的,或者您认为这是一种理智的方法?

最佳答案

一般来说,我建议不要让他们在请求中嵌入实际的 sql

您可以让他们轻松地在他们的请求中提交 where 条件:

<where>
    <condition "field"="name" "operator"="equal" "value"="Fred"/>
</where>

或类似的东西。

这样做的值(value)是多倍的:

  1. 在运行它们之前解析每个条件并确保它们是正确的
  2. 您可以创建“假”字段,例如可能不存在的“full_name”。
  3. 您可以限制他们可以设置条件的列
  4. 您可以将用户与基础数据库中的实际更改隔离开来。

我认为最后一点实际上是最重要的。有一天,您需要对数据库的底层架构进行更改。最终,它会发生。那时,您会喜欢在用户发送的内容和查询之间有一些“翻译”层。它将允许您将用户与底层数据库中的实际更改隔离开来。

API 应呈现实际表本身的“抽象”版本,以满足用户需求并将它们与实际底层数据库的更改隔离开来。

关于sql - 在公共(public) API 中允许一些 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7983753/

相关文章:

php - 如何使用 PHP 从表单将数据插入到 mySQL 数据库中?

javascript - 工厂内的 Restangular 嵌套 Rest 资源

c++ - 在 C++ 中使用 Win32 Api 在任务栏中设置 NOTIFY ICON

javascript - 使用 Okta API 的 Okta 登录小部件

c# - 在postgresql中添加到bytea blob的函数

mysql - 使用 MySql 选择记录范围

java - org.languagetool 包不存在

c++ - 如果 CImage::Load 方法失​​败会发生什么?

sql - 在 postgresql 中出现错误 "record type has not been registered"。怎么了?

MYSQL 查询/子查询合并