sql - 执行准备好的语句的方法

标签 sql prepared-statement

我刚刚(偶然)在我正在从事的项目中偶然发现了另一个愚蠢的未清理的 SQL 注入(inject)缺陷......而且我对此感到非常厌倦。
您对如何消除此类错误的 sql 语句并在可行的情况下强制执行准备好的语句有什么建议吗?现在我更喜欢像

REVOKE DarnInlineDataStatements ON * TO xyz
这样的解决方案但由于这似乎不太可能,是否有例如用于查找这些东西的静态代码分析工具(达到一定的可靠性)?或者您还有什么建议吗?
编辑:软技能方法“请不要使用它们,(通常)有更好的方法”在过去似乎效果不太好。因此,我真的更喜欢首先阻止此类查询的东西。不是故意破坏现有代码,而是为了将来的项目,一些“没有这样的查询”解决方案;-)

最佳答案

如果将 sql 移至存储过程,则可以禁用应用程序用户的 SELECT、CREATE、ALTER、UPDATE、DELETE、DROP 等权限,仅保留 EXEC 访问权限。假设 SQL Server,但我确信 Oracle/MySQL 等允许类似的设置。

另请注意,这并不能保证准备好的语句:您仍然可以以不安全的方式调用存储过程。但是,如果您没有使用大量存储过程,它会发现任何编码不正确的地方,如果您遗漏了任何内容,那么 sql 注入(inject)攻击将很难成功。

关于sql - 执行准备好的语句的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/597277/

相关文章:

java - 如何使用 PreparedStatement 传递整数值列表

php - 我还需要使用 Prepared Statement 吗

php - 在 PDO 中准备查询时是否应该绑定(bind)内部值?

C# MySQL 将相同的数据插入到 2 个不同的表中

mysql - 这 2 个 JOIN 有什么区别?

MySQL 服务器版本,用于在第 1 行 'type=heap' 附近使用正确的语法

php - 将查询转换为处理键值列

sql - postgres - 如何根据两个数组的 AND 填充一个新数组

java - 如何在多线程环境中访问PreparedStatement?

php - 使用 PDO 调用带有 Out 参数的存储过程