Měřiče návštěvnosti jak Google Analytics - to jsou obrázky, případně iframy. Někdy se hodí mít možnost zobrazit (i soukromá) data z cizího webu na stránce, ale tak, že na ně nemůže - např. tlačítka "Like" s fotkou a statistikou z Facebooku atd.. Tady SOP dává smysl - je to prostě jenom kus cizího obsahu, jako by byl v jiném okně, ale zobrazí se pomocí iframu přímo do stránky. Podobně obrázky - je to kus cizího obsahu (může být i soukromý), který stránka může svévolně načíst, ale JS na stránce ho nepřečte (aspoň doufám, SOP by mělo platit logicky i pro obrázky když platí pro iframy - nezkoušel jsem; kdyby ne, byla by to bezpečnostní díra).
SOP jsem kritizoval u jiné věci: XHR (ajax) - tam SOP podle mě vůbec nedává smysl a přesto tam je. Proč nedává smysl: XHR načítá data ze serveru za účelem práce s nimi v JS - to znamená, že nedává smysl XHR použít stejným způsobem, jako iframy a obrázky (tj. načtení cizích, i soukromých dat, bez možnosti přístupu k nim z JS na stránce) - prostě proto, že k čemukoliv načtenému přes XHR javascript prostě bude mít přístup. To znamená, že nesmí jít pomocí XHR načíst soukromá data uživatele z cizího serveru. To je velice důležitá věc a naprosto s ní souhlasím. Taky že to teď nejde (kvůli uplatňování SOP na XHR). Ale nejde ani prostě načíst nějaká data z cizího serveru - a to je kámen úrazu. To by mělo jít, není důvod, aby to nešlo. Takže navrhuju:
Ať XHR funguje i pro cizí servery (jakékoliv), jen s tím rozdílem, že cizímu serveru prohlížeč nepošle automaticky cookies a autentizaci. To by znamenalo, že cizí server nedostane žádné informace identifikující uživatele a JS by vystupoval jako nezávislý uživatel. JS by mohl do XHR požaddavku zahrnout libovolné cookies a autentizaci, ale aby poslal ty uživatelovy, na to by mu je musel uživatel explicitně dát*.
*) Ideální by na takové předání bylo, aby ho prohlížeč nějak podporoval (např. "předat skriptu na stránce X má soukromá data uložená na tomto počítači stránkou Y?" - "ano, předat má soukromá data"/"zrušit"; případně něco ještě polopatičtějšího). Na co se předání hodí: např. pokud chci povolit webové aplikaci vrtat se mi v mém účtu v jiné webové aplikaci - např. import obrázků z fotoalba na jednom serveru do jiného fotoalba na jiném serveru, které z toho prvního podporuje import; nebo nějaká nastavení, zálohování - možnosti by byly široké (stejné jako u běžných desktopových aplikací).
Napadá mě jediný potenciální bezpečnostní problém, pokud by se možnosti XHR takhle rozšířily: pokud u nějakého skriptu je URL proměnná náchylná na XSS a jedině SOP brání tomu, aby se provedl požadavek na podvrženou cizí URL. K tomu se dá zaujmout dva postoje: buď říct, že taková "featura" prostě v JS aplikaci být nemá, nebo se držet striktně toho, že změna nesmí na žádné už existující stránce vytvořit bezpečnostní díru.
Jsem radši spíš pro to druhou, striktní variantu. V tom případě musí se možnost použití XHR na cizí server nějak explicitně zapnout. IMHO nejlepší by byl nějaký nový parametr nebo atribut při vytváření XHR. Protože by to ale změnilo rozhraní XHR, vznikne tak vlastně mírně odlišná třída (v JS teda vlastně prototyp?) XHR. Mohl by pod nějakým novým názvem existovat společně s tím starým, který by se stal "deprecated".
Vidíte v tom nějaké problémy? Pokud jsem někde v těch úvahách neudělal chybu, tak je to IMHO pěkné (a potenciálně velice užitečné) rozšíření funkčnosti XHR bez jakéhokoliv ohrožení bezpečnosti nových i stávajících aplikací. Hodně se mi ten nápad líbí, chtěl bych to navrhnout přímo zodpovědným lidem ve W3C. Nevím, jak moc si do toho nechají kecat, ale tohle by se jim mohlo líbit - nahrazení SOP u XHR něčím lepším a podobně jednoduchým, žádné nevýhody. Pokud k tomu máte připomínky nebo nápady, tak napište, klidně i na mail (petrmej@gmail.com).
Ještě bych se vrátil k těm iframům a obrázkům: to, že může cizí server sledovat uživatele všech stránek, na kterých se z něj načítá nějaký iframe a může ty uživatele mezi jednotlivými nesouvisejícími weby identifikovat, se ne každému líbí. Uživatel nic netuší a je to v podstatě tolerovaná bezpečnostní díra v návrhu HTML. IMHO by bylo dobře, kdyby se tenhle koncept (SOP) zavrhl. Mohlo by se i u obrázků a iframů používat to, co navrhuju u XHR: těmhle prvkům, pokud jsou na cizím serveru, neposílat automaticky identifikaci uživatele (cookies, autentizace).
Měřáky návštěvnosti a reklamní systémy by pak musely sledování uživatelů řešit jinak než že můžou skrytě sledovat uživatele napříč neomezeným množstvím webů. Jako možnost mě napadá přesunout identifikaci na klientský web - ten bude uchovávat cookie a posílat její hodnotu v GET parametru URL obrázku/iframu z měřicího webu. To jde řešit javascriptem ve vloženém kódu - nic složitého. Tím by se sledoval uživatelv rámci jednoho webu. Případně množiny webů, které by se na tom vzájemně dohodly (sdílely by nějak identifikační cookie - např. novým XHR). Obojí (nastavování, sdílení cookies) by šlo udělat u klientského webu i čistě na straně serveru.
Takže výsledkem by bylo, že klientský web má pod kontrolou, s kým (a jestli vůbec) identifikaci uživatele sdílí. Mohlo by to být v podmínkách např. reklamního systému, takže by se vlastně moc nezměnilo. Rozdíl by byl jenom v tom, že autor klientského webu by o tom rozhodoval. Uznávám, pro uživatele asi žádný přínos. Takže tady dává smysl zůstat u starého SOP. Narozdíl od XHR.