Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
a11y club: The Cake Is a Lie... And So Is Your ...
Search
Ramona Schwering
June 17, 2026
Technology
16
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
Dangerous Reactivity: Why AI Output Is the New XSS Vue
leichteckig
0
19
React with Caution: How to Hack Your React App (And Fix It Too)
leichteckig
0
13
Vue'tiful Defense
leichteckig
0
82
Workshop: The Cake is a Lie!
leichteckig
0
41
The Cake Is a Lie... And So Is Your Login’s Accessibility
leichteckig
0
220
Plants vs thieves: Automated Tests in the World of Web Security
leichteckig
0
230
From the Crypt to the Code
leichteckig
0
250
You shall not pass!? A short story of customizable login experiences
leichteckig
0
94
Access Granted!
leichteckig
0
150
Other Decks in Technology
See All in Technology
ガバメント AI 源内を地方自治体は活用できるのか可能性と課題、期待について
takeda_h
1
420
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
19k
Data Hubグループ 紹介資料
sansan33
PRO
0
3.2k
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
9k
修正PRを食べてレビュースキルが賢くなる:Claude Codeによる自己改善サイクル
yuyaumetsu
6
1.5k
強化学習「理論」入門
enakai00
3
3.6k
ラジオの科学
frievea
0
320
Reference-Free Image Quality Assessment for Virtual Try-On via Human Feedback
zozotech
PRO
0
150
『三匹の子ぶた』から学ぶネットワークセキュリティの昔と今 / Network Security: Then and Now Through the Lens of The Three Little Pigs
nttcom
1
6.1k
Invisible to AI? Making TYPO3 Sites Quotable by AI Search Systems
wolfgangwagner
0
210
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
4.9k
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.2k
Featured
See All Featured
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.3k
The Pragmatic Product Professional
lauravandoore
37
7.4k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
How to build a perfect <img>
jonoalderson
1
5.9k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
280
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
390
Facilitating Awesome Meetings
lara
57
7.1k
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
280
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
650
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