如何解决在Go Postgresql中防止SQL注入
我在Go中的postgresql注入论坛上进行了研究,发现如下一些有关sql注入的有用信息:
How to execute an IN lookup in SQL using Golang?
How can I prevent SQL injection attacks in Go while using "database/sql"?
但是我仍然需要一些建议,因为我在Go中的代码使用的是另一种代码和用例。 我需要建议的一些用例/问题是这样的
- 使用查询循环到多个插入
INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s)
使用fmt.Sprintf,我知道使用sprinft是不好的。那么此插入循环查询有什么解决方案吗? 例如:INSERT INTO a (a1,%s),(%d,%s)
- 如果参数使用
%d
而不是%s
,则使用fmt.Sprintf生成查询是否安全? - 使用Prepare语句和Query是安全的,但是如果我使用函数Select(使用$ 1,$ 2)和函数NamedQuery(使用命名结构)怎么办?
例如:
Select * from a where text = $1
->正在使用此$1
安全吗? 和 例如:Select * from a where text = :text
->在NamedQuery函数中安全吗?
需要您的建议。谢谢!
解决方法
首先,通常更喜欢使用db占位符? 1美元,等等。
- 是的,可以安全地使用带有整数参数的fmt.Sprintf来构建SQL,尽管可以避免,但是您的第三个参数是%s-避免使用并使用?
- 是的,将fmt.Sprintf与整数参数一起使用是安全的,但是%s或%v的风险更大,我会避免,不知道为什么需要它。
- 在这里使用占位符,然后是安全的。
一般规则:
- 默认情况下使用占位符,很少使用%d(例如在您的IN查询中)
- 在进行任何验证或使用之前,将参数解析为整数等类型
- 如果可以,请避免使用字符串concat,尤其要警惕字符串参数
- 始终对列和表名之类的东西进行硬编码,永远不要从用户输入中生成它们(例如?sort = mystringcolname)
- 始终验证您获取的参数仅仅是针对该用户授权的参数
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。