硬编码凭据¶
ID: go/hardcoded-credentials
Kind: problem
Security severity: 9.8
Severity: warning
Precision: medium
Tags:
- security
- external/cwe/cwe-259
- external/cwe/cwe-321
- external/cwe/cwe-798
Query suites:
- go-security-extended.qls
- go-security-and-quality.qls
在源代码中包含未加密的硬编码身份验证凭据非常危险,因为凭据很容易被发现。例如,代码可能是开源的,或者可能会泄露或意外泄露,从而使攻击者可以看到凭据。反过来,这可能会使他们获得未经授权的访问权限或获取特权信息。
建议¶
从源代码中删除硬编码凭据,例如用户名、密码和证书。而是将它们放在配置文件、环境变量或其他数据存储中(如有必要)。如果可能,请将包含凭据数据的配置文件与源代码分开存储在访问受限的安全位置。
示例¶
以下代码示例使用 lib/pq
包连接到 Postgres 数据库,并对用户名和密码进行硬编码
package main
import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
)
const (
user = "dbuser"
password = "s3cretp4ssword"
)
func connect() *sql.DB {
connStr := fmt.Sprintf("postgres://%s:%s@localhost/pqgotest", user, password)
db, err := sql.Open("postgres", connStr)
if err != nil {
return nil
}
return db
}
相反,可以通过环境变量 PGUSER
和 PGPASSWORD
提供用户名和密码,这些变量可以在外部设置,而无需在源代码中对凭据进行硬编码。