我正在处理的项目有一个用 JRuby/Java 编写的 REST API,其端点可以访问 MySQL 数据库以检索许多记录。
我们需要允许客户端使用一列或多列过滤这些记录,包括布尔检查和范围值。
我们可以做到这一点的最简单方法是向 API 添加一个字符串参数,然后将其添加到 SQL 语句中。
总体而言,开发团队同意这是一个坏主意,但替代方法是提供几乎相同的过滤语法,将其转换为 SQL。SQL 注入参数的吸引力很强。
所以我的问题是,在任何情况下这样做是安全的吗?
特别是,如果 WHERE 子句预先被完全解析并被识别出来,我们是否可以考虑安全地使用它。或者至少,检查某些触发词,例如 DROP、SELECT 等。
此外,如果有人知道一个好的库可以充当中间人(将外部表达式翻译或解析为 WHERE 子句),那就太好了。