開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- JavaScript (プログラミング言語)
- Node.js, Safari(JavaScript エンジン)
- Learning JavaScript [邦訳](参考書籍)
メタプログラミングRuby 第2版(Paolo Perrotta (著)、角 征典 (翻訳)、オライリージャパン)の1部(メタプログラミング Ruby)、6章(金曜日: コードを記述するコード)、6.2(Kernel#eval)、6.2.1(アラウンドエイリアス)を JavaScript で取り組んでみる。
HTML5
<pre id="output0"></pre> <button id="run0">run</button> <button id="clear0">clear</button> <script src="sample1.js"></script>
JavaScript
let btn0 = document.querySelector('#run0'), btn1 = document.querySelector('#clear0'), pre0 = document.querySelector('#output0'), p = (x) => pre0.textContent += x + '\n'; let Resource = () => { let that = {}, get = (n) => `get ${n}`, post = (n) => `post ${n}`, put = (n) => `put ${n}`, del = (n) => `del ${n}`; that.get = get; that.post = post; that.put = put; that.del = del; return that; }; let POSSIBLE_VERBS = ['get', 'put', 'post', 'del'], r = Resource(); POSSIBLE_VERBS.forEach((m) => { eval(`window.${m} = (...args) => r.${m}(...args);`); }); let exploreArray = (method) => { let code = `['a', 'b', 'c'].${method};` p(`Evaluating: ${code}`); return eval(code); }; let exploreArray1 = (method, ...args) => Array.prototype[method].apply(['a', 'b', 'c'], args); let output = () => { p('6.2 Kernel#eval'); let array = [10, 20], element = 30; p(eval('array.push(element)')); p(eval('array.push(40); array')); p('6.2.1 REST Client の例'); p(get(1)); p(put(2)); p(post(3)); p(del(4)); p('6.2.5 eval の問題点'); p('コードインジェクション'); p(exploreArray('indexOf("b")')); p(exploreArray('map((e) => String.fromCodePoint(e.codePointAt(0) + 1))')); p('コードインジェクションから身を守る'); POSSIBLE_VERBS.forEach((m) => { window[m] = (...args) => { p('POSSIBLE_VERBS 2'); return r[m](...args); }; }); p(get(1)); p(put(2)); p(post(3)); p(del(4)); p(exploreArray1('indexOf', 'b')); p(exploreArray1('map', (e) => String.fromCodePoint(e.codePointAt(0) + 1))); }; btn0.onclick = output; btn1.onclick = () => pre0.textContent = ''; output();
0 コメント:
コメントを投稿