我公开了一个或多或少的公共(public) API,允许用户从数据库中查询数据集。由于用户需要过滤掉特定的数据集,我很想接受 SELECT 语句的 WHERE 部分作为 API 参数。因此,用户可以根据自己的意愿执行复杂的查询,而不必担心 API 接口(interface)困惑。
我知道我必须捕获 SQL 注入(inject)尝试。
您是否认为这会绕过 API 过多地包装数据库的目的,或者您认为这是一种理智的方法?
最佳答案
一般来说,我建议不要让他们在请求中嵌入实际的 sql
您可以让他们轻松地在他们的请求中提交 where
条件:
<where>
<condition "field"="name" "operator"="equal" "value"="Fred"/>
</where>
或类似的东西。
这样做的值(value)是多倍的:
- 在运行它们之前解析每个条件并确保它们是正确的
- 您可以创建“假”字段,例如可能不存在的“full_name”。
- 您可以限制他们可以设置条件的列
- 您可以将用户与基础数据库中的实际更改隔离开来。
我认为最后一点实际上是最重要的。有一天,您需要对数据库的底层架构进行更改。最终,它会发生。那时,您会喜欢在用户发送的内容和查询之间有一些“翻译”层。它将允许您将用户与底层数据库中的实际更改隔离开来。
API 应呈现实际表本身的“抽象”版本,以满足用户需求并将它们与实际底层数据库的更改隔离开来。
关于sql - 在公共(public) API 中允许一些 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7983753/