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

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

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

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

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

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

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

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

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

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

12085 次点击
所在节点    全球工单系统
88 条回复
pkoukk
2019-01-16 18:19:42 +08:00
说不定程序员当初写的挺宽泛的
然后测试表示:abc.bcd 不是一个有效域名,你程序错了
firebroo
2019-01-16 18:30:14 +08:00
你这两个随手真的会产生很多安全问题
cdwyd
2019-01-16 18:33:00 +08:00
v2 也不能识别我的小众域名,狗头
meizi.lol
atonku
2019-01-16 18:50:55 +08:00
你牛逼行了吧
xiangyuecn
2019-01-16 18:58:35 +08:00
@firebroo 有没有比较常见的场景例子?冗长的表达式没有问题,而我这个随手写的会有问题。我想了一下,没有想到哪里会产生比较大的差异,觉得短的有问题的时候,长的可能也会有问题。
hiboshi
2019-01-16 19:01:14 +08:00
你为什么选那 千分之一。
secondwtq
2019-01-16 19:05:05 +08:00
Firefox 的地址栏现在可以直接搜索,但是只要是 xxx.x 格式的串,都会直接被当成域名尝试解析,然后“找不到服务器”

导致我想搜一个类似 libpthread.a 之类的单文件名的时候很蛋疼
autoxbc
2019-01-16 19:42:02 +08:00
你说到某些人的痛处了,他们自然要喷你

tldjs.parse('xxx.life')

>>>
domain "xxx.life"
hostname "xxx.life"
isIp false
isValid true
publicSuffix "life"
subdomain ""
tldExists true

https://github.com/oncletom/tld.js/
hellowes
2019-01-16 19:54:47 +08:00
com 域名可以,其他的就不行,我觉得这就很歧视了,纯粹是程序员水平问题,产品怎么干涉的了域名这种东西呢?
workwonder
2019-01-16 20:33:00 +08:00
支持楼主
jimrok
2019-01-16 20:40:20 +08:00
找到他们的 QA,最好的办法就是这个了。
azh7138m
2019-01-16 20:47:15 +08:00
推荐按照 rfc1738 和 rfc3986 来做。
安利一下我的 demo,https://github.com/muzea/parser/blob/master/sample/rfc1738.ts
多好 :D
firebroo
2019-01-16 21:09:20 +08:00
@xiangyuecn 文件上传之类的,最好的方式就是白名单文件后缀,正则和黑名单被绕过可能性很大。实际安全漏洞还需要结合实际情景,千奇白怪的正则导致被绕过的例子网上很多,所有我都是建议用万金油白名单
xiangyuecn
2019-01-16 21:30:12 +08:00
@firebroo 你提到的这点和这个帖子说的内容偏离的蛮大,感觉有点跑题了喔 (无奈脸
ioven
2019-01-16 22:07:58 +08:00
@xiangyuecn 同意标题,不同意内容

白名单没问题,不更新才是大问题
firebroo
2019-01-16 23:01:51 +08:00
@xiangyuecn 非要让我意淫出个漏洞吗。。比如域名匹配那个,我服务端截取最后一个.字符到结尾的子字符串填充到一个 1024 字节长度的缓冲期里面做处理,你写的正则没有限制后缀长度就会缓冲区溢出,白名单方式后缀长度可估量,肯定远小于 1024 字节,所以安全。当然这是我意淫的漏洞,线上环境千奇百怪也不是说不可能出现这种。
applehater
2019-01-16 23:29:26 +08:00
公司线上在运行的就有这样的问题
xiangyuecn
2019-01-16 23:50:26 +08:00
@firebroo #56 哈哈,这个算。缓冲区这种从来没接触过这么底层的东西,我换成了一维数组来看,不检查边界乱塞数据会导致比空指针还恶心的异常。

没想到域名检测在什么样常见的场景会出安全问题,我举个稍微偏一点的例子吧,搭边一点点:
场景:用户提交任意 https? url,服务器端会对这个 url 进行请求,比如远程图片抓取保存到服务器本地。
问题:如果不检测 url 中的主机名,可能导致内网地址被恶意调用。
解决办法:提取 url 中的主机名,如果是 ip 结构,判断是不是公网 IP。如果是域名结构,判断是否是 xx.xx 结构(排除 localhost )
当然这仅仅是发起请求前的一项安全检测。
Ansonyi
2019-01-17 02:24:24 +08:00
百度统计,好多后缀域名不认。
KasuganoSoras
2019-01-17 02:30:12 +08:00
这么麻烦,搞个 whois 查询接口不就好了,查一下域名的 whois 信息,就可以判断一个域名是否正确了啊
怕接口滥用可以限制一下接口的请求频率 + 登录验证

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

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

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

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

© 2021 V2EX