37

setRequestHeader を使用してCookieヘッダーを設定できないのはなぜだろうと思っていました。特定の理由があるのでしょうか、それとも単にブラウザ自体によって追加されたために、これらのヘッダーが無効になっているのでしょうか? セキュリティ上の問題はありますか?

- 編集

私はnode.jsに取り組んでおり、xmlhttprequestモジュールを使用しました。以下はテストコードです。

var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.withCredentials = true;
xhr.setRequestHeader('Cookie', "key=value");
xhr.send(null);

ここでは、cookie-header をnode.js' xmlhttprequest明示的に追加しないように (ブラウザーが行うように)、cookie-header を設定する必要があります。そうしようとすると、xmlhttprequestエラー " Refused to set unsafe header" が発生します。

パッチを見つけて、Cookie ヘッダーを正常に送信できましたが。しかし、なぜ Cookie ヘッダーの設定が無効になっているのか疑問に思っていましたか? どこを読んでも、データの整合性とセキュリティのために必要であることがわかりましたが、この場合にどのようなセキュリティが侵害される可能性があるかについてはどこにも言及されていません。このデータ整合性の問題が node.js アプリケーションにも適用されるかどうかを評価したいと思います。

4

8 に答える 8

25

私はあなたが作業草案を調べて見つけたと確信しています

上記のヘッダーは、ユーザーエージェントによって制御され、トランスポートのこれらの側面を制御できます。

まず、理解する必要があります。これらは、異なるブラウザー間で機能を相互運用するためのガイドラインとして機能する標準です。ブラウザには義務付けられていないため、ブラウザはさまざまな理由でこの標準にさまざまなレベルで準拠しています。

第二に、技術的に言えば、ユーザーエージェントをエミュレートし、プログラムをブラウザとして扱い、言及された標準に従ってそれらの値を非常にうまく設定できます。

Content-Length最後に、ヘッダーの上書きを許可しない、または のような特定のフィールドのヘッダーを設定することを禁止する意図はCookiesecure design approach. これは、 HTTP リクエストのスマグリングを思いとどまらせるか、少なくとも思いとどまらせようとするためのもの です。

于 2013-03-07T08:57:37.793 に答える
16

この動作を無効にすることができます:

var xhr = new XMLHttpRequest();
xhr.setDisableHeaderCheck(true);
xhr.open(...);
...
于 2013-03-07T09:19:59.423 に答える
8

よく知られているように、ブラウザーでは、第三者がユーザー セッション (またはその他のデータ) を盗むのを防ぐために、Cookie (他のプロパティの中でも特に) を慎重に管理する必要があります。これはブラウザーの問題であり、任意の Javascript を実行する Web サイトにアクセスする際の制御されない性質です。

もちろん、任意のコードが実行されるこのリスクは、node.js にとってはリスクが低いか、またはリスクがありません。作成したスクリプトを実行するだけで、計画した他のコードが実行される可能性があります。

driverdan のXMLHttpRequest.jsのソース コードを見ると、次のことがわかります。

 // These headers are not user setable.   
 // The following are allowed but banned in the spec:   
 // * user-agent   
 var forbiddenRequestHeaders = [
    "accept-charset",
    "accept-encoding",
    "access-control-request-headers",
    "access-control-request-method",
    "connection",
    "content-length",
    "content-transfer-encoding",
    "cookie",
    "cookie2",
    "date",
    "expect",
    "host",
    "keep-alive",
    "origin",
    "referer",
    "te",
    "trailer",
    "transfer-encoding",
    "upgrade",
    "via"   ];

これは、node.js に使用されるこのスクリプトに特に制限が適用される理由についての特定の質問に答えます。node.js で必要なセキュリティ対策ではないと感じていたにもかかわらず、コーダーは (可能な限り厳密に) 仕様に従っていました。それでも、このデフォルトのセキュリティ レベルは簡単に変更できます。

robertklep が指摘したように、setDisableHeaderCheckメソッドを使用してこのデフォルトの予防策を無効にすることができます。はい、この最後のポイントは、あなたの質問で次のように述べているため、あなたの質問に対する回答に大きく貢献します。

I have found a patch and successfully able to send the cookie-header

そのパッチは必要ないことがわかりました。

幸運を!

于 2013-03-11T07:19:09.430 に答える
4

はい、データの整合性とセキュリティのために必要です。これを理解するには、HTTP リクエスト メソッドにおける Cookie の役割を理解する必要があります。

Cookie は、ユーザー、ブラウザ、接続などを識別する上で重要であり、Web ブラウザに保存されます。JavaScript を使用すると Cookie を操作できますが、ブラウザ上のすべての Cookie を操作できるわけではありません。HTTP Cookieを参照してください。これらはブラウザーによってのみ設定されるため、ユーザーは (JavaScript を介して) 悪用することはできません。

サポートされているブラウザーでは、HttpOnly セッション Cookie は HTTP (または HTTPS) 要求を送信する場合にのみ使用されるため、他の非 HTTP API (JavaScript など) からのアクセスが制限されます。

xmlhttprequest を送信すると、HttpOnly Cookie が読み取られ、Cookieヘッダー経由でサーバーに送信されます。これを行うxhr.setRequestHeader('Cookie', "key=value");と、サーバーに送信された Cookie を改ざんしようとしています。送信された Cookie の完全性を損なう可能性があるsetRequestHeader余分な情報が追加されます。key=value

これらは、ユーザー (セッション、電子メール アカウント、または任意のアカウント) を認証するためにサーバーによって使用されます。これにより、サーバーは Cookie を悪用してサーバーにアクセスすることを防ぐことができます。

于 2013-03-08T18:25:06.410 に答える
2

ドキュメントには、これはデータの整合性を保護するために行われると記載されています。 http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader%28%29-method

上記のヘッダーは、ユーザーエージェントによって制御され、トランスポートのこれらの側面を制御できます。これにより、データの整合性がある程度保証されます。Sec- で始まるヘッダー名を設定して、XMLHttpRequest からのものではないことが保証されている新しいヘッダーを作成できるようにすることはできません。

于 2013-03-06T12:36:45.667 に答える
0

xhr._restrictedHeaders.cookie = false前に追加しxhr.setRequestHeader('Cookie', "key=value"); ますが、それは悪い方法です。使用することはお勧めしません。

于 2022-01-15T05:08:44.070 に答える
-1

この答えは十分に完全ではないと思います。

すべての回答者が言うように、xhr.setRequestHeader('Cookie', "key=value");セキュリティの完全性のために、データを送信するために使用することはできません (ブラウザは、追加している値が実際の Cookie であるかどうかを判断できません)。

この特別なヘッダーを使用するために期待される方法は、クライアント ブラウザーが、要求しているサイトに関連するすべての Cookie を自動的に取得し、それらを「Cookie」ヘッダーに配置できるようにすることです。ブラウザに存在する場合、送信されます。

...ご参考までに、ブラウザに保存されているすべての Cookie は、要求しているサーバーからの応答がSet-Cookieヘッダーを返すたびに保存/更新されると想定されています。したがって、リクエストに「Set-Cookie」ヘッダーを追加しても意味がありません。これは、応答専用に予約されたヘッダーであり、ブラウザーが既に行っているため、リクエストに「Cookie」ヘッダーを追加する必要がないためです。

于 2019-09-30T18:48:55.413 に答える