SlideShare a Scribd company logo
Cross-Site Ajax Challenges and Techniques for Building Rich Web 2.0 Mashups Joseph Smarr Plaxo, Inc. [email_address]
The promise of mashups Create new experiences by combining  components from different authors Each site focuses on what it does best Can wire up components in a novel way Google maps + Craigslist = HousingMaps Rich interaction often requires talking  back and forth between components House’s address    lat / long    map it
Talking between web components Normal situation : all on the same web site Communicate across frames / iframes / popups Talk to server using AJAX (XMLHttpRequest) Problem : doesn’t work when components  live at different domains (mashup situation) Same-origin   policy Can include JavaScript / images from another domain Can’t talk to frame / iframe popup or send an XHR Prevents snooping on secret web pages (e.g. intranet)
So, how do mashups communicate? CAN  include image / JavaScript / CSS from Domain B   CAN  send XMLHttpRequest to Domain A   CAN  talk to other frames / iframes / popups on Domain A  CAN'T  send XMLHttpRequest to Domain B  CAN'T  talk to other frames / iframes / popups on Domain B  CAN  talk to other pages  on Domain A   CAN’T  talk to any page on Domain A  Domain B XML / Web Page XHR Image CSS JavaScript
How do mashups communicate? Often, they don’t (Google maps 1.0) Single JavaScript    all processing done locally Plotting lat/long or fetching image tiles is deterministic Can’t get any additional data (e.g. geo-coding) Server-side proxy (HousingMaps, Flickr) Talk to your server    it talks to the foreign site Problem: bottleneck; barrier to mass deployment
Server-side proxy Web Page Domain A Server Domain A Server Domain B
How do mashups communicate? Often, they don’t (Google maps 1.0) Single JavaScript    all processing done locally Plotting lat/long or fetching image tiles is deterministic Can’t get any additional data (e.g. geo-coding) Server-side proxy (HousingMaps, Flickr) Talk to your server    it talks to the foreign site Problem: bottleneck; barrier to mass deployment Use flash for cross-domain communication Can use crossdomain.xml to allow foreign sites Yahoo maps uses this to do geo-coding
Flash proxy Web Page Domain A Server Domain B Flash crossdomain.xml
How do mashups communicate? JSON-P (Script injection + callback) Dynamically load JavaScript file with data Use DHTML to inject a  <script>  tag in the document Data is returned in JSON (JavaScript data format) Clever trick: specify callback function on URL foreign-site.com/json-api.js? callback=myFunc Loads  myFunc ({ data: “hello” });     round-trip! Works well in practice, but some drawbacks Limited control vs. XHR (just loads or doesn’t) API provider can return malicious code (e.g. steal cookies)
JSON-P Web Page Domain A Server Domain B <script> JSON + callback
Using JSON-P in OO web apps Problem : callback function has to be global Complex code maintains state / instances Would like to handle callback with instance function on instantiated object Solution : bind the callback dynamically Create a globally-unique function name Usually global prefix + auto-incremented counter Use a closure to call your function in object-scope Send the global function name as callback     it calls your scoped function
Dynamically binding a global callback var cbName = 'cb' + JSON.callbackCounter++; var cbFunc = function(jsonData) { myFunc .call( myObj , jsonData); // call bound callback }; JSON.callbacks[cbName] = cbFunc; var globalCallbackName = ‘JSON.callbacks.’ + cbName // url: '/json-api.js?callback=' + globalCallbackName; Used by dojo (ScriptSrcIO), Google Maps 2.5, Plaxo, etc.
Summary of cross-site techniques so far No cross-site communication Include partner’s JS file once (can’t talk again) Server-side proxy Talk on the backend (bottleneck, barrier to adoption) Flash proxy Talk through cross-domain flash (requires flash) JSON-P Talk through script-injection with callback  (less control, partner could be malicious)
What about updating another web page? Proxies / JSON-P let you access foreign data But still can’t touch a foreign frame/iframe/popup Many potential mashups would like to interact with existing web pages Auto-fill a form with your contact info Highlight relevant search results / text snippets How can two sites that want to cooperate get around the  same-origin  policy?
 
What does the partner site have to do? Add the  button to your page <a onclick=&quot; showPlaxoABChooser('textarea', '/cb.html') ; return false&quot; href=&quot;#&quot;> <img src=&quot;http://www.plaxo.com/images/abc/buttons /add_button.gif&quot; alt=&quot;Add from my address book&quot; /></a> Specify the ID of your e-mail <textarea> Specify the location of your hidden callback page Add a small callback page on your site <html><head><script type=&quot;text/javascript&quot; src=&quot;https://www.plaxo.com/ab_chooser/abc_comm.jsdyn&quot;> </script></head><body></body></html> Full instructions and demo:  http:// www.plaxo.com/api
What does Plaxo have to do? Remember: Plaxo filled in a textarea on zazzle! Need to get around  same-origin  policy Without server-side proxy (JS/HTML only) JSON-P won’t solve this problem Widget popup is hosted by Plaxo and goes thru several steps Zazzle doesn’t know when to request the contact data Solution:  “The JavaScript Wormhole” Add hidden callback page on zazzle that includes Plaxo script Plaxo popup loads callback in an iframe when done Script is dynamically generated, and includes selected data IFrame is also on zazzle (and has the data), so it can tell parent.opener to fill in the textfield
zazzle.com/email_this plaxo.com/ab_chooser plaxo.com/ab_chooser Iframe: zazzle.com/cb.html    Script: plaxo.com/ab_chooser/abc_comm.jsdyn
Who’s using the Plaxo widget? See more at  http://www.plaxo.com/api/gallery Using the widget? Let us know!
Generalizing the JavaScript Wormhole Site has a generic callback page to give you access Site tells you the location of their callback page Callback page loads your domain’s JavaScript JavaScript is dynamically generated to include your data Can pass script url with query args to callback page /cb.html? http://foreign-site.com/json-api.js?name=val Access query string on cb page with  location.search Site can restrict callback page to trusted hosts Only load script if it’s on a trusted domain Could further restrict to certain URL prefixes, etc.
<html><head><title>Generalized JavaScript Wormhole</title> <script type=&quot;text/javascript&quot;> var trustedDomains = [ &quot;http://www.plaxo.com/api/&quot;, &quot;http://www.google.com/&quot; ]; function isTrustedDomain(url) { for (var i = 0; i < trustedDomains.length; i++) if (url.indexOf(trustedDomains[i]) == 0)  return true; return false; } function doWormhole() { var url = location.search.substr(1); // chop off ? if (isTrustedDomain(url)) { var script = document.createElement('script'); script.type = &quot;text/javascript&quot;; script.src = url; document.getElementsByTagName(&quot;head&quot;)[0].appendChild(script); } else alert(&quot;ignoring untrusted url: &quot; + url); } </script></head><body onload=&quot;doWormhole()&quot;></body></html>
Where do we go from here? Ajax is a “hack” on top of an old platform The platform can evolve
Where do we go from here? Ajax is a “hack” on top of an old platform The platform is evolving
Where do we go from here? Ajax is a “hack” on top of an old platform The platform is evolving What platform do we want to build?
Should we open cross-domain XHR? After all, we can already include foreign JavaScript, image, and CSS files So why not XML too? (“just another resource file”) HTML looks like XML (esp. XHTML) Hard to make sure you  really  meant to serve that page as XML data (cf. js / img / css) Personal / private info more often in XML / HTML But increasingly a problem with JS too (JSON) Cookies / creds sent with XHR request Can’t easily distinguish direct vs. XHR access
Trust relationships between sites Random site accessing this file vs. trusted partner Flash does this with crossdomain.xml Web services do this with certs / IP whitelists JavaScript wormhole does it (sort of) Should a trust relationship exist for mashups? Want to minimize barriers to adoption / innovation When sharing user info, should have prior agreement? How formal / technical should this trust be?
Restricting access to unauthorized info Restrict XHR to same “internet zone” So public site can’t access intranet page Don’t send  any  cookies / credentials via XHR Practically restricts cross-site comm. to fully public info Could still send auth info on URL But now other site has it Give other site limited-access token? White-list authorized sites with cross-domain file Return special response headers for public pages Legacy problem for existing content
Proposals for better cross-site tools  ContextAgnosticXmlHttpRequest  (Chris Holland) Alternative to normal XmlHttpRequest for cross-site Don’t send/receive any cookie or HTTP auth info Server must specify X-Allow-Foreign-Hosts in response JSONRequest  (Douglas Crockford) New browser object for cross-site JSON (like XHR) Allows GET / POST / cancel of JSON request / response No cookies / auth info sent or received Requires special headers in request / response
In conclusion… Cross-site communication is tricky but important Key enabling technology for building rich mashups Raises legitimate security issues that can’t be ignored Today: Use server-side proxy or JSON-P Proxy introduces bottleneck, but provides full access JSON-P is more scalable, but limited to JSON APIs JavaScript Wormhole lets you touch foreign pages Keep the discussion of better tools / protocols going! This problem is here to stay Browser developers are listening!
For further reading… Cross-site limitations http://getahead.ltd.uk/ajax/cross-domain-xhr http:// msdn.microsoft.com/library/default.asp?url =/workshop/author/ om/xframe_scripting_security.asp FlashXMLHttpRequest http:// blog.monstuff.com/FlashXMLHttpRequest ContextAgnosticXMLHttpRequest http://chrisholland.blogspot.com/2005/03/contextagnosticxmlhttprequest-informal.html JSONRequest http:// json.org/JSONRequest.html

More Related Content

PPT
Joomla security nuggets
guestbd1cdca
 
PDF
Opening up the Social Web - Standards that are bridging the Islands
Bastian Hofmann
 
PPT
Pragmatics of Declarative Ajax
davejohnson
 
PPTX
RESTful design
Robert MacLean
 
PDF
SearchLove San Diego 2018 | Tom Anthony | An Introduction to HTTP/2 & Service...
Distilled
 
PDF
HTML5 Introduction
dynamis
 
KEY
Intro to Ruby
Brian Hogan
 
PPTX
Css, xhtml, javascript
Trần Khải Hoàng
 
Joomla security nuggets
guestbd1cdca
 
Opening up the Social Web - Standards that are bridging the Islands
Bastian Hofmann
 
Pragmatics of Declarative Ajax
davejohnson
 
RESTful design
Robert MacLean
 
SearchLove San Diego 2018 | Tom Anthony | An Introduction to HTTP/2 & Service...
Distilled
 
HTML5 Introduction
dynamis
 
Intro to Ruby
Brian Hogan
 
Css, xhtml, javascript
Trần Khải Hoàng
 

What's hot (20)

PDF
HTTP/2 BrightonSEO 2018
Tom Anthony
 
ODP
A Holistic View of Website Performance
Rene Churchill
 
PPTX
The internet for SEOs by Roxana Stingu
Roxana Stingu
 
PPTX
Internet protocalls & WCF/DReAM
Woody Pewitt
 
PDF
Keypoints html5
dynamis
 
PPT
Advanced Json
guestfd7d7c
 
KEY
Building A Gem From Scratch
Brian Hogan
 
PDF
HTML5 & Friends
Remy Sharp
 
DOC
QuickConnect
Annu G
 
PDF
HTML5 Semantics, Accessibility & Forms [Carsonified HTML5 Online Conference]
Aaron Gustafson
 
KEY
Story-driven Testing
Brian Hogan
 
PDF
Html 5 in a big nutshell
Lennart Schoors
 
ODP
HTML5
Hatem Mahmoud
 
PDF
HTML5: Smart Markup for Smarter Websites [Future of Web Apps, Las Vegas 2011]
Aaron Gustafson
 
PPTX
.htaccess for SEOs - A presentation by Roxana Stingu
Roxana Stingu
 
PDF
Command Line Hacks For SEO - Brighton April 2018 - Tom Pool
Tom Pool
 
PDF
HTML5 Essentials
Marc Grabanski
 
PDF
HTTP Basics Demo
InMobi Technology
 
PPTX
Real-time Ruby for the Real-time Web
Ilya Grigorik
 
PDF
Plone.restapi - a bridge to the modern web
Timo Stollenwerk
 
HTTP/2 BrightonSEO 2018
Tom Anthony
 
A Holistic View of Website Performance
Rene Churchill
 
The internet for SEOs by Roxana Stingu
Roxana Stingu
 
Internet protocalls & WCF/DReAM
Woody Pewitt
 
Keypoints html5
dynamis
 
Advanced Json
guestfd7d7c
 
Building A Gem From Scratch
Brian Hogan
 
HTML5 & Friends
Remy Sharp
 
QuickConnect
Annu G
 
HTML5 Semantics, Accessibility & Forms [Carsonified HTML5 Online Conference]
Aaron Gustafson
 
Story-driven Testing
Brian Hogan
 
Html 5 in a big nutshell
Lennart Schoors
 
HTML5: Smart Markup for Smarter Websites [Future of Web Apps, Las Vegas 2011]
Aaron Gustafson
 
.htaccess for SEOs - A presentation by Roxana Stingu
Roxana Stingu
 
Command Line Hacks For SEO - Brighton April 2018 - Tom Pool
Tom Pool
 
HTML5 Essentials
Marc Grabanski
 
HTTP Basics Demo
InMobi Technology
 
Real-time Ruby for the Real-time Web
Ilya Grigorik
 
Plone.restapi - a bridge to the modern web
Timo Stollenwerk
 
Ad

Viewers also liked (20)

PDF
07 ZamyšLení Velké MyšLenky
jedlickak07
 
PPT
Transforming Your Business in the "Cloud" with Callidus Software and Salesfor...
Callidus Software
 
PPT
หมวก6ใบ
Saksiri Namthip
 
PPT
La mappa della cultura immateriale
jexxon
 
PPS
Arte Con Solo Una Hoja De Papel
manita
 
PPT
25
beowulf
 
PPT
Elluminate Wiki Intro 29749
Steve J Franz
 
PPT
Comete
giusnico
 
PPTX
GeoGraphics
Alan Doherty
 
PPS
Unfolding Of A Vision
guest4e9258
 
PPTX
Land and Light
Alan Doherty
 
PPT
Milano Smart City
jexxon
 
PPT
Milieu
guestd38080
 
PPT
Request for a decentralized social network
Justin Kistner
 
PPT
Las Tendas-Madrid
guest149d7a
 
PDF
Mexico City - Cuidad de Mexico
Alan Doherty
 
PDF
Gp Parki Narodowe
beowulf
 
07 ZamyšLení Velké MyšLenky
jedlickak07
 
Transforming Your Business in the "Cloud" with Callidus Software and Salesfor...
Callidus Software
 
หมวก6ใบ
Saksiri Namthip
 
La mappa della cultura immateriale
jexxon
 
Arte Con Solo Una Hoja De Papel
manita
 
Elluminate Wiki Intro 29749
Steve J Franz
 
Comete
giusnico
 
GeoGraphics
Alan Doherty
 
Unfolding Of A Vision
guest4e9258
 
Land and Light
Alan Doherty
 
Milano Smart City
jexxon
 
Milieu
guestd38080
 
Request for a decentralized social network
Justin Kistner
 
Las Tendas-Madrid
guest149d7a
 
Mexico City - Cuidad de Mexico
Alan Doherty
 
Gp Parki Narodowe
beowulf
 
Ad

Similar to Joseph-Smarr-Plaxo-OSCON-2006 (20)

PDF
Javascript cross domain communication
ChenKuo Chen
 
PPTX
Secure web messaging in HTML5
Krishna T
 
PPT
Mashup
Naveen P.N
 
PDF
Ajax tutorial
Kat Roque
 
PDF
Going Beyond Cross Domain Boundaries (jQuery Bulgaria)
Ivo Andreev
 
PPT
Breaking The Cross Domain Barrier
Alex Sexton
 
PDF
IE 8 et les standards du Web - Chris Wilson - Paris Web 2008
Association Paris-Web
 
PPT
DPC 2007 My First Mashup (Cal Evans)
dpc
 
PPT
Ajax
Rathan Raj
 
PDF
feb19-webservices3
tutorialsruby
 
PDF
feb19-webservices3
tutorialsruby
 
KEY
Ajax - a quick introduction
Stefan Pettersson
 
PDF
08 ajax
Ynon Perek
 
PPTX
Stay Out Please
efim13
 
PDF
How to make Ajax work for you
Simon Willison
 
PPTX
Browser Internals-Same Origin Policy
Krishna T
 
PPT
Developing Profitable APIs - John Fraser - Platform A
auexpo Conference
 
PDF
The Same-Origin Policy
Fabrizio Farinacci
 
PPTX
Pros and Cons of developing a Thick Clientside App
Ravi Teja
 
PPTX
Mobile web & mobile app communication methods
Girish Manwani
 
Javascript cross domain communication
ChenKuo Chen
 
Secure web messaging in HTML5
Krishna T
 
Mashup
Naveen P.N
 
Ajax tutorial
Kat Roque
 
Going Beyond Cross Domain Boundaries (jQuery Bulgaria)
Ivo Andreev
 
Breaking The Cross Domain Barrier
Alex Sexton
 
IE 8 et les standards du Web - Chris Wilson - Paris Web 2008
Association Paris-Web
 
DPC 2007 My First Mashup (Cal Evans)
dpc
 
feb19-webservices3
tutorialsruby
 
feb19-webservices3
tutorialsruby
 
Ajax - a quick introduction
Stefan Pettersson
 
08 ajax
Ynon Perek
 
Stay Out Please
efim13
 
How to make Ajax work for you
Simon Willison
 
Browser Internals-Same Origin Policy
Krishna T
 
Developing Profitable APIs - John Fraser - Platform A
auexpo Conference
 
The Same-Origin Policy
Fabrizio Farinacci
 
Pros and Cons of developing a Thick Clientside App
Ravi Teja
 
Mobile web & mobile app communication methods
Girish Manwani
 

More from guestfbf1e1 (13)

PPT
xrefer-lightowlers
guestfbf1e1
 
PPT
unusualevent
guestfbf1e1
 
PPT
training_tuftspma
guestfbf1e1
 
PPT
Sess_39_NAMCS&NHAMCS_hands-on_SCHAPPERT
guestfbf1e1
 
PPT
20070612150756-0
guestfbf1e1
 
PPT
DesmedtXSB
guestfbf1e1
 
PPT
GeneticAlgorithm
guestfbf1e1
 
PPT
dorsdl2006-arrow
guestfbf1e1
 
PPT
kevin_mcmahon_power_point_slides
guestfbf1e1
 
PPT
WLCG-Discu
guestfbf1e1
 
PPT
xreferplus-dereksturdy
guestfbf1e1
 
PPT
dougz
guestfbf1e1
 
PPT
LearningProgressionstoELit_Anderson
guestfbf1e1
 
xrefer-lightowlers
guestfbf1e1
 
unusualevent
guestfbf1e1
 
training_tuftspma
guestfbf1e1
 
Sess_39_NAMCS&NHAMCS_hands-on_SCHAPPERT
guestfbf1e1
 
20070612150756-0
guestfbf1e1
 
DesmedtXSB
guestfbf1e1
 
GeneticAlgorithm
guestfbf1e1
 
dorsdl2006-arrow
guestfbf1e1
 
kevin_mcmahon_power_point_slides
guestfbf1e1
 
WLCG-Discu
guestfbf1e1
 
xreferplus-dereksturdy
guestfbf1e1
 
LearningProgressionstoELit_Anderson
guestfbf1e1
 

Recently uploaded (20)

PDF
Structs to JSON: How Go Powers REST APIs
Emily Achieng
 
PDF
Unlocking the Future- AI Agents Meet Oracle Database 23ai - AIOUG Yatra 2025.pdf
Sandesh Rao
 
PDF
Economic Impact of Data Centres to the Malaysian Economy
flintglobalapac
 
PDF
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
PDF
Tea4chat - another LLM Project by Kerem Atam
a0m0rajab1
 
PDF
Accelerating Oracle Database 23ai Troubleshooting with Oracle AHF Fleet Insig...
Sandesh Rao
 
PDF
Get More from Fiori Automation - What’s New, What Works, and What’s Next.pdf
Precisely
 
PPTX
AI in Daily Life: How Artificial Intelligence Helps Us Every Day
vanshrpatil7
 
PDF
MASTERDECK GRAPHSUMMIT SYDNEY (Public).pdf
Neo4j
 
PPTX
The Future of AI & Machine Learning.pptx
pritsen4700
 
PPTX
The-Ethical-Hackers-Imperative-Safeguarding-the-Digital-Frontier.pptx
sujalchauhan1305
 
PDF
Oracle AI Vector Search- Getting Started and what's new in 2025- AIOUG Yatra ...
Sandesh Rao
 
PDF
Peak of Data & AI Encore - Real-Time Insights & Scalable Editing with ArcGIS
Safe Software
 
PDF
How Open Source Changed My Career by abdelrahman ismail
a0m0rajab1
 
PPTX
Simple and concise overview about Quantum computing..pptx
mughal641
 
PDF
The Future of Artificial Intelligence (AI)
Mukul
 
PDF
NewMind AI Weekly Chronicles - July'25 - Week IV
NewMind AI
 
PPTX
IT Runs Better with ThousandEyes AI-driven Assurance
ThousandEyes
 
PDF
Make GenAI investments go further with the Dell AI Factory
Principled Technologies
 
PDF
Research-Fundamentals-and-Topic-Development.pdf
ayesha butalia
 
Structs to JSON: How Go Powers REST APIs
Emily Achieng
 
Unlocking the Future- AI Agents Meet Oracle Database 23ai - AIOUG Yatra 2025.pdf
Sandesh Rao
 
Economic Impact of Data Centres to the Malaysian Economy
flintglobalapac
 
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
Tea4chat - another LLM Project by Kerem Atam
a0m0rajab1
 
Accelerating Oracle Database 23ai Troubleshooting with Oracle AHF Fleet Insig...
Sandesh Rao
 
Get More from Fiori Automation - What’s New, What Works, and What’s Next.pdf
Precisely
 
AI in Daily Life: How Artificial Intelligence Helps Us Every Day
vanshrpatil7
 
MASTERDECK GRAPHSUMMIT SYDNEY (Public).pdf
Neo4j
 
The Future of AI & Machine Learning.pptx
pritsen4700
 
The-Ethical-Hackers-Imperative-Safeguarding-the-Digital-Frontier.pptx
sujalchauhan1305
 
Oracle AI Vector Search- Getting Started and what's new in 2025- AIOUG Yatra ...
Sandesh Rao
 
Peak of Data & AI Encore - Real-Time Insights & Scalable Editing with ArcGIS
Safe Software
 
How Open Source Changed My Career by abdelrahman ismail
a0m0rajab1
 
Simple and concise overview about Quantum computing..pptx
mughal641
 
The Future of Artificial Intelligence (AI)
Mukul
 
NewMind AI Weekly Chronicles - July'25 - Week IV
NewMind AI
 
IT Runs Better with ThousandEyes AI-driven Assurance
ThousandEyes
 
Make GenAI investments go further with the Dell AI Factory
Principled Technologies
 
Research-Fundamentals-and-Topic-Development.pdf
ayesha butalia
 

Joseph-Smarr-Plaxo-OSCON-2006

  • 1. Cross-Site Ajax Challenges and Techniques for Building Rich Web 2.0 Mashups Joseph Smarr Plaxo, Inc. [email_address]
  • 2. The promise of mashups Create new experiences by combining components from different authors Each site focuses on what it does best Can wire up components in a novel way Google maps + Craigslist = HousingMaps Rich interaction often requires talking back and forth between components House’s address  lat / long  map it
  • 3. Talking between web components Normal situation : all on the same web site Communicate across frames / iframes / popups Talk to server using AJAX (XMLHttpRequest) Problem : doesn’t work when components live at different domains (mashup situation) Same-origin policy Can include JavaScript / images from another domain Can’t talk to frame / iframe popup or send an XHR Prevents snooping on secret web pages (e.g. intranet)
  • 4. So, how do mashups communicate? CAN include image / JavaScript / CSS from Domain B CAN send XMLHttpRequest to Domain A CAN talk to other frames / iframes / popups on Domain A CAN'T send XMLHttpRequest to Domain B CAN'T talk to other frames / iframes / popups on Domain B CAN talk to other pages on Domain A CAN’T talk to any page on Domain A Domain B XML / Web Page XHR Image CSS JavaScript
  • 5. How do mashups communicate? Often, they don’t (Google maps 1.0) Single JavaScript  all processing done locally Plotting lat/long or fetching image tiles is deterministic Can’t get any additional data (e.g. geo-coding) Server-side proxy (HousingMaps, Flickr) Talk to your server  it talks to the foreign site Problem: bottleneck; barrier to mass deployment
  • 6. Server-side proxy Web Page Domain A Server Domain A Server Domain B
  • 7. How do mashups communicate? Often, they don’t (Google maps 1.0) Single JavaScript  all processing done locally Plotting lat/long or fetching image tiles is deterministic Can’t get any additional data (e.g. geo-coding) Server-side proxy (HousingMaps, Flickr) Talk to your server  it talks to the foreign site Problem: bottleneck; barrier to mass deployment Use flash for cross-domain communication Can use crossdomain.xml to allow foreign sites Yahoo maps uses this to do geo-coding
  • 8. Flash proxy Web Page Domain A Server Domain B Flash crossdomain.xml
  • 9. How do mashups communicate? JSON-P (Script injection + callback) Dynamically load JavaScript file with data Use DHTML to inject a <script> tag in the document Data is returned in JSON (JavaScript data format) Clever trick: specify callback function on URL foreign-site.com/json-api.js? callback=myFunc Loads myFunc ({ data: “hello” });  round-trip! Works well in practice, but some drawbacks Limited control vs. XHR (just loads or doesn’t) API provider can return malicious code (e.g. steal cookies)
  • 10. JSON-P Web Page Domain A Server Domain B <script> JSON + callback
  • 11. Using JSON-P in OO web apps Problem : callback function has to be global Complex code maintains state / instances Would like to handle callback with instance function on instantiated object Solution : bind the callback dynamically Create a globally-unique function name Usually global prefix + auto-incremented counter Use a closure to call your function in object-scope Send the global function name as callback  it calls your scoped function
  • 12. Dynamically binding a global callback var cbName = 'cb' + JSON.callbackCounter++; var cbFunc = function(jsonData) { myFunc .call( myObj , jsonData); // call bound callback }; JSON.callbacks[cbName] = cbFunc; var globalCallbackName = ‘JSON.callbacks.’ + cbName // url: '/json-api.js?callback=' + globalCallbackName; Used by dojo (ScriptSrcIO), Google Maps 2.5, Plaxo, etc.
  • 13. Summary of cross-site techniques so far No cross-site communication Include partner’s JS file once (can’t talk again) Server-side proxy Talk on the backend (bottleneck, barrier to adoption) Flash proxy Talk through cross-domain flash (requires flash) JSON-P Talk through script-injection with callback (less control, partner could be malicious)
  • 14. What about updating another web page? Proxies / JSON-P let you access foreign data But still can’t touch a foreign frame/iframe/popup Many potential mashups would like to interact with existing web pages Auto-fill a form with your contact info Highlight relevant search results / text snippets How can two sites that want to cooperate get around the same-origin policy?
  • 15.  
  • 16. What does the partner site have to do? Add the button to your page <a onclick=&quot; showPlaxoABChooser('textarea', '/cb.html') ; return false&quot; href=&quot;#&quot;> <img src=&quot;http://www.plaxo.com/images/abc/buttons /add_button.gif&quot; alt=&quot;Add from my address book&quot; /></a> Specify the ID of your e-mail <textarea> Specify the location of your hidden callback page Add a small callback page on your site <html><head><script type=&quot;text/javascript&quot; src=&quot;https://www.plaxo.com/ab_chooser/abc_comm.jsdyn&quot;> </script></head><body></body></html> Full instructions and demo: http:// www.plaxo.com/api
  • 17. What does Plaxo have to do? Remember: Plaxo filled in a textarea on zazzle! Need to get around same-origin policy Without server-side proxy (JS/HTML only) JSON-P won’t solve this problem Widget popup is hosted by Plaxo and goes thru several steps Zazzle doesn’t know when to request the contact data Solution: “The JavaScript Wormhole” Add hidden callback page on zazzle that includes Plaxo script Plaxo popup loads callback in an iframe when done Script is dynamically generated, and includes selected data IFrame is also on zazzle (and has the data), so it can tell parent.opener to fill in the textfield
  • 18. zazzle.com/email_this plaxo.com/ab_chooser plaxo.com/ab_chooser Iframe: zazzle.com/cb.html  Script: plaxo.com/ab_chooser/abc_comm.jsdyn
  • 19. Who’s using the Plaxo widget? See more at http://www.plaxo.com/api/gallery Using the widget? Let us know!
  • 20. Generalizing the JavaScript Wormhole Site has a generic callback page to give you access Site tells you the location of their callback page Callback page loads your domain’s JavaScript JavaScript is dynamically generated to include your data Can pass script url with query args to callback page /cb.html? http://foreign-site.com/json-api.js?name=val Access query string on cb page with location.search Site can restrict callback page to trusted hosts Only load script if it’s on a trusted domain Could further restrict to certain URL prefixes, etc.
  • 21. <html><head><title>Generalized JavaScript Wormhole</title> <script type=&quot;text/javascript&quot;> var trustedDomains = [ &quot;http://www.plaxo.com/api/&quot;, &quot;http://www.google.com/&quot; ]; function isTrustedDomain(url) { for (var i = 0; i < trustedDomains.length; i++) if (url.indexOf(trustedDomains[i]) == 0) return true; return false; } function doWormhole() { var url = location.search.substr(1); // chop off ? if (isTrustedDomain(url)) { var script = document.createElement('script'); script.type = &quot;text/javascript&quot;; script.src = url; document.getElementsByTagName(&quot;head&quot;)[0].appendChild(script); } else alert(&quot;ignoring untrusted url: &quot; + url); } </script></head><body onload=&quot;doWormhole()&quot;></body></html>
  • 22. Where do we go from here? Ajax is a “hack” on top of an old platform The platform can evolve
  • 23. Where do we go from here? Ajax is a “hack” on top of an old platform The platform is evolving
  • 24. Where do we go from here? Ajax is a “hack” on top of an old platform The platform is evolving What platform do we want to build?
  • 25. Should we open cross-domain XHR? After all, we can already include foreign JavaScript, image, and CSS files So why not XML too? (“just another resource file”) HTML looks like XML (esp. XHTML) Hard to make sure you really meant to serve that page as XML data (cf. js / img / css) Personal / private info more often in XML / HTML But increasingly a problem with JS too (JSON) Cookies / creds sent with XHR request Can’t easily distinguish direct vs. XHR access
  • 26. Trust relationships between sites Random site accessing this file vs. trusted partner Flash does this with crossdomain.xml Web services do this with certs / IP whitelists JavaScript wormhole does it (sort of) Should a trust relationship exist for mashups? Want to minimize barriers to adoption / innovation When sharing user info, should have prior agreement? How formal / technical should this trust be?
  • 27. Restricting access to unauthorized info Restrict XHR to same “internet zone” So public site can’t access intranet page Don’t send any cookies / credentials via XHR Practically restricts cross-site comm. to fully public info Could still send auth info on URL But now other site has it Give other site limited-access token? White-list authorized sites with cross-domain file Return special response headers for public pages Legacy problem for existing content
  • 28. Proposals for better cross-site tools ContextAgnosticXmlHttpRequest (Chris Holland) Alternative to normal XmlHttpRequest for cross-site Don’t send/receive any cookie or HTTP auth info Server must specify X-Allow-Foreign-Hosts in response JSONRequest (Douglas Crockford) New browser object for cross-site JSON (like XHR) Allows GET / POST / cancel of JSON request / response No cookies / auth info sent or received Requires special headers in request / response
  • 29. In conclusion… Cross-site communication is tricky but important Key enabling technology for building rich mashups Raises legitimate security issues that can’t be ignored Today: Use server-side proxy or JSON-P Proxy introduces bottleneck, but provides full access JSON-P is more scalable, but limited to JSON APIs JavaScript Wormhole lets you touch foreign pages Keep the discussion of better tools / protocols going! This problem is here to stay Browser developers are listening!
  • 30. For further reading… Cross-site limitations http://getahead.ltd.uk/ajax/cross-domain-xhr http:// msdn.microsoft.com/library/default.asp?url =/workshop/author/ om/xframe_scripting_security.asp FlashXMLHttpRequest http:// blog.monstuff.com/FlashXMLHttpRequest ContextAgnosticXMLHttpRequest http://chrisholland.blogspot.com/2005/03/contextagnosticxmlhttprequest-informal.html JSONRequest http:// json.org/JSONRequest.html