4

REST API を使用したアプリにさまざまなフレーバーでアクセスできるようにしたい:

  • 同じドメインから (ここでは通常の AJAX 要求を使用)
  • サイト所有者が添付したスクリプトを介して別のドメインから (CORS)
  • ユーザースクリプト経由で別のドメインから (GM_xmlhttpRequest (?))

ホワイトリストによって、アプリがアクセスできるサイトのリストを制限したいと考えています。

CORS でそれを行う方法は知っていますが、サーバーからヘッダーを送り返す必要がないためGM_xmlhttpRequest、同じ方法で機能するかどうかはわかりません。GM_xmlhttpRequestOrigin

私はクライアントを気にしませんが、要求が送信されたサイトからサーバーを確認し{response:"site not supported"}、ホワイトリストにない場合などに応答する必要があります。

それで、あるウェブページでユーザースクリプトを実行して を作成するとGM_xmlhttpRequest、サーバーはオリジンを検出できますか?

4

1 に答える 1

3

Originヘッダーを使用して、ユーザースクリプトによる API へのアクセスを確実に制限することはできません。

デフォルトでは、GM_xmlhttpRequest()DocOriginはヘッダーをまったく送信しません。またGM_xmlhttpRequest、クロスサイト リクエストもブロックしません。それが存在する主な理由ですGM_xmlhttpRequest

また、Greasemonkey ( Firefox) およびTampermonkey (Chrome)の場合、デフォルトではヘッダーをGM_xmlhttpRequest送信しません。referer

ただし、両方の ヘッダーをオーバーライドして、スクリプト作成者が望むものにすることができます。

以下は、両方のヘッダーをスプーフィングするデモ スクリプトです (パケット スニファーを使用して確認してください)。

// ==UserScript==
// @name        _Test Fake Referrer
// @include     http://stackoverflow.com/questions/18178934/*
// @grant       GM_xmlhttpRequest
// ==/UserScript==

GM_xmlhttpRequest ( {
    method:     "GET",
    url:        "http://www.google.com",
    headers:    {
        referer:  "http://microsoft.com",
        origin:   "http://microsoft.com"
    }
} );



プレーンな Chrome ユーザースクリプトは、スクリプト開発者にとってあまり親切ではありません。ネイティブ Chrome ユーザー スクリプトはOriginヘッダーを送信せず、常に現在のページをreferer.

これらのヘッダーのいずれかを偽装しようとすると、コンソールに次のようなエラーが表示されます。

安全でないヘッダー「referer」
の設定を拒否しました 安全でないヘッダー「origin」の設定を拒否しました

これは、Chrome ユーザースクリプトに Tampermonkey を使用するもう 1 つの理由です。

于 2013-08-12T04:49:04.010 に答える