老是有 自作聪明的 程序员在 会随时间变化的地方 用手写白名单 还不更新

2019-01-16 13:25:22 +08:00
 xiangyuecn

见得多的: 编写代码那个时代存在的手机号段正则表达式(人才)。。。

不能忍的: 编写代码那个时代存在的顶级域名正则表达式(还不全)。。。

最近遇到个扫码工具不认一个 url,小众顶级域名,改成.com 这个顶级域名就可以就可以认。不难猜想,写这个代码的程序员如此的牛逼,找了一段自认为可以降服一切的域名下 url 的匹配方式。。让每年可能会出那个个把子的顶级域名情何以堪?

昨天在微博上搞微博登录,发现应用信息里面可以填安全域名,我的一个小众顶级域名后缀域名死活不认,工信部都认了。。。改成 com 就这种问题,今天研究了一下他们家代码,真是写的一手好代码呀,微博前端团队+后端团队,估计前后端这个限制代码都是同一个人写的吧,绕都绕不过。。。人才

解决办法:简化规则,皆大欢喜~ 手机号,url 大部分地方都可以使用最简化的正则表达式来判断。

随手写一个域名判断:/^([\w-]+.)+(\w+)$/,应该能适用大部分地方,小部分除外,新出顶级域名还不用更新。 随手写一个手机号判断:/^1\d{10}$/,应该能适用大部分地方,小部分除外,新出号段还不用更新。

另:记得 chrome 里面使用的是一个地方维护着的顶级域名列表,这种需要判断顶级域名的地方并且需要显示自己牛逼的地方,不学学?

主要呼叫微博吧,其他的就算了,开放平台->我的应用->基本信息->安全域名

12091 次点击
所在节点    全球工单系统
88 条回复
lincanbin
2019-01-17 02:37:43 +08:00
事实上我也这么枚举号段。

因为以前手机号没对号段做限制。
测试给我提了个 bug,我说这不是 bug,是个为未来考虑的 feature。
测试不听我说,我就把手机号段做了枚举检验,并且在 commit 里写下了测试的名字,注明是他要求的。

后来新增了 166、170 号段啥的,导致一些用户无法注册。

我拉出 commit log,就让测试背锅了。
KasuganoSoras
2019-01-17 02:47:13 +08:00
@firebroo 过长的字符串让缓冲区溢出?不存在的
if(mb_strlen($_POST['domain']) > 80) echo "invalid domain";
还没见过长度超过 80 的域名

另外,可以不必使用 whois,直接要求用户添加指定的 dns 解析,然后 dns_get_record 就行啦

还可以更简单,直接指定要求用户将指定域名前缀解析 A 记录到指定 IP,比如 127.0.0.1,然后用 gethostbyname 获取域名的 A 记录,如果解析成功就说明是有效域名,否则就是无效的,这种方法比查询 whois 更快,原理也和 CA 签发 SSL 证书验证一样。

我的 QQ 机器人的 ping 功能就是用 dns 判断域名是否有效的,公开丢到一百多个群里随便别人调戏玩耍,至今也没有被玩坏。

PHP 大法好
billwsy
2019-01-17 06:23:30 +08:00
"abc.local"这样的域名会不会带来安全隐患,如果服务器正好安装了 mDNS 的话
flowfire
2019-01-17 06:27:30 +08:00
前段的检验只是方便用户使用,第一时间反馈给用户,后端的校验才是安全校验,很明显,前段应该留一个宽松的标准,准确的校验应该留给后端
LeoSocks
2019-01-17 07:10:51 +08:00
@xiangyuecn 保住大鱼,放过小鱼。意思是,你这样的用户,他不要也罢
yamedie
2019-01-17 07:20:45 +08:00
您写的正则我举 2 个反例
域名:abc.abcdefghijklmnopqrstuvwxyz (后缀不限长度)
手机号:11012345678 (用座机拨个试试)
isCyan
2019-01-17 07:43:20 +08:00
前端简单校验
后端基于已有数据校验
手机号可以用 libphonenumber
域名可以用 public-suffix
workwonder
2019-01-17 07:53:47 +08:00
赞同楼主的人没几个,我是其中一个。
画蛇添足,形容很到位。
坚持自己的观点,别评论被扭歪了。
master13
2019-01-17 08:03:36 +08:00
挖坟一时爽,全家火葬场
yksoft1ex
2019-01-17 08:09:59 +08:00
我到只是觉得白名单不应该在前端 js 里面验证。
mytsing520
2019-01-17 08:31:46 +08:00
程序猿表示:产品的锅我不背
firebroo
2019-01-17 08:45:57 +08:00
@xiangyuecn 你那个有专业词汇,叫 ssrf~
@KasuganoSoras 杠精。🤣,解决方法当然有 n 种,我这不是在制造漏洞嘛。
MrJing1992
2019-01-17 09:01:58 +08:00
我们之前手机号验证也是写得无比复杂,后来,工信部加了新号段;又后来,公司业务切入到了海外。于是也改为使用 /^1\d{10}$/了。当然,我们有短信码校验。
xianxiaobo
2019-01-17 09:11:00 +08:00
某天出了 10 位或者 12 位的手机号,你的正则一样不行,然后就会有人发帖,为什么大家不会把手机号验证写为 20 位以内的数字就行呢?扩展性多好,新出的长度还不用更新
SakuraKuma
2019-01-17 09:23:31 +08:00
这样写没毛病啊,
猫并是,他不更新啊。
而且就算你绕过了前端。
后端估计也是一样的白名单。
TingHaiJamiE
2019-01-17 09:26:28 +08:00
别的不说,我个人十分赞同楼主手机号验证的方式。1 后面 10 个数字足够。
xiangyuecn
2019-01-17 09:30:45 +08:00
@lincanbin #61 第一个测试的锅 真实案例 (〃'▽'〃) 还好准备充足呀
eliteYang
2019-01-17 09:32:22 +08:00
因为有一些 sb 产品经理会随时修改需求
veike
2019-01-17 09:36:05 +08:00
你这个域名判断,后缀不应该加上字数限制吗,这样更严谨啊。
一个域名最长的长度为:255 个字节(包括标点符号)。域名名称最长 63 字节,比如 example.com example 部分最长 63 字节。后缀最多也不会超过 20 个字节。
所以,按照我这个才更严谨。
murmur
2019-01-17 09:39:58 +08:00
楼上的不要喷了
如果这是其他的公司我会喷楼主
如果是微博我更相信微博的产品经理 sb

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/527552

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX