记一个线上问题

乙醇 创建于 3 个月 之前

最后更新时间 2019-06-30

永远不要相信用户的输入

正愁着这周的公众号写些什么的时候,线上就很应景的出现了问题。

问题很简单,我们的app上有广告位,广告位的落地链接是在后台配置的。今天我们测试同学发现线上的某个广告位链接点击之后无法展示。

经过排查,我们发现原来运营人员在配置广告位链接时候在链接后带上了一个肉眼不可见的字符\t。

原因找到之后处理起来就很容易了,只要要运营人员去掉后面的不可见特殊字符就好了。

这应该是大家很常见的一个特殊字符的测试场景,在设计基于输入框用例的时候基本上大家都会做类似的用例验证。不过大家在验证的时候大部分把精力放在肉眼可见的特殊字符上,最常见的就是url encoding的时候需要转义的一些特殊字符,比如 ^%$@之类,基本上就是键盘数字键上方那一些字符串。不过这样是不完备的了,一些特殊的转义字符,特别是肉眼觉察不到的转义字符也是需要考虑的。

其实用例验证是后验式的,如果在需求评审和开发的时候就注意到的话,那么就算是漏测,也是不会发生线上问题的了。

针对这个场景,我们在跟开发沟通设计的时候,应该是可以这样做的。

首先前端在发送创建广告位请求的时候就应该过滤掉url首位的空字符和换行符,比如 \t\n 其次后端在持久化url的时候也要做一样的工作,去掉无效的空字符 最后app端(android/ios/h5/rn)在跳转url的时候也要过滤掉首尾的空字符 总结一下

前端要做校验 后端要做校验 客户端有时候不能盲目相信服务端 最后大家可以牢牢记住一句话:永远不要相信用户的输入

用户的输入永远的是不可控的, 一定要对用户的输入做校验和过滤(前后端都要),否则出线上问题或安全问题是迟早的事。

我要留言

  • 上周也试过这样的问题,复制同事给的一条get的接口,粘贴到浏览器的地址框,结果发现一直得不到正确的结果,参数是正确的。结果发现是这条请求中有个/t但是浏览器是不显示的,折腾了半天

    karl 创建于 2019-07-04 14:16:31

  • 用户输入不可控。 依靠前端的JS限制一下输入内容格式是不是就可以保证前端没有问题了?

    applepen 创建于 2019-07-01 15:35:39