不要相信用户输入, 自己的也不行
建议点击 查看原文 查看最新内容。
原文链接: https://typonotes.com/posts/2024/01/22/do-not-trust-user-input/
这片文章记录了自己的一个 低级错误。浪费了我接近一个小时的时间。
大概背景是公司换了新的 API 网关, 所有项目都要重新介入。
研发团队接入之后, 需要帮他们验证测试, 于是用 go 写了一个简单的工具。
但是实际运行结果
time=2024-01-20 level=ERROR msg="Failed: StatusCode = 400" env=dev region=us target=https://example.com/app/status caller=verifier.go:47#Scan
无论怎调整 API 和参数 都是 400错误(Bad Request), 哪怕是最简单的 健康检查接口 也是如此。
检查完代码之后, 确实找不到什么问题。没办法,只能从配置开始慢慢检查。
# app:
name: appname
envs: dev,qas,prd
regions: r1,r2
uris:
- method: get
path: /appname/status
- method: post
path: /appname/v1/others
type: application/json
data:
name: zhangsan
age: 18
经过一番对比检查, 最后发现了是 method 值的问题。
细心你的你可能已经发现, 这里 method 值是小写。而 http 请求中 method 值是大写的。
解决方法就很简单了, 在请求之前 强制
转换成大写即可 。截取代码如下。
httpMethod := uri.Method // get, Get
// 转换大写
httpMethod = strings.ToUpper(uri.Method) // GET
req := protocol.NewRequest(httpMethod, target, nil)
排查经过和反思
为什么会出现这种问题呢?
http.MethodGet
这样的变量, 虽然知道后面是大写, 但是没出过问题, 所以印象不够深刻。