blog

Maは、ssrリンクのエンコード/デコードの戦闘エンコードシリーズを見る

リンクベース形式:なぜconstで関数を宣言するのですか? A:ポイズニングを防ぐため Q:なぜ=>{})()自己実行関数を使うのですか? A:中間変数を減らす、論理コンテキストを統合する、リソースの...

Nov 21, 2020 · 2 min. read
シェア

リンクベース形式

ssr://server:port:protocol:method:obfs:password_base64/?params_base64

デコード

const url = require('url') const qs = require('querystring') const decode = (ssr_link) => { const link = Buffer.from( ssr_link.replace(/^ssr:///, ''), 'base64', ).toString() const [server, port, protocol, method, obfs, pwd_and_params] = link.split(':') const [pwd, params] = (({ query, pathname } = {}) => [ Buffer.from(pathname, 'base64').toString(), Object.entries(qs.parse(query)).map(([key, val]) => [ key, Buffer.from(val.toString(), 'base64').toString(), ]), ])(url.parse(pwd_and_params)) return { server, port, protocol, method, obfs, pwd, params } }

エンコード

const url = require('url') const qs = require('querystring') const encode = ({ server, port, protocol, method, obfs, pwd, params, } = {}) => { const password_base64 = Buffer.from(pwd).toString('base64') const params_base64 = params .map(([key, val] = []) => [key, val ? Buffer.from(val).toString('base64') : '0'].join('='), ) .join('&') const ssr_info = Buffer.from( `${server}:${port}:${protocol}:${method}:${obfs}:${password_base64}/?${params_base64}`, ) .toString('base64') .replace(///g, '_') return `ssr://${ssr_info}` }

Q: 関数の宣言に const が必要なのはなぜですか?

A:中毒の予防

const a = 1 a = 2 // error function b() {} b = 'fun' const bb = () => {} bb = 'fun' // error

Q: なぜ =>{})() の自己実行関数を使うのですか?

A: 中間変数の削減、ロジックコンテキストの統合、リソースの回収、ポイズニングの機会の削減

const [pwd, params] = (({ query, pathname } = {}) => [ Buffer.from(pathname, 'base64').toString(), Object.entries(qs.parse(query)).map(([key, val]) => [ key, Buffer.from(val.toString(), 'base64').toString(), ]), ])(url.parse(pwd_and_params))
Read next