避免SQL注入风险
2 分钟阅读
Avoiding SQL injection risk - 避免SQL注入风险
您可以通过提供SQL参数值作为sql
包的函数实参来避免SQL注入风险。sql
包中的许多函数为SQL语句和用于该语句的参数值提供了参数(其他函数为预处理语句和参数提供一个参数)。
下面的例子中的代码使用?
符号作为id
参数的占位符,该参数是作为函数实参提供的:
|
|
执行数据库操作的sql
包函数从您提供的实参中创建预处理语句。在运行时,sql
包将SQL语句变成一个预处理语句,并将其与独立的参数一起发送。
注意:参数占位符因您所使用的DBMS
和驱动而不同。例如,Postgres
的pq driver接受$1
这样的占位符形式,而不是 ?
。
您可能会想使用fmt
包中的一个函数来把SQL语句组合成一个包含参数的字符串——比如这样:
|
|
这是不安全的! 当您这样做时,Go会组装整个SQL语句,用参数值替换%s
格式的动词,然后再将完整的语句发送给DBMS。这会带来SQL注入的风险,因为代码的调用者可能会发送一个意外的SQL代码片段作为id
参数。该代码片段可能以不可预测的方式完成SQL语句,对您的应用程序造成危险。
例如,通过传递某个%s
值,您可能会得到如下语句,这可能会返回您数据库中的所有用户记录:
|
|
最后修改 June 4, 2023: 去除之前不能渲染的mkdocs-material风格的tabpane和!!!;将你统一替换成您 (7654f58)