避免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
值,您可能会得到以下内容,它可能返回您的数据库中的所有用户记录:
|
|