JavaScript では、同一オリジン ポリシーは、クライアント側スクリプト (特に Javascript) にとって重要なセキュリティ メトリックです。つまり、同じプロトコル (プロトコル)、ポート、ホスト (ドメイン名) を持つ 2 つのページです。同じソースに属します。
このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。
同一生成元ポリシーとは何ですか?
同一生成元ポリシーは、クライアント側スクリプト (特に Javascript) の重要なセキュリティ メトリックです。これは Netscape Navigator 2.0 で最初に登場したもので、その目的はドキュメントやスクリプトが複数の異なるソースからロードされるのを防ぐことでした。
同一オリジン ポリシーとは、同じプロトコル、ポート (指定されている場合)、およびホスト (ドメイン名) を持つ 2 つのページが同じソースに属することを意味します。
例: http://www.example.com/dir/page.html
この URL、
プロトコルは http://、
ドメイン名は www .example.com,
ポートは 80 です (デフォルトのポートは省略可能)。その相同性は以下の通りである。
http://www.example.com/dir2/other.html:同源 http://example.com/dir/other.html:不同源(域名不同) http://v2.www.example.com/dir/other.html:不同源(域名不同) http://www.example.com:81/dir/other.html:不同源(端口不同)
本質:
本質は単純です。あらゆるサイトから読み込まれた信頼できるコンテンツは安全ではないとみなします。ブラウザーによって信頼されていないスクリプトがサンドボックスで実行される場合、悪意のある可能性のある他のサイトからのリソースではなく、同じサイトからのリソースへのアクセスのみを許可する必要があります。
なぜ同一生成元制限があるのですか?
例を挙げてみましょう: たとえば、ハッカー プログラムは IFrame を使用して、実際の銀行ログイン ページをページに埋め込みます。実際のユーザー名とパスワードでログインすると、彼のページには次の内容が表示されます。フォームへの入力は Javascript を通じて読み取ることができるため、ユーザー名とパスワードを簡単に取得できます。
同一生成元ポリシーの目的は、ユーザー情報のセキュリティを確保し、悪意のある Web サイトによるデータの盗難を防ぐことです。
次のような状況を想像してください: Web サイト A は銀行であり、ユーザーはログインした後、他の Web サイトを閲覧します。他の Web サイトが Web サイト A の Cookie を読み取ることができたらどうなりますか?
明らかに、Cookie にプライバシー (入金額の合計など) が含まれている場合、その情報は漏洩します。さらに恐ろしいのは、ユーザーのログイン状態を保存するために Cookie がよく使用されており、ユーザーがログアウトしないと、他の Web サイトがユーザーになりすまして、やりたいことが何でもできるようになるということです。ブラウザーは、フォームの送信が同一生成元ポリシーによって制限されないことも規定しているためです。
「同一生成元ポリシー」が必要であることがわかります。そうしないと、Cookie が共有される可能性があり、インターネットはまったく安全ではなくなります。
制限範囲
インターネットの発展に伴い、「同一生成元ポリシー」はますます厳しくなっています。現在、同じ起源でない場合に制限される動作が 3 つあります。
(1) Cookie、LocalStorage 和 IndexDB 无法读取。 (2) DOM 无法获得。 (3) Ajax 请求不能发送。
これらの制限は必要ですが、場合によっては不便であり、合理的な目的に影響を与えます。以下では、上記 3 つの制限を回避する方法を詳しく紹介します。
#回避方法
1. Cookie
#Cookie は、次の方法で書き込まれる情報です。サーバーからブラウザへ小さな情報は、同じオリジンを持つ Web ページ間でのみ共有できます。ただし、2 つの Web ページの第 1 レベルのドメイン名は同じですが、第 2 レベルのドメイン名は異なります。ブラウザでは、document.domain を設定することで Cookie を共有できます。
http://w1.example.com/a.html、Web ページ B は
http://w2.example.com/ b .html の場合、同じ document.domain が設定されている限り、2 つの Web ページは Cookie を共有できます。
document.domain = 'example.com';これで、Web ページ A はスクリプトを通じて Cookie を設定します。
document.cookie = "test1=hello";Web ページ B はこの Cookie を読み取ることができます。
var allCookie = document.cookie;このメソッドは Cookie および iframe ウィンドウにのみ適用できます。LocalStorage および IndexDB ではこのメソッドを使用できません。
同一生成元ポリシーを回避するには、以下で紹介する PostMessage API を使用する必要があります。
Set-Cookie: key=value; domain=.example.com; path=/この場合、第 2 レベル ドメイン名と第 3 レベル ドメイン名の両方が設定なしでこの Cookie を読み取ることができます。
2. iframe
2 つの Web ページのソースが異なる場合、相手の DOM を取得できません。典型的な例は、iframe ウィンドウと、親ウィンドウと通信できない window.open メソッドによって開かれたウィンドウです。 たとえば、親ウィンドウが次のコマンドを実行する場合、iframe ウィンドウが同じオリジンのものでない場合、エラーが報告されます。document.getElementById("myIFrame").contentWindow.document // Uncaught DOMException: Blocked a frame from accessing a cross-origin frame.上記のコマンドでは、親ウィンドウは次のコマンドを実行します。子ウィンドウの DOM を取得すると、クロスオリジンのためエラーが報告されます。 逆に、子ウィンドウもメイン ウィンドウの DOM を取得するときにエラーを報告します。
window.parent.document.body // 报错2 つのウィンドウの第 1 レベルのドメイン名が同じであるが、第 2 レベルのドメイン名が異なる場合は、前のセクションで紹介した
document.domain 属性を設定します。同一生成元ポリシーを回避して DOM を取得できます。
- フラグメント識別子
- window.name
- クロスドキュメント メッセージング API
2.1 フラグメント識別子
片段标识符(fragment identifier)指的是,URL的#号后面的部分,比如http://example.com/x.html#fragment
的#fragment。如果只是改变片段标识符,页面不会重新刷新。
父窗口可以把信息写入子窗口的片段标识符。
var src = originURL + '#' + data; document.getElementById('myIFrame').src = src;
子窗口通过监听hashchange事件得到通知。
window.onhashchange = checkMessage; function checkMessage() { var message = window.location.hash; // ... }
同样的,子窗口也可以改变父窗口的片段标识符。
parent.location.href= target + "#" + hash;
2.2 window.name
浏览器窗口有window.name
属性。这个属性的最大特点是,无论是否同源,只要在同一个窗口里,前一个网页设置了这个属性,后一个网页可以读取它。
父窗口先打开一个子窗口,载入一个不同源的网页,该网页将信息写入window.name属性。
window.name = data;
接着,子窗口跳回一个与主窗口同域的网址。
location = 'http://parent.url.com/xxx.html';
然后,主窗口就可以读取子窗口的window.name了。
var data = document.getElementById('myFrame').contentWindow.name;
这种方法的优点是,window.name容量很大,可以放置非常长的字符串;缺点是必须监听子窗口window.name属性的变化,影响网页性能。
2.3 window.postMessage
上面两种方法都属于破解,HTML5为了解决这个问题,引入了一个全新的API:跨文档通信 API(Cross-document messaging)。
这个API为window对象新增了一个window.postMessage方法,允许跨窗口通信,不论这两个窗口是否同源。
举例来说,父窗口http://aaa.com向子窗口http://bbb.com发消息,调用postMessage方法就可以了。
var popup = window.open('http://bbb.com', 'title'); popup.postMessage('Hello World!', 'http://bbb.com');
postMessage方法的第一个参数是具体的信息内容,第二个参数是接收消息的窗口的源(origin),即”协议 + 域名 + 端口”。也可以设为*,表示不限制域名,向所有窗口发送。
子窗口向父窗口发送消息的写法类似。
window.opener.postMessage('Nice to see you', 'http://aaa.com');
父窗口和子窗口都可以通过message事件,监听对方的消息。
window.addEventListener('message', function(e) { console.log(e.data); },false);
message事件的事件对象event,提供以下三个属性。
event.source:发送消息的窗口 event.origin: 消息发向的网址 event.data: 消息内容
下面的例子是,子窗口通过event.source属性引用父窗口,然后发送消息。
window.addEventListener('message', receiveMessage); function receiveMessage(event) { event.source.postMessage('Nice to see you!', '*'); }
event.origin属性可以过滤不是发给本窗口的消息。
window.addEventListener('message', receiveMessage); function receiveMessage(event) { if (event.origin !== 'http://aaa.com') return; if (event.data === 'Hello World') { event.source.postMessage('Hello', event.origin); } else { console.log(event.data); } }
2.4 LocalStorage
通过window.postMessage
,读写其他窗口的 LocalStorage
也成为了可能。
下面是一个例子,主窗口写入iframe子窗口的localStorage。
window.onmessage = function(e) { if (e.origin !== 'http://bbb.com') { return; } var payload = JSON.parse(e.data); localStorage.setItem(payload.key, JSON.stringify(payload.data)); };
上面代码中,子窗口将父窗口发来的消息,写入自己的LocalStorage。
父窗口发送消息的代码如下。
var win = document.getElementsByTagName('iframe')[0].contentWindow; var obj = { name: 'Jack' }; win.postMessage(JSON.stringify({key: 'storage', data: obj}), 'http://bbb.com');
加强版的子窗口接收消息的代码如下。
window.onmessage = function(e) { if (e.origin !== 'http://bbb.com') return; var payload = JSON.parse(e.data); switch (payload.method) { case 'set': localStorage.setItem(payload.key, JSON.stringify(payload.data)); break; case 'get': var parent = window.parent; var data = localStorage.getItem(payload.key); parent.postMessage(data, 'http://aaa.com'); break; case 'remove': localStorage.removeItem(payload.key); break; } };
加强版的父窗口发送消息代码如下。
var win = document.getElementsByTagName('iframe')[0].contentWindow; var obj = { name: 'Jack' }; // 存入对象 win.postMessage(JSON.stringify({key: 'storage', method: 'set', data: obj}), 'http://bbb.com'); // 读取对象 win.postMessage(JSON.stringify({key: 'storage', method: "get"}), "*"); window.onmessage = function(e) { if (e.origin != 'http://aaa.com') return; // "Jack" console.log(JSON.parse(e.data).name); };
3、Ajax
同源政策规定,AJAX请求只能发给同源的网址,否则就报错。
除了架设服务器代理(浏览器请求同源服务器,再由后者请求外部服务),有三种方法规避这个限制。
JSONP WebSocket CORS
3.1 JSONP
JSONP是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,老式浏览器全部支持,服务器改造非常小。
它的基本思想是,网页通过添加一个<script></script>
元素,向服务器请求JSON数据,这种做法不受同源政策限制;服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。
首先,网页动态插入<script></script>
元素,由它向跨源网址发出请求。
function addScriptTag(src) { var script = document.createElement('script'); script.setAttribute("type","text/javascript"); script.src = src; document.body.appendChild(script); } window.onload = function () { addScriptTag('http://example.com/ip?callback=foo'); } function foo(data) { console.log('Your public IP address is: ' + data.ip); };
上面代码通过动态添加<script></script>
元素,向服务器example.com发出请求。注意,该请求的查询字符串有一个callback参数,用来指定回调函数的名字,这对于JSONP是必需的。
服务器收到这个请求以后,会将数据放在回调函数的参数位置返回。
foo({ "ip": "8.8.8.8" });
由于<script></script>
元素请求的脚本,直接作为代码运行。这时,只要浏览器定义了foo函数,该函数就会立即调用。作为参数的JSON数据被视为JavaScript对象,而不是字符串,因此避免了使用JSON.parse的步骤。
3.2 WebSocket
WebSocket是一种通信协议,使用ws://(非加密)和wss://(加密)作为协议前缀。该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信。
下面是一个例子,浏览器发出的WebSocket请求的头信息(摘自维基百科)。
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: http://example.com
上面代码中,有一个字段是Origin,表示该请求的请求源(origin),即发自哪个域名。
正是因为有了Origin这个字段,所以WebSocket才没有实行同源政策。因为服务器可以根据这个字段,判断是否许可本次通信。如果该域名在白名单内,服务器就会做出如下回应。
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol: chat
3.3 CORS
CORS は Cross-Origin Resource Sharing の略称です。これは W3C 標準であり、クロスオリジン AJAX リクエストの基本的なソリューションです。 GET リクエストのみを送信できる JSONP と比較して、CORS ではあらゆる種類のリクエストが許可されます。
[関連する推奨事項: JavaScript 学習チュートリアル]
以上がJavaScriptの同一生成元ポリシーとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

HTMLとReactは、JSXを介してシームレスに統合して、効率的なユーザーインターフェイスを構築できます。 1)JSXを使用してHTML要素を埋め込み、2)仮想DOMを使用してレンダリングパフォーマンスを最適化し、3)コンポーネントを通じてHTML構造を管理およびレンダリングします。この統合方法は直感的であるだけでなく、アプリケーションのパフォーマンスを向上させます。

React Reactは、状態および小道具を介してデータを効率的にレンダリングし、合成イベントシステムを介してユーザーイベントを処理します。 1)Counterの例など、UseStateを使用して状態を管理します。 2)イベント処理は、ボタンクリックなどのJSXに関数を追加することにより実装されます。 3)トドリストコンポーネントなどのリストをレンダリングするには、重要な属性が必要です。 4)フォーム処理の場合、FormコンポーネントなどのuseStateおよびe.preventdefault()。

Reactは、HTTP要求を介してサーバーと対話し、データを取得、送信、更新、削除します。 1)ユーザー操作はイベントをトリガーします。2)HTTP要求を開始する、3)サーバーの応答をプロセス、4)コンポーネントのステータスと再レンダリングを更新します。

Reactは、コンポーネント開発と仮想DOMを通じて効率を向上させるユーザーインターフェイスを構築するためのJavaScriptライブラリです。 1。コンポーネントとJSX:JSX構文を使用してコンポーネントを定義して、コードの直感性と品質を高めます。 2。仮想DOMおよびレンダリング:仮想DOMおよびDIFFアルゴリズムを介してレンダリングパフォーマンスを最適化します。 3。状態管理とフック:UseStateやUseefectなどのフックは、状態管理と副作用の取り扱いを簡素化します。 4。使用例:基本形式から高度なグローバルな州管理まで、Contextapiを使用します。 5.一般的なエラーとデバッグ:不適切な状態管理とコンポーネントの更新の問題を避け、ReactDevtoolsを使用してデバッグします。 6。パフォーマンスの最適化と最適性

ReactisaFrontendLibrary、focusedonbuildinguserinterfaces.itmanagesUistateandupdateSeSefiedlyusingingingingualdod、およびinteractswithbackendservicesviaapisfordatahandling、butdoesnotprocessorstoredatoredaitaits

ReactをHTMLに組み込み、従来のHTMLページを強化または完全に書き換えることができます。 1)Reactを使用するための基本的な手順には、HTMLにルートDIVを追加し、ReactDom.Render()を介してReactコンポーネントをレンダリングすることが含まれます。 2)より高度なアプリケーションには、UseStateを使用して状態を管理し、カウンターやTo Doリストなどの複雑なUI相互作用を実装することが含まれます。 3)最適化とベストプラクティスには、コードセグメンテーション、怠zyな読み込み、React.memoとusememoを使用してパフォーマンスを向上させることが含まれます。これらの方法を通じて、開発者はReactの力を活用して、動的で応答性の高いユーザーインターフェイスを構築できます。

Reactは、最新のフロントエンドアプリケーションを構築するためのJavaScriptライブラリです。 1.パフォーマンスを最適化するために、コンポーネントおよび仮想DOMを使用します。 2。コンポーネントJSXを使用して、データを管理するために定義、状態、および属性を定義します。 3.フックはライフサイクル管理を簡素化します。 4. Contextapiを使用して、グローバルステータスを管理します。 5.一般的なエラーには、デバッグステータスの更新とライフサイクルが必要です。 6。最適化手法には、メモ、コード分割、仮想スクロールが含まれます。

Reactの未来は、究極のコンポーネント開発、パフォーマンスの最適化、および他のテクノロジースタックとの深い統合に焦点を当てます。 1)Reactは、コンポーネントの作成と管理をさらに簡素化し、究極のコンポーネント開発を促進します。 2)特に大規模なアプリケーションでは、パフォーマンスの最適化が焦点になります。 3)Reactは、開発エクスペリエンスを改善するために、GraphQLやTypeScriptなどのテクノロジーと深く統合されます。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

Dreamweaver Mac版
ビジュアル Web 開発ツール

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、
