Golang中的查询字符串是否安全?

4
考虑以下从URL中传递userId的URLParam的获取方式:
userId := http.Request.URL.Query().Get("userId")

这个内容是否安全(已转义并可以用于数据库调用),目前是安全的,不需要在使用之前进行转义或清洁处理。


永远不要假定任何内容是“安全转义”的 - 总是使用您的数据库驱动程序的参数化。 - elithrar
谢谢。据我所知,Redis没有这样的方法,但还是谢谢。 - Adergaard
1
你没有提到Redis,它不容易受到攻击,因为它是一个键值存储。值不会被检查或处理,而且命令与数据是分开的(不像SQL)。 - elithrar
Redis是一个没有这种方法的“数据库”的例子。那里不检查值的事实是无关紧要的。该值的使用可能在以后的上下文中变得有害。没关系,这不重要。我已经得到了下面的答案并接受了它。 - Adergaard
1个回答

8

这不是安全的数据库操作,应该在向数据库中添加任何内容之前使用数据库驱动程序进行转义。

您应该使用像 sql.DB.Query() 这样的函数,让您传递参数并正确转义它们。 http://golang.org/pkg/database/sql/#DB.Query

例如:

userId := http.Request.URL.Query().Get("userId")

rows, err := db.Query("SELECT * FROM users WHERE id=?", userId)

如果userId == "1' or 1=1 -- -'INSERT INTO users ...",会怎么样? - user2312578
1
@dalu 它被转义成一种不会引起问题的方式。 - Not_a_Golfer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接