SELECT * FROM table1 WHERE year_month BETWEEN '2021-08' AND '2022-01';
update table2 set note_description = 'test @8:57am', patient_id = '5840', note_updated_by = '10000019', note_update_date = '2022-07-13 09:45:49' where note_id = '639'现在,我的后端查询可以被sql注入攻击,所以我希望在上面的查询中避免sql注入,我想将参数从查询中分离出来,并用特殊字符替换它,这样我就可以避免sql注入,是否有任何包或任何东西可以执行。
发布于 2022-07-13 17:07:05
如果您已经收到了带有已连接的参数的SQL语句,那么这是修复问题的错误位置--无法安全地解析语句并将参数从查询中分离出来。
您应该在代码中找到将参数连接到语句中的位置,并利用准备好的语句/参数化查询安全地传递/绑定参数。
如果这是不可能的(例如,因为代码被构造为只传递语句),则不太理想的替代方法是在连接参数之前对它们进行编码/引用,同时确保语句中所有参数都被引用。如何完成该部分将取决于所使用的数据库/语言。
发布于 2022-07-14 23:29:54
我见过一个这样做的产品:查询摘要。它是一个免费的工具,可以解析MySQL查询日志,并生成运行每个查询所花费的聚合时间的报告。为此,它必须建立一个查询“指纹”,允许它对除常量值以外相同的查询进行分组。就像SELECT * FROM mytable WHERE id = 123一样,它的指纹和SELECT * FROM mytable WHERE id = 456一样。
这意味着它必须解析查询并用占位符?替换每个常量值,如数字或字符串文本。在IN()谓词的情况下,它将值列表替换为?+。此外,它减少了空白,并删除了注释。
这是一段相当重要的代码,大约有100行Perl:https://github.com/percona/percona-toolkit/blob/3.x/lib/QueryRewriter.pm#L139-L248,尽管如此,函数前面还有一个注释,开发人员承认它并不完美,可能会遗漏一些情况。使用正则表达式实现递归下降解析器是不有效或不正确的。
但这可能不是你想要做的。您不应该从带有常量值的查询开始,并将它们变成参数化查询。您应该根据需要自行设计参数化查询。
并非SQL查询中的每个常量值都必须参数化。只有那些不是固定值的。也就是说,如果您需要将客户端代码中的变量组合到SQL查询字符串中,并且不能保证该变量是安全的,那么使用一个参数。如果查询的常量值是固定的(而不是从变量中插值),那么它可以保留在查询中。如果查询的值来自变量,但该变量已知是安全的,并且永远不会被不受信任的输入污染,那么它可以保留在查询中。
对你来说,做出这些判断是更加可靠和经济的。您比任何自动化系统都更了解代码和上下文。
https://stackoverflow.com/questions/72964601
复制相似问题