Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
a11y club: The Cake Is a Lie... And So Is Your ...
Search
Ramona Schwering
June 17, 2026
Technology
21
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
a11y club: The Cake Is a Lie... And So Is Your Login’s a11y.
Ramona Schwering
June 17, 2026
More Decks by Ramona Schwering
See All by Ramona Schwering
Artful Defense
leichteckig
0
83
Dangerous Reactivity: Why AI Output Is the New XSS Vue
leichteckig
0
40
React with Caution: How to Hack Your React App (And Fix It Too)
leichteckig
0
28
Vue'tiful Defense
leichteckig
0
150
Workshop: The Cake is a Lie!
leichteckig
0
47
The Cake Is a Lie... And So Is Your Login’s Accessibility
leichteckig
0
250
Plants vs thieves: Automated Tests in the World of Web Security
leichteckig
0
240
From the Crypt to the Code
leichteckig
0
260
You shall not pass!? A short story of customizable login experiences
leichteckig
0
100
Other Decks in Technology
See All in Technology
トークン化預金DCJPYの取り組みと活用ユースケース
finengine
0
160
Browser Spec: Testing Hotwire with Ruby
takahashim
1
130
実体験から学ぶ分析エージェントの開発と運⽤
recruitengineers
PRO
8
2.4k
M5Stackで作る BLEマウス GPSログの世界
tomokusaba
PRO
0
440
Rust で関数型ドメインモデリング
takonda
0
170
Kiro Crewで「みのるん式」仕事術やってみた
minorun365
PRO
2
570
DBについての基礎説明(MySQL編) - コロプラ 2026年度 新卒研修
colopl
0
130
WasmをRustにする
sansantech
PRO
0
270
Conditional PED-ANOVA: Hyperparameter Importance in Hierarchical & Dynamic Search Spaces
pfn
PRO
0
140
Code for Security プロジェクト紹介 2026年10月
yu23ki14
0
110
会社紹介資料 / Sansan Company Profile
sansan33
PRO
31
430k
Benchmarking Disaggregated Serving on vLLM + Dynamo with a Real Coding-Agent Workload
nttcom
1
200
Featured
See All Featured
Producing Creativity
orderedlist
PRO
348
41k
Leo the Paperboy
mayatellez
10
2.4k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
630
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Everyday Curiosity
cassininazir
0
360
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
500
Skip the Path - Find Your Career Trail
mkilby
1
260
From π to Pie charts
rasagy
1
400
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
630
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
330
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Transcript
Automated Tests in the World of Web Security
None
None
What does that have to do with web development?
None
None
None
None
None
Garden
Garden House = Protected parts
Garden Garden = our defenses House = Protected parts
None
Security best practises
None
Broken Access Control
Broken Access Control Cryptographic Failures
Broken Access Control Cryptographic Failures Injection
Test Cases
Injection
Testing XSS it('checks for XSS vulnerability', () => { cy.visit('http://example.com/contact-form');
cy.get('input[name="name"]').type('<script>alert("XSS")</script>'); cy.get('form').submit(); cy.contains('<script>alert("XSS")</script>').should('not.exist'); });
Testing XSS it('checks for XSS vulnerability', () => { cy.visit('http://example.com/contact-form');
cy.get('input[name="name"]').type('<script>alert("XSS")</script>'); cy.get('form').submit(); cy.contains('<script>alert("XSS")</script>').should('not.exist'); });
Testing XSS it('checks for XSS vulnerability', () => { cy.visit('http://example.com/contact-form');
cy.get('input[name="name"]').type('<script>alert("XSS")</script>'); cy.get('form').submit(); cy.contains('<script>alert("XSS")</script>').should('not.exist'); });
Testing XSS it('checks for XSS vulnerability', () => { cy.visit('http://example.com/contact-form');
cy.get('input[name="name"]').type('<script>alert("XSS")</script>'); cy.get('form').submit(); cy.contains('<script>alert("XSS")</script>').should('not.exist'); });
Testing XSS it('checks for XSS vulnerability', () => { cy.visit('http://example.com/contact-form');
cy.get('input[name="name"]').type('<script>alert("XSS")</script>'); cy.get('form').submit(); cy.contains('<script>alert("XSS")</script>').should('not.exist'); });
it('checks for CSRF vulnerability', () => { cy.request({ method: 'POST',
url: 'http://example.com/update-profile', form: true, body: { name: 'John Doe', email: '
[email protected]
' } }).then((response) => { expect(response.status).to.eq(403); }); }); Testing CSRF
Testing CSRF it('checks for CSRF vulnerability', () => { cy.request({
method: 'POST', url: 'http://example.com/update-profile', form: true, body: { name: 'John Doe', email: '
[email protected]
' } }).then((response) => { expect(response.status).to.eq(403); }); });
Testing CSRF it('checks for CSRF vulnerability', () => { cy.request({
method: 'POST', url: 'http://example.com/update-profile', form: true, body: { name: 'John Doe', email: '
[email protected]
' } }).then((response) => { expect(response.status).to.eq(403); }); });
Testing CSRF it('checks for CSRF vulnerability', () => { cy.request({
method: 'POST', url: 'http://example.com/update-profile', form: true, body: { name: 'John Doe', email: '
[email protected]
' } }).then((response) => { expect(response.status).to.eq(403); }); });
Testing CSRF it('checks for CSRF vulnerability', () => { cy.request({
method: 'POST', url: 'http://example.com/update-profile', form: true, body: { name: 'John Doe', email: '
[email protected]
' } }).then((response) => { expect(response.status).to.eq(403); }); });
Testing SQL Injection it('checks for SQL injection vulnerability', () =>
{ cy.visit('http://example.com/search?query=1 OR 1=1'); cy.contains('Error:').should('not.exist'); });
Testing SQL Injection it('checks for SQL injection vulnerability', () =>
{ cy.visit('http://example.com/search?query=1 OR 1=1'); cy.contains('Error:').should('not.exist'); });
Testing SQL Injection it('checks for SQL injection vulnerability', () =>
{ cy.visit('http://example.com/search?query=1 OR 1=1'); cy.contains('Error:').should('not.exist'); });
CSP Testing Using Cypress const { defineConfig } = require('cypress')
module.exports = defineConfig({ // https://on.cypress.io/experiments // https://github.com/cypress-io/cypress/issues/1030 experimentalCspAllowList: ['default-src', 'script-src'], e2e: { baseUrl: 'http://localhost:3003', }, });
CSP Testing Using Cypress const { defineConfig } = require('cypress')
module.exports = defineConfig({ // https://on.cypress.io/experiments // https://github.com/cypress-io/cypress/issues/1030 experimentalCspAllowList: ['default-src', 'script-src'], e2e: { baseUrl: 'http://localhost:3003', }, });
CSP Testing Using Cypress it('serves Content-Security-Policy header', () => {
cy.request('/') .its('headers') .should('have.property', 'content-security-policy') // confirm parts of the CSP directive .should('include', "default-src 'self'") .and('include', 'report-uri /security-attacks’); });
CSP Testing Using Cypress it('serves Content-Security-Policy header', () => {
cy.request('/') .its('headers') .should('have.property', 'content-security-policy') // confirm parts of the CSP directive .should('include', "default-src 'self'") .and('include', 'report-uri /security-attacks’); });
CSP Testing Using Cypress it('serves Content-Security-Policy header', () => {
cy.request('/') .its('headers') .should('have.property', 'content-security-policy') // confirm parts of the CSP directive .should('include', "default-src 'self'") .and('include', 'report-uri /security-attacks’); });
CSP Testing Using Cypress it('stops XSS and reports CSP violations',
() => { cy.intercept('/security-attacks', {}).as(‘cspAttacks'); cy.on('window:load', (win) => cy.stub(win.console, ‘log').as('log')); cy.visit(‘/'); cy.get('#message').type('Hello<img src="" onerror="console.log(`hacked`)" />’); cy.contains('button', ‘Send').click(); cy.contains('#messages li', ‘Hello'); cy.log('**XSS stopped and reported**') cy.wait('@cspAttacks').its('request.body').should('include', ‘blocked'); cy.get(‘@log').should('not.be.called'); })
CSP Testing Using Cypress it('stops XSS and reports CSP violations',
() => { cy.intercept('/security-attacks', {}).as(‘cspAttacks'); cy.on('window:load', (win) => cy.stub(win.console, ‘log').as('log')); cy.visit(‘/'); cy.get('#message').type('Hello<img src="" onerror="console.log(`hacked`)" />’); cy.contains('button', ‘Send').click(); cy.contains('#messages li', ‘Hello'); cy.log('**XSS stopped and reported**') cy.wait('@cspAttacks').its('request.body').should('include', ‘blocked'); cy.get(‘@log').should('not.be.called'); })
CSP Testing Using Cypress it('stops XSS and reports CSP violations',
() => { cy.intercept('/security-attacks', {}).as(‘cspAttacks'); cy.on('window:load', (win) => cy.stub(win.console, ‘log').as('log')); cy.visit(‘/'); cy.get('#message').type('Hello<img src="" onerror="console.log(`hacked`)" />’); cy.contains('button', ‘Send').click(); cy.contains('#messages li', ‘Hello'); cy.log('**XSS stopped and reported**') cy.wait('@cspAttacks').its('request.body').should('include', ‘blocked'); cy.get(‘@log').should('not.be.called'); })
Cover Login / Auth APIs
... cy.get('#username').type(username); cy.get('#password').type(password); cy.get('[type="submit"]').click(); cy.contains('Access denied') .should('not.exist'); ... Cover Authn
/ Login
HTTPS!?
None
Test Automation Tools
None
SAST Tools
SAST Tools DAST Tools
SAST Tools DAST Tools IAST Tools
SAST Tools DAST Tools IAST Tools Static Code Quality Analysis
SAST Tools Keeping dependencies up-to-date DAST Tools IAST Tools Static
Code Quality Analysis
General testing practises
None
None
Understand your app
Understand your app Create a test plan
Understand your app Create a test plan Write your test
cases
Understand your app Create a test plan Write your test
cases Execute tests and analyse
Understand your app Create a test plan Write your test
cases Execute tests and analyse Include other tools
Understand your app Create a test plan Write your test
cases Execute tests and analyse Include other tools Repeat your test runs
Understand your app Create a test plan Write your test
cases Execute tests and analyse Include other tools Repeat your test runs
None
None
None
None
Automation = great complement
Automation = great complement Simple steps are most useful
Automation = great complement Simple steps are most useful Combine
own test cases + Tools
Automation = great complement Simple steps are most useful Combine
own test cases + Tools All testing types can be utilized
None