登录
首页 >  Golang >  Go问答

使用 go-sql-driver 和 mysql 实现插入查询安全保护

来源:stackoverflow

时间:2024-03-14 22:21:28 453浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《使用 go-sql-driver 和 mysql 实现插入查询安全保护》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我已经使用 db.prepare 查看了 go-sql-driver 示例,但无法使其正常工作,因此我将其修改为直接与 db.query 一起使用。我的理解是通过使用 ??无论如何,该值都会被转义,所以我想知道以下内容是否正确并且可以安全地防止 sql 注入(请注意,我正在使用 mysql)

stmtIns, err := db.Query("INSERT INTO users (name, address) VALUES(?,?)", name, address) // ? = placeholder
        if err != nil {
            panic(err.Error()) // proper error handling instead of panic in your app
        }
        defer stmtIns.Close() // Close the statement when we leave main() / the program terminates

此外,检测行是否已插入的最佳方法是什么?

澄清:为了安全起见,我指的是 sql 注入。我认为是的,但后来我想知道为什么我能找到的所有示例都使用 db.prepare 而不是像我一样使用 db.query。


解决方案


是的,这可以避免 SQL 注入攻击。

请注意,客户端代码不会在此类查询中“转义”参数。它做了一些更简单、更安全的事情:

客户端不会将 INSERT INTO users (name) VALUES(?) 和参数 ;DROP TABLE USERS; 合并到 INSERT INTO users (name) VALUES(;DROP TABLE USERS;

客户端也不会使用转义字符执行上述操作以使其“安全”。客户端不会构建类似 INSERT INTO users (name) VALUES("\;DROP TABLE USERS\;")

的内容

它的作用是向 MySQL 发送一个查询,其中分别包含:

  • 查询字符串 INSERT INTO users (name) VALUES(?) -- MySQL 知道这是一个查询字符串,并且知道 ? 是插入参数的位置。
  • 参数 ;DROP TABLE USERS; -- MySQL 知道这是查询的参数

因此服务器知道该参数不是 SQL 代码,这巧妙地避免了转义字符的整个讨厌问题。

通过选择不使用 Prepare,您将跳过服务器中的一些优化潜力。服务器将每个语句编译成内部表示,这需要时间。通过明确这一点并重新使用准备好的语句,您可以显式地避免重复该编译步骤。

但是,MySQL 会缓存已编译的语句,以避免重复编译完全相同的字符串——因此您可能不会看到大的性能问题。

理论要掌握,实操不能落!以上关于《使用 go-sql-driver 和 mysql 实现插入查询安全保护》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>