微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Go Postgresql中防止SQL注入

如何解决在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中的代码使用的是另一种代码和用例。 我需要建议的一些用例/问题是这样的

  1. 使用查询循环到多个插入 INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s)使用fmt.Sprintf,我知道使用sprinft是不好的。那么此插入循环查询有什么解决方案吗? 例如:INSERT INTO a (a1,%s),(%d,%s)
  2. 如果参数使用%d而不是%s,则使用fmt.Sprintf生成查询是否安全?
  3. 使用Prepare语句和Query是安全的,但是如果我使用函数Select(使用$ 1,$ 2)和函数NamedQuery(使用命名结构)怎么办? 例如:Select * from a where text = $1->正在使用此$1安全吗? 和 例如:Select * from a where text = :text->在NamedQuery函数中安全吗?

需要您的建议。谢谢!

解决方法

首先,通常更喜欢使用db占位符? 1美元,等等。

  1. 是的,可以安全地使用带有整数参数的fmt.Sprintf来构建SQL,尽管可以避免,但是您的第三个参数是%s-避免使用并使用?
  2. 是的,将fmt.Sprintf与整数参数一起使用是安全的,但是%s或%v的风险更大,我会避免,不知道为什么需要它。
  3. 在这里使用占位符,然后是安全的。

一般规则:

  • 默认情况下使用占位符,很少使用%d(例如在您的IN查询中)
  • 在进行任何验证或使用之前,将参数解析为整数等类型
  • 如果可以,请避免使用字符串concat,尤其要警惕字符串参数
  • 始终对列和表名之类的东西进行硬编码,永远不要从用户输入中生成它们(例如?sort = mystringcolname)
  • 始终验证您获取的参数仅仅是针对该用户授权的参数

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。