質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google Analytics API

Google Analytics APIは、アクセス解析機能が行える API(Application Programming Interface)です。

Q&A

解決済

4回答

1185閲覧

WEBサイトに拡張機能が仕込んだPOST値およびレスポンス値を、サイト運営者に秘匿することはできますか?

kiringiraffe

総合スコア4

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google Analytics API

Google Analytics APIは、アクセス解析機能が行える API(Application Programming Interface)です。

1グッド

2クリップ

投稿2023/08/31 10:06

編集2023/08/31 10:16

実現したいこと

WEBサイト上で GAS への POST を fetch() で実行するにあたって、そのPOST値およびレスポンス値を秘匿したいです。

前提・状況

Chrome 拡張機能を作っています。

どのWEBサイトでも「保存」ボタンをappend()し、クリックすると一部テキストを GAS に POST し、GAS は Notion に保存する。という機能です。

各WEBサイト上で fetch() して GAS へ POST する流れを想定していますが、その GAS は自分用なのでキーの検証機能を実装しようと考えました。

そこで不安がよぎりました。

不安・疑問

WEBサイト運営者は、そのサイト上のPOST値やレスポンス値を把握できるのでしょうか?

例えば MutationObserver() が「DOMツリーの変化を監視する」ように、「POST値やレスポンス値を監視する」みたいなことがもしできるのであれば、私が POST するキーは運営者にバレバレになってしまいますよね。

この不安から生じた疑問が、タイトルの通り、POST値およびレスポンス値を、サイト運営者に秘匿する方法です。

(もちろん、そもそもサイト運営者がこれらの値を確認する方法などない。ということでしたら解決です。)

該当のソースコード

考えている fetch() の流れです。もしサイト運営者がPOST値を監視できるのであれば、この GAS_KEY はあまり効果がありませんよね・・。

JavaScript

1const requestData = { 2 data1: 'data1', 3 data2: 'data2', 4}; 5const GAS_KEY = 'gas_key'; 6const requestOptions = { 7 method: 'POST', 8 body: JSON.stringify(requestData), 9 headers: { 10 'Authorization': GAS_KEY, 11 'Content-Type': 'application/x-www-form-urlencoded', 12 } 13}; 14const gasEndpointUrl = 'https://script.google.com/macros/s/●●/exec'; 15fetch(gasEndpointUrl, requestOptions) 16 .then(response => response.json()) 17 .then(data => { 18 console.log('data:', data); 19 }) 20 .catch(error => { 21 console.error('error:', error); 22 });

検索したこと

「POST 監視 JavaScript」で検索するとページが行う通信を監視したい。 というご質問がありました。

やっぱりできてしまうのか?!と一瞬焦りましたが、これはサイト運営者が自ら設置した <form> についての話題のようで、今回のように運営者でない拡張機能側の値には当てはまらなそうだと思われました。

しかしこの事例だけでは当然判断がつかず、さりとて他に有効な検索ワードも思いつきません。

考えたこと

CSRF 対策として使われる仕組みが転用できるかもと考えました。

つまり POST にキーを持たせるだけでなく、GAS 実行の都度異なる値のトークンを発行し、そのトークンを拡張機能側で受け取って都度 POST に含める仕組みです。

この仕組みは、POST値の監視しかできないのであれば有効に思われますが、しかしPOST値の監視だけでなくレスポンス値の監視もできるのであれば、やはり効果がないだろうという結論に至りました。

補足情報(FW/ツールのバージョンなど)

バージョンなど特筆すべき補足は特にございませんが、質問内容に不足情報などあればご指摘頂ければ幸いです。

直接的な正解に限らず、有効な検索ワードを貼って頂くだけでもうれしいです。(私がそれで理解できずさらに質問を重ねてしまうやもしれませんが・・)

どうぞ宜しくお願い致します。

Lhankor_Mhy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmp

2023/09/01 08:33

あなたの例で上げたページのメソッドのオーバーライドついては、問題ないってことですか? WEBサイト運営者が仕掛けるってのは、あまり考えられないですが、過去にできことならなんでも、してしまうサイトもありますからね。 例「Ad4U」で検索してみよう。こんな悪質なサイトもあるのですから気を付けた方がいいのか・・余計な心配なのか
kiringiraffe

2023/09/05 11:15

コメントありがとうございます。 > あなたの例で上げたページのメソッドのオーバーライドついては、問題ないってことですか? すみません、どこを指していらっしゃるのかわかりませんでした。 > 例「Ad4U」で検索してみよう。 この方法すごいですね。勉強になりました。
guest

回答4

0

ベストアンサー

既に別回答でも言われていますが、fetch 自体は上書き可能です。

ブラウザ環境では fetch はnative codeとして定義されており、基本的には window (グローバルオブジェクト) に生えています。
ですので、下記の通り fetch の利用を妨害することができます。

js:fetchの利用を妨害例

1window.fetch // => ƒ fetch() { [native code] } 2 3window.fetch = 3; 4 5window.fetch // => 3

また、任意のコードで差し替えることが出来るため、ここで通信内容を監視(どこかに投げて保存とか)も出来るでしょう。

js:任意の処理追加

1console.log('--- 上書き前 ---'); 2console.log((await window.fetch('https://www.google.com', {key:'秘密にしたいキー'})).status); //※https://www.google.comで開発者ツール開いて実験してます 3 4window.originalFetch = window.fetch; 5window.fetch = function() { console.log(arguments); return window.originalFetch(...arguments) }; 6 7console.log('--- 上書き後 ---'); 8console.log((await window.fetch('https://www.google.com', {key:'秘密にしたいキー'})).status);

log:任意の処理追加の確認

1--- 上書き前 --- 2200 3--- 上書き後 --- 4Arguments(2) ['https://www.google.com', {…}, callee: ƒ, Symbol(Symbol.iterator): ƒ] 5 0: "https://www.google.com" 6 1: {key: '秘密にしたいキー'} 7200

以下はちゃんと深堀してはいないですが、toString の中身を確認すれば fetch 上書きの検出はできるのかも?という可能性の提示です。

js:上書き検出

1console.log('--- 上書き前 ---'); 2console.log(window.fetch.toString()); 3console.log(window.fetch.toString.toString()); 4 5window.originalFetch = window.fetch; 6window.fetch = function() { console.log(arguments); return window.originalFetch(...arguments) }; 7console.log('--- 上書き後 ---'); 8console.log(window.fetch.toString()); 9console.log(window.fetch.toString.toString()); 10 11window.fetch.toString = function() { return 'function fetch() { [native code] }'; } // chrome 12window.fetch.toString = function() { return `function fetch() {\n [native code]\n}`}; // firefox 13console.log('--- toString偽装後 ---'); 14console.log(window.fetch.toString()); 15console.log(window.fetch.toString.toString());

log:上書き検出の確認(chrome)

1--- 上書き前 --- 2function fetch() { [native code] } 3function toString() { [native code] } 4--- 上書き後 --- 5function() { console.log(arguments); return window.originalFetch(...arguments) } 6function toString() { [native code] } 7--- toString偽装後 --- 8function fetch() { [native code] } 9function() { return 'function fetch() { [native code] }'; }

log:上書き検出の確認(firefox)

1--- 上書き前 --- 2function fetch() { 3 [native code] 4} 5function toString() { 6 [native code] 7} 8--- 上書き後 --- 9function() { console.log(arguments); return window.originalFetch(...arguments) } 10function toString() { 11 [native code] 12} 13--- toString偽装後 --- 14function fetch() { 15 [native code] 16} 17function() { return `function fetch() {\n [native code]\n}`}

検出例で示した通り、単純な上書き&偽装なら fetch#toString だけでなく fetch.toString#toString まで確認すれば native code か否か検出できます。
ただ、ググるともっと複雑なことして偽装してるパターンもあるらしくこれ以上はよく分かりませんでした。

というわけで、toStringの文字列比較等で上書き確認済みなら安全……とは言い切れませんが、参考程度に。

投稿2023/09/01 11:52

編集2023/09/02 01:13
pecmm

総合スコア647

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kiringiraffe

2023/09/05 11:17

具体的なコードをありがとうございます。なるほど。fetch がどこから生えているのかを考えれば上書きの可否についても思い至れたのですね。toString() で文字列に変更するという工夫も見たことがないアプローチで大変勉強になりました。
guest

0

サービスワーカを使うと通信のプロクシができるので、fetch API を通さないような通信でもページ内で起きていれば捕まえることができるはずです。
レスポンスを参照することもできます。やったことはないですが、レスポンスを偽装することもできる?のかな? レスポンスの偽装を試してみましたが、可能ではありました。
[Javascript] Service Worker 初心者入門、概要から使い方まで │ Web備忘録

投稿2023/09/02 02:48

編集2023/09/04 07:27
Lhankor_Mhy

総合スコア36898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

各WEBサイト上で fetch() して GAS へ POST する流れを想定していますが

そもそも論として「自分のサイトへ第三者が書き込んだソースによって行われる通信を監視する」必要性がある場面を想像することが難しいのですが、たとえばfetchそのものを監視できるようなものに差し替えることは理屈の上では可能です。

fetchをページ内のコンテキストではなく、拡張機能サイドで行う、という手段は取れないのでしょうか?

投稿2023/08/31 14:15

maisumakun

総合スコア145932

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kiringiraffe

2023/08/31 14:33

ご回答ありがとうございます。 > fetchをページ内のコンテキストではなく、拡張機能サイドで行う、という手段は取れないのでしょうか? とりあえず fetch() は拡張機能に書くつもりです。具体的には User JavaScript and CSS に書くつもりです。 User JavaScript and CSS https://chrome.google.com/webstore/detail/user-javascript-and-css/nbhcbdghjpllgmfilhnhkllmkecfmpld 尚、ここに書くことが、ページ内のコンテキストにあたるのかどうか?をよく理解できておりません。(コンテキストという概念に今はじめて触れました。) そして「拡張機能に書いた場合に、そのPOST値やレスポンス値はWEBサイト運営者が拾おうと思えばできるのではないか」という不安が生じており、今回の疑問となった次第です。 もし「そもそもWEBサイト運営者がこれらの値を確認する方法などない」ということでしたら解決なのですが、いかがでしょうか?
maisumakun

2023/08/31 21:23 編集

> User JavaScript and CSS こちらの拡張機能は、書いた内容を「ページ内」に適用してしまうもののようです。
kiringiraffe

2023/09/05 11:07

なるほど。拡張機能によってコンテキストを分けるタイプと分けないタイプがあるのですね。これは詳しくないと分かりませんね。ありがとうございます。
guest

0

隠匿するテキストをjavascriptで圧縮してパスワードを設定すれば良いのではないでしょうか。
参考サイト
なお、検証はしていません。

考え方は間違っていないはずなので検討頂けると幸いです。

投稿2023/08/31 11:05

mamekinkanmame

総合スコア39

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kiringiraffe

2023/08/31 13:05

ご回答ありがとうございます。2点よろしいでしょうか? 1つめ やはりPOST値およびレスポンス値はWEBサイト運営者に筒抜けになるということでしょうか?ではWEBサイト運営者がそれを把握するにはどのような方法があるのか教えて頂いてもよろしいでしょうか? 「MutationObsrver()という方法でDOMを監視できるように、●●という方法でPOST値を監視できる」といった情報を知りたいと思っております。そういった方法を知れれば対策が絞れてくるためです。 2つめ そういった方法を私は知らぬせいもあり、ご提示の方法がなぜ対策になりうるのか理解できませんでした。例えばPOST値になんらかのデータが含まれるわけですが、そのデータにパスワードがかかっていたとしても、GAS側では既定の処理に基づきパスワードを解除することになりますよね。 つまりPOST値を監視したりして拾った者は、そのPOST値の正しい値やパスワードを知らずともGASが実行できてしまう(GASが規定の処理に則ってパスワードを解除する)のではないかと懸念しております。 恐れ入りますが以上の点につきましてご返答頂けましたら幸いです。宜しくお願い致します。
mamekinkanmame

2023/09/02 08:06

>POST値およびレスポンス値はWEBサイト運営者に筒抜けになるということでしょうか? 出来ると責任を持って断言出来ませんが、出来るという前提で対策を講じるべきです。 方法は、ネットワークパケットの解析とWEBサーバのログの2種類は確実です。 >つまりPOST値を監視したりして拾った者は、そのPOST値の正しい値やパスワードを知らずともGASが実行できてしまう(GASが規定の処理に則ってパスワードを解除する)のではないかと懸念しております。 パスワード付きのzipファイルは監視側がパスワードを知らないと解析は出来ません また、仮にzipファイルがパスワード無しで解析出来た場合は、違う方法での暗号化を検討する事となります。
kiringiraffe

2023/09/05 11:07

ご返答ありがとうございます。 > 方法は、ネットワークパケットの解析とWEBサーバのログの2種類は確実です。 拡張機能がPOSTした値はブラウザがPOSTしているのではと思うのですが、WEBサイト運営者のサーバーがPOSTしていることになるのでしょうか? > パスワード付きのzipファイルは監視側がパスワードを知らないと解析は出来ません 仰る通りですが、監視側がパスワードを知ったり解析できたりする必要がないということを懸念しているのです。(パスワードを知らなくても解析するのはGASのプログラムですので。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問