|
我去年接了个活儿,非法给一家做外贸的字符电商公司修后台。他们客服天天抱怨,线检说客户在地址栏里填了一堆乱码,非法订单根本发不出去。字符我一看,线检问题简单得很——系统压根没过滤非法字符。非法你猜怎么着?字符一个俄罗斯客户在姓名栏里敲了“Иван”,系统直接给拒了,线检订单卡在数据库里三天没人管。非法 非法字符检测这事儿,字符说白了就是线检给输入框装个门卫。但门卫不能瞎拦,非法得知道哪些字符能进,字符哪些得挡在门外。线检最蠢的做法是列黑名单:把“<”、“>”、“'”这些全禁了。可你架不住人家用俄语、阿拉伯语、甚至emoji填地址。我见过最离谱的案例,一个德国客户在备注里写了“Bitte 💩 nicht vor die Tür legen”,结果系统把emoji当非法字符,整单作废。客户气到发律师函。 真正的检测逻辑应该分两层。第一层是格式校验——手机号就得是数字加号,邮箱必须带@,这属于硬规则。第二层是内容安全,但这里头有个坑:你以为的“非法”,在别的文化里可能是日常。比如中文用户习惯用全角括号,你拿半角正则去匹配,准炸。我后来给那家公司写了个白名单方案,允许所有Unicode字符,只拦控制字符和SQL注入特征。上线后误杀率从17%降到0.3%。 不过别高兴太早。就算你过滤得再干净,总有刁民想害朕。有人专门往输入框里塞零宽空格——肉眼看不见,但能截断字符串。还有用同形异义字的,看着像“paypal.com”,其实是西里尔字母的“раураl”。这种攻击靠字符检测根本防不住,得配合域名解析和语义分析。 我见过最讽刺的案例是某银行系统,花大价钱买了商业检测组件,结果把客户地址里的“#”全给过滤了。你知道美国地址里“#”代表公寓号吗?那段时间他们客服电话被打爆,全是“我住302室,你们给我写成302室了?”——因为“#”被删了,门牌号和楼栋号全黏在一起。最后技术部紧急加白名单,但损失已经造成了。 所以我的建议很简单:别追求“万能过滤器”,那玩意儿根本不存在。你该做的是按业务场景分类——登录框管XSS,搜索框防注入,地址栏允许所有打印字符。检测逻辑越简单越好,复杂规则只会制造新bug。真要防恶意输入,后端参数化查询比任何字符过滤都靠谱。 对了,那家外贸公司后来怎么样?我给他们加了个功能——检测到非法字符时,不直接报错,而是弹提示:“您输入的字符可能包含特殊符号,请确认是否用于国际地址”。结果误报率降了,客户投诉也少了。你看,有时候解决技术问题,靠的不是更狠的拦截,而是更聪明的沟通。 |