ideas-to-use-iframe
Hackerのフェイク関数を見破るためにiframeを使用する方法を考察する。
// (1) iframe のエレメントを生成する。
const el_iframe=document.createElement("iframe");
// この時点では、el_iframe.contentDocument は null である。
// (2) iframe を DOM 内に挿入する。
document.body.appendChild(el_iframe);
// el_iframe.contentDocument は null でないが、override されている可能性がある。
問題は、(2)である。この appendChild が override されていれば、
el_iframe も改ざんされている可能性がある。
el_iframe.contentDocument.write も、もはや本物である確証はない。
従って、この appendChild(el_iframe) を迂回することが重要になる。
【idea 1】
<iframe>.......</iframe>のようにHTMLコードで挿入した場合、
appendChild を迂回できないだろうか?
結論:無理みたい ==> srcdoc.php
【idea 2】
MutationObserver で body を観察して、appendChild(el_iframe) で挿入した場合、
たとえこれが、Hacker の appendChild だったとしても、MutationObserver の
callback が呼ばれて、el_iframe.contentDocument から document の
オブジェクトを取得できる。これはまだ Hacker が document を override
する前である。この時点で、document.write の pointer を取得しておけば、
後で変更されたかどうかわかる。
結論:MutationObserverのcallbackはDispatcherから来る別のスレッドで
やってくるので、Hackerが先にdocumentを取得してしまう。
definePropertyのgetや、Proxyなどを使って、Hackerより先に
documentの取得を試みたが、無理そうである。
test0.php |
test1.php |
test2.php |
test3.php |
test4.php |
原因は、iframeのdocumentを取得するためには、
document.createElementとdocument.body.appendChildを
呼ばなければいけないので、それらの関数をoverrideされると、
Hackerが先にdocumentを取得してしまうのである。
この問題を解決するには、document.createElementと
document.body.appendChildの2つの関数が、絶対に
Overrideされていないことを確認する必要がある。
やる価値はあると思う。なぜなら、この方法では、
完全に純粋なdocument&windowオブジェクトが
入手できるからである。