フロントエンド環境にいて、以前のスクリプトタグで独自のJavascriptを実行できる場合は、MutationObserverをアタッチし、スパイしたいスクリプトタグがドキュメントに挿入されるのを待つというオプションがあります。挿入されたらすぐにコードを変更して、調べたり変更したりする機能が公開されるようにします。次に例を示します。
<script>
new MutationObserver((mutations, observer) => {
// Find whether the script tag you want to tamper with exists
// If you can't predictably identify its location,
// you may have to iterate through the mutations' addedNodes
const tamperTarget = document.querySelector('script + script');
if (!tamperTarget) {
return;
}
observer.disconnect();
console.log('Target script getting tampered with');
tamperTarget.textContent = tamperTarget.textContent.replace(
'return function',
'window.y = y; return function'
);
setTimeout(() => {
console.log("Hacked into tamper target's script and found a y of", y);
console.log('Could also have replaced the local y with another value');
});
})
.observe(document.body, { childList: true });
</script>
<script>
console.log('Tamper target script running');
var x = (function(){
var y = 5;
return function() {
alert(y);
};
})();
</script>
これはあなたが考えていたものではなかったかもしれませんが、この種の方法はクロージャーをハックする数少ない方法の1つであり、ページが変更できないコードを実行するときに便利な手法です。
他のスクリプトsrc
にインラインコードの代わりにある場合、それは少し難しくなります。<script>
タグがMutationObserverに表示されたら、タグを微調整するかtextContent
、元のスクリプトの内容と変更を加えた新しいスクリプトタグに置き換えます。元のコンテンツを取得するには、組み込みを調べて<script>
その置換をハードコーディングするか、必要な置換を行う前にスクリプトタグのテキストをフェッチする(CORSの問題を回避するために別のサーバーからリクエストをバウンスする可能性があります)。パッチを適用したコードを挿入します。(または、サーバーがある場合は、サーバーにテキストの置換を行わせることができます。その場合、必要なのsrc
は、挿入されたスクリプトタグのを、デフォルトの場所ではなくサーバーを指すように変更することだけです。)