攻击类型转换要注意啥?避开这些坑少走弯路

tmyb

上周接了个外包小项目,甲方非要我做个数据校验功能。刚上手觉得挺简单,不就是把用户输入的数字转成文本处理嘛结果第一天就栽了跟头。

一、莽撞开局

我抄起键盘就开始整类型转换。用户输数字我直接string()套上去,前端表单哗接收得挺欢。当时美滋滋想着,下班前能搞定。

攻击类型转换要注意啥?避开这些坑少走弯路

  • 坑1:没管负数
  • 坑2:字母混着数字
  • 坑3:空值当0处理

凌晨两点甲方电话炸过来:"购物车咋能买负30件商品?库存被薅秃了!" 我对着屏幕冷汗直冒,开发者工具里输个"-30"直接变成字符串入库,校验形同虚设。

攻击类型转换要注意啥?避开这些坑少走弯路

二、胡乱补救

赶紧搬出正则表达式当救兵。写着"^d+$",以为万事大吉。测试员输个"12.3"直接卡死,小数点把程序整崩溃了。更绝的是,有人复制"123"这种全角数字,系统直接装瞎放行。

这时候才想起来打印数据类型日志,好家伙发现四种鬼东西:

  • float32价格
  • int库存
  • 攻击类型转换要注意啥?避开这些坑少走弯路

  • 字符串地址
  • 空指针优惠券

甲方在电话里咆哮的时候,我正盯着panic: interface conversion的错误提示抓耳挠腮。

三、重头做人

彻底推翻重写。这回学乖了:

攻击类型转换要注意啥?避开这些坑少走弯路

  1. 🛡️ 所有输入先扒层皮
  2. 🔍 拿当照妖镜
  3. ⛔ 遇错误直接打回
  4. 📏 数值范围用数学库锁死

攻击类型转换要注意啥?避开这些坑少走弯路

特地找测试组要了份作死清单:

  • 在数量栏贴emoji
  • 电话号字段输SQL语句
  • 金额框写"二百五"

攻击类型转换要注意啥?避开这些坑少走弯路

现在系统见招拆招:中文转译成"NaN",特殊符号直接弹警示红框。昨晚故意在价格框输"3.1415926",程序自动四舍五入成两位小数,终于没再报错。

折腾两周才明白,类型转换像给数据穿衣服:

1. 得先看身材(数据类型)

2. 不能硬塞(强制转换)

3. 尺码不对就重量(校验)

攻击类型转换要注意啥?避开这些坑少走弯路

早上甲方验收时嘀咕:"早知这么麻烦就该加钱..." 我攥着咖啡杯的手直哆嗦——这俩通宵熬的,比写主业务逻辑还累。

唠叨句:管住输入口比修数据库简单一百倍。昨天发现个邪门事:有人往生日栏塞Unix时间戳,要不是提前做了日期格式校验,用户档案库早成乱码坟场了。

(记于凌晨四点改完一版校验,窗外清洁车开始收垃圾了)