阿里云语雀空间防泄露(关于墨菲定律的演变 netty自撸http&https代理 Cookie Copy方案始末)

最近天天搞DDD设计,拿PlantUml画图。 然后还要兼职解决疑难杂症... 刷Leetcode 好久没写博客了。

 今天写写最近解决比较头疼的一个问题。

博主的公司用了语雀(https://www.yuque.com/) 做知识库,遇到了个巨坑。

本着公司资料保密的原因,公司专门购买了空间(会给单独域名)。原来设想在空间中设置只允许沙盒出口地址访问,然后在沙盒中设置只能访问该空间,这样完美地把资料放在沙盒里面。

但是墨菲定律来了:

1. 语雀引了一堆OSS各种不同域名。(怎么收集所有的域名开通网络)

2. 语雀登录需要跳转到个人语雀地址。(意味着登录空间必须开启 https://www.yuque.com/ 如果打开的话可以把空间里的资料下来放到个人空间里) 

3. 沙盒用的4层防火墙对于语雀这种多个域名解析到一个ip的完全做不了限制(我们的空间和www.yuque.com用nslookup 查看是同一个ip地址 4层防火墙(tcp)无法感知到域名)

 

OK,本来以为只是配置网络策略的问题现在复杂了(不得不先吐槽一下现在好多Saas平台都是交叉调用 美名中台对别的公司网络策略配置得有多头疼)。

问题1很好解决,写一个谷歌插件,监听所有http请求,去重域名,点点语雀就收集了。 关键收集代码如下(在背景js中)

 

let domains=new Set();
chrome.webRequest.onBeforeRequest.addListener(
    function (details) {
        //这一行改成data_works的地址
        if (details.initiator == "https://www.yuque.com") {
            let domain = details.url.replace(/.*?\/\/(.*?)\/.*/, '$1');
            let protal = details.url.replace(/(.*?)\/\/.*/, "$1");
            if (!domains.has(protal+"#"+domain)) {
                console.log(protal, domain);
                domains.add(protal+"#"+domain);
            }

        }


    },
    { urls: ["<all_urls>"] },
    ["blocking"]
)

问题3也好解决,搞一个http代理。 因为复杂的操作现有的产品无法实现,所以用Netty自己撸了一个(这里有后续)。

代码比较长就不放了。

 

问题2当时有一种很有意思的解决方案:基于代理劫持网站到自己的反向代理上,然后反向代理上过滤url(只允许login不允许其他页面).

最后因为证书的问题没采用(因为没有语雀的私钥证书),所以会不安全。谷歌不让访问,要输入thisisunsafe秘籍。

反向代理实现。

正向用劫持以后不安全,而且登录会失败,语雀做过什么校验。最终还是失败了。

就在这时候我在想http是无状态的。那么是不是我不需要在沙盒里开放www.yuque.com. 我只要在外面把cookie copy进来就ok了呢。

最后验证成功!

cookie copy不能在js里直接读,因为读不到详细的信息。还得依赖谷歌插件。

核心的bg代码如下 读取和写入cookie的(当然 和tab也 还有注入js的代码省略了):

chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
    if (request.opt == "get") {
        chrome.cookies.getAll({ url: sender.origin }, (data) => {
            let json = [];
            for (let c of data) {
                json.push({
                    url: sender.origin, name: c.name, value: c.value, domain: c.domain, path: c.path, secure: c.secure, httpOnly: c.httpOnly,
                    expirationDate: c.expirationDate, storeId: c.storeId
                })
            }

            chrome.tabs.sendMessage(sender.tab.id, JSON.stringify(json));
        });
    }
    else if (request.opt == "set") {
        for (let c of request.data) {
            chrome.cookies.set(c);
        }
    }
});

 

可怜我一个java开发,又搞网络又搞谷歌插件。今天netty写http代理明天想着要不要写dns。

知识面宽一点,解决问题的方法就多一点。在墨菲定律充斥的软件行业,可能还需要广的知识面才能成为问题攻坚人员。共勉!!!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值