面试题答案
一键面试函数A
- 输入验证:
- 仔细检查传递给函数A的所有输入参数,确保其类型和格式正确。例如,如果输入是字符串,使用正则表达式验证其格式是否符合预期。假设函数A接收一个字符串参数
input
用于后续传递给函数B,代码如下:
import ( "regexp" ) func A(input string) error { match, _ := regexp.MatchString(`^[a-zA-Z0-9]+$`, input) if!match { return fmt.Errorf("invalid input format") } // 调用函数B err := B(input) return err }
- 仔细检查传递给函数A的所有输入参数,确保其类型和格式正确。例如,如果输入是字符串,使用正则表达式验证其格式是否符合预期。假设函数A接收一个字符串参数
- 避免信任未验证的外部数据:不要将未经过验证的用户输入直接传递给函数B,防止恶意数据进入调用链。
函数B
- 输入验证:
- 再次验证从函数A接收到的输入,即使函数A已经验证过。因为中间可能存在其他修改输入的逻辑。沿用上面的例子,函数B验证从函数A传入的
input
:
func B(input string) error { match, _ := regexp.MatchString(`^[a-zA-Z0-9]+$`, input) if!match { return fmt.Errorf("invalid input format") } // 调用函数C err := C(input) return err }
- 再次验证从函数A接收到的输入,即使函数A已经验证过。因为中间可能存在其他修改输入的逻辑。沿用上面的例子,函数B验证从函数A传入的
- 环境变量处理:
- 如果函数B需要设置环境变量传递给函数C,确保环境变量的值是安全的。例如,如果要设置一个环境变量
ENV_VAR
,代码如下:
func B(input string) error { // 验证环境变量值 envValue := getSafeEnvValue() os.Setenv("ENV_VAR", envValue) err := C(input) return err } func getSafeEnvValue() string { // 这里进行环境变量值的验证和过滤 return "safe_value" }
- 如果函数B需要设置环境变量传递给函数C,确保环境变量的值是安全的。例如,如果要设置一个环境变量
函数C
- 输入验证:
- 对从函数B接收到的输入进行最终验证。例如:
func C(input string) error { match, _ := regexp.MatchString(`^[a-zA-Z0-9]+$`, input) if!match { return fmt.Errorf("invalid input format") } // 执行系统命令 cmd := exec.Command("some_command", input) _, err := cmd.Output() return err }
- 使用固定命令和参数:
- 如果可能,尽量使用固定的命令和参数,避免拼接用户输入形成命令。例如,使用
exec.Command("ls", "-l", input)
比exec.Command("ls -l " + input)
更安全。
- 如果可能,尽量使用固定的命令和参数,避免拼接用户输入形成命令。例如,使用
- 环境变量处理:
- 仔细审查函数C中使用的所有环境变量,确保其来源可靠。如果使用环境变量作为命令的一部分,要进行严格的验证和过滤。例如,假设环境变量
COMMAND_DIR
用于指定命令的路径,代码如下:
func C(input string) error { commandDir := os.Getenv("COMMAND_DIR") // 验证commandDir是否是安全路径 if!strings.HasPrefix(commandDir, "/safe/path/") { return fmt.Errorf("unsafe command directory") } cmd := exec.Command(filepath.Join(commandDir, "some_command"), input) _, err := cmd.Output() return err }
- 仔细审查函数C中使用的所有环境变量,确保其来源可靠。如果使用环境变量作为命令的一部分,要进行严格的验证和过滤。例如,假设环境变量
- 使用exec.CommandContext:
- 为了更好地控制命令的执行,建议使用
exec.CommandContext
,这样可以在必要时取消命令执行,防止命令长时间阻塞或恶意利用。例如:
func C(input string) error { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() cmd := exec.CommandContext(ctx, "some_command", input) _, err := cmd.Output() return err }
- 为了更好地控制命令的执行,建议使用