最近天天搞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。
知识面宽一点,解决问题的方法就多一点。在墨菲定律充斥的软件行业,可能还需要广的知识面才能成为问题攻坚人员。共勉!!!