ÐгÑаниÑение «Same Origin» («ÑÐ¾Ñ Ð¶Ðµ иÑÑоÑник») огÑаниÑÐ¸Ð²Ð°ÐµÑ Ð´Ð¾ÑÑÑп окон и ÑÑеймов дÑÑг к дÑÑгÑ, а Ñакже влиÑÐµÑ Ð½Ð° AJAX-запÑоÑÑ Ðº ÑеÑвеÑÑ.
ÐÑиÑина, по коÑоÑой оно ÑÑÑеÑÑвÑÐµÑ â безопаÑноÑÑÑ. ÐÑли еÑÑÑ Ð´Ð²Ð° окна, в одном из коÑоÑÑÑ
vasya-pupkin.com, а в дÑÑгом gmail.com, Ñо Ð¼Ñ Ð±Ñ Ð½Ðµ Ñ
оÑели, ÑÑÐ¾Ð±Ñ ÑкÑÐ¸Ð¿Ñ Ð¸Ð· пеÑвого мог ÑиÑаÑÑ Ð½Ð°ÑÑ Ð¿Ð¾ÑÑÑ.
Сама конÑепÑÐ¸Ñ Ð¿ÑоÑÑа, но еÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ важнÑÑ Ð¸ÑклÑÑений и оÑобенноÑÑей, коÑоÑÑе нÑжно знаÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ ÑÑого пÑавила.
ÐонÑепÑÐ¸Ñ Same Origin
Ðва URL ÑÑиÑаÑÑÑÑ Ð¸Ð¼ÐµÑÑим один иÑÑоÑник («same origin»), еÑли Ñ Ð½Ð¸Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñй пÑоÑокол, домен и поÑÑ.
ÐÑи URL имеÑÑ Ð¾Ð´Ð¸Ð½ иÑÑоÑник:
http://site.comhttp://site.com/http://site.com/my/page.html
Ð Ð²Ð¾Ñ ÑÑи â вÑе из дÑÑÐ³Ð¸Ñ Ð¸ÑÑоÑников:
- http://www.site.com (дÑÑгой домен)
- http://site.org (дÑÑгой домен)
- https://site.com (дÑÑгой пÑоÑокол)
- http://site.com:8080 (дÑÑгой поÑÑ)
СÑÑеÑÑвÑÐµÑ ÑÑд иÑклÑÑений, позволÑÑÑÐ¸Ñ -Ñаки окнам Ñ ÑазнÑÑ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð² обмениваÑÑÑÑ Ð¸Ð½ÑоÑмаÑией, но пÑÑмой вÑзов меÑодов дÑÑг дÑÑга и ÑÑение ÑвойÑÑв запÑеÑенÑ.
РдейÑÑвии
ÐÑли одно окно попÑÑаеÑÑÑ Ð¾Ð±ÑаÑиÑÑÑÑ Ðº дÑÑгомÑ, Ñо бÑаÑÐ·ÐµÑ Ð¿ÑовеÑиÑ, из одного ли они иÑÑоÑника. ÐÑли Ð½ÐµÑ â доÑÑÑп бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑеÑÑн.
ÐапÑимеÑ:
<iframe src="https://example.com"></iframe>
<script>
var iframe = document.body.children[0];
iframe.onload = function() {
try {
alert( iframe.contentWindow.document );
} catch (e) {
alert( "ÐÑибка: " + e.message );
}
}
</script>
ÐÑÐ¸Ð¼ÐµÑ Ð²ÑÑе вÑÐ²ÐµÐ´ÐµÑ Ð¾ÑибкÑ.
ÐÑклÑÑение: запиÑÑ Ð² location
Ðкна могÑÑ Ð¼ÐµÐ½ÑÑÑ location дÑÑг дÑÑга, даже еÑли они из ÑазнÑÑ
иÑÑоÑников.
ÐÑиÑÑм ÑиÑаÑÑ ÑвойÑÑва location нелÑзÑ, одно окно не Ð¸Ð¼ÐµÐµÑ Ð¿Ñаво знаÑÑ, на каком URL полÑзоваÑÐµÐ»Ñ Ð² дÑÑгом. Ð Ð²Ð¾Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð±ÑаÑзеÑÑ ÑÑиÑаÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñной.
ÐапÑимеÑ, оÑкÑÑв на javascript.ru iframe Ñ http://example.com, из ÑÑого иÑÑейма нелÑÐ·Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑоÑиÑаÑÑ URL, а Ð²Ð¾Ñ Ð¿Ð¾Ð¼ÐµÐ½ÑÑÑ ÐµÐ³Ð¾ â запÑоÑÑо:
<iframe src="https://example.com"></iframe>
<script>
var iframe = document.body.children[0];
iframe.onload = function() {
try {
// не ÑÑабоÑÐ°ÐµÑ (ÑÑение)
alert( iframe.contentWindow.location.href );
} catch (e) {
alert( "ÐÑибка пÑи ÑÑении: " + e.message );
}
// ÑÑабоÑÐ°ÐµÑ (запиÑÑ)
iframe.contentWindow.location.href = 'https://wikipedia.org';
iframe.onload = null;
}
</script>
ÐÑли запÑÑÑиÑÑ ÐºÐ¾Ð´ вÑÑе, Ñо окно ÑнаÑала загÑÑÐ·Ð¸Ñ example.com, а поÑом бÑÐ´ÐµÑ Ð¿ÐµÑенапÑавлено на wikipedia.org.
ÐÑклÑÑение: поддомен 3-го ÑÑовнÑ
ÐÑÑ Ð¾Ð´Ð½Ð¾ важное иÑклÑÑение каÑаеÑÑÑ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð² ÑÑеÑÑего ÑÑовнÑ.
ÐÑли неÑколÑко окон имеÑÑ Ð¾Ð±Ñий домен вÑоÑого ÑÑовнÑ, к пÑимеÑÑ john.site.com, peter.site.com, site.com, и пÑиÑваиваÑÑ Ð² document.domain Ñвой обÑий поддомен 2-го ÑÑÐ¾Ð²Ð½Ñ site.com, Ñо вÑе огÑаниÑÐµÐ½Ð¸Ñ ÑнимаÑÑÑÑ.
То еÑÑÑ, на вÑÐµÑ ÑÑÐ¸Ñ ÑайÑÐ°Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ ÐºÐ¾Ð´:
document.domain = 'site.com';
Тогда Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸ не бÑÐ´ÐµÑ ÐºÑоÑÑ-доменнÑÑ Ð¾Ð³ÑаниÑений.
ÐбÑаÑим внимание: ÑвойÑÑво document.domain должно бÑÑÑ Ð¿ÑиÑвоено на вÑеÑ
окнаÑ
, ÑÑаÑÑвÑÑÑиÑ
в коммÑникаÑии. ÐÑглÑÐ´Ð¸Ñ Ð°Ð±ÑÑÑдно, но даже на докÑменÑе Ñ site.com нÑжно вÑзваÑÑ: document.domain="site.com". ÐнаÑе не бÑÐ´ÐµÑ ÑабоÑаÑÑ.
Таким обÑазом ÑазнÑе подÑайÑÑ Ð² ÑÐ°Ð¼ÐºÐ°Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ обÑего пÑоекÑа могÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑвоваÑÑ Ð±ÐµÐ· огÑаниÑений.
ÐÑклÑÑÐµÐ½Ð¸Ñ Ð² IE
РбÑаÑзеÑе Internet Explorer еÑÑÑ Ð´Ð²Ð° ÑÐ²Ð¾Ð¸Ñ , дополниÑелÑнÑÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð¸Ð· Same Origin Policy.
-
ÐоÑÑ Ð½Ðµ Ð²Ñ Ð¾Ð´Ð¸Ñ Ð² понÑÑие «иÑÑоÑник» (origin).
ÐÑо ознаÑаеÑ, ÑÑо окно Ñ
http://site.comÐ¼Ð¾Ð¶ÐµÑ Ñвободно обÑаÑÑÑÑ Ñhttp://site.com:8080.ÐÑо иногда иÑполÑзÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÑÐµÐ½Ð¸Ñ ÑеÑвеÑов, иÑполÑзÑÑÑÐ¸Ñ Ð¾Ð´Ð¸Ð½ IP-адÑеÑ. Ðо допÑÑÑимо Ñакое ÑолÑко в IE.
-
ÐÑли ÑÐ°Ð¹Ñ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² зоне «ÐадÑжнÑе ÑзлÑ», Ñо в Internet Explorer огÑаниÑÐµÐ½Ð¸Ñ Ðº Ð½ÐµÐ¼Ñ Ð½Ðµ пÑименÑÑÑÑÑ.
ÐÑи ÑÑом подÑазÑмеваеÑÑÑ, ÑÑо Ð´Ð»Ñ ÑÑой Ð·Ð¾Ð½Ñ Ð² паÑамеÑÑÐ°Ñ Â«ÐезопаÑноÑÑÑ» вклÑÑена опÑÐ¸Ñ Â«ÐоÑÑÑп к иÑÑоÑникам даннÑÑ Ð·Ð° пÑеделами домена».
ÐÑого
ÐгÑаниÑение «одного иÑÑоÑника» запÑеÑÐ°ÐµÑ Ð¾ÐºÐ½Ð°Ð¼ и ÑÑеймам Ñ ÑазнÑÑ Ð¸ÑÑоÑников вÑзÑваÑÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð´ÑÑг дÑÑга и ÑиÑаÑÑ Ð´Ð°Ð½Ð½Ñе дÑÑг из дÑÑга.
ÐÑи ÑÑом «из одного иÑÑоÑника» ознаÑÐ°ÐµÑ Â«ÑовпадаÑÑ Ð¿ÑоÑокол, домен и поÑÑ».
У ÑÑого Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð° ÑÑд ÑÑÑеÑÑвеннÑÑ Ð¸ÑклÑÑений:
- СвойÑÑва
window.location.*нелÑÐ·Ñ ÑиÑаÑÑ, но можно менÑÑÑ. - ÐÐ¾Ð¼ÐµÐ½Ñ ÑÑеÑÑего ÑÑÐ¾Ð²Ð½Ñ Ñ Ð¾Ð±Ñим наддоменом могÑÑ Ð¿Ð¾Ð¼ÐµÐ½ÑÑÑ
document.domainна Ð¸Ñ Ð¾Ð±Ñий домен вÑоÑого ÑÑовнÑ, и Ñогда они ÑмогÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑвоваÑÑ Ð±ÐµÐ· огÑаниÑений. - IE не вклÑÑÐ°ÐµÑ Ð¿Ð¾ÑÑ Ð² понÑÑие иÑÑоÑника. ÐÑоме Ñого, он позволÑÐµÑ ÑнÑÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑеÑного ÑайÑа вклÑÑением в довеÑеннÑÑ Ð·Ð¾Ð½Ñ.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)