Skip to content
easeweb
Search topics

CAPTCHAs with no way past them except solving the puzzle

A ticket site's sign-in asks for the characters in a distorted image after two wrong passwords, with no audio version and no other way in, so people who can't see or read the image are stuck.

WCAG 2.2
SC 1.1.1ASC 3.3.8AA· new in 2.2
Required by
Section 508 · EN 301 549 (EU)
Broken <img src="/captcha" alt="CAPTCHA">
The accessibility problem illustrated: No vision:What does the picture say?
01

The problem

People who can't see the distorted image, or can't make out its characters, can't sign in at all, because solving it is the only way in.

02

Try it

You have typed your password wrong twice. Try to sign in without looking at the picture.

The panel reads the form from the top, as a screen reader would. Is there a way past that needs neither sight nor solving a puzzle?

Broken Can you fix this?

BrokenAn image CAPTCHA with nothing else

Sign in to buy tickets

Too many attempts. Type the characters below to sign in.

7KX4P2

Reading from the top, a screen reader says:

  1. Too many attempts. Type the characters below to sign in.
  2. Email, edit text, [email protected]
  3. Password, secure edit text
  4. CAPTCHA, image
  5. Type the characters you see, edit text
  6. Sign in, button

A recreated demo. The broken version is intentionally inaccessible.

03

The fix

Stop bots behind the page, or give the CAPTCHA a second sense and a way in that needs no test.

  1. 1Keep CAPTCHAs off the sign-in where checks on the server can do the job.
  2. 2Describe a CAPTCHA's purpose in its text alternative, and offer it for another sense.
  3. 3On a sign-in, put a way in that needs no test beside any CAPTCHA.
Before An image CAPTCHA with nothing else
<form action="/sign-in" method="post">  …  <img src="/captcha" alt="CAPTCHA">  <label for="captcha">Type the characters you see</label>  <input id="captcha" name="captcha">  <button type="submit">Sign in</button></form>
After

No CAPTCHA, with attempts limited on the server

<form action="/sign-in" method="post">  …  <!-- No CAPTCHA: the server limits attempts per account and per address. -->  <button type="submit">Sign in</button></form>

Fixing this with an AI coding assistant? Get this guide as Markdown, or get every guide in your coding agent.

04

Design ideas

A check for bots can look calm, and ask nothing.

Four ways to draw the step after two wrong passwords. Tab through them and try each one: two let everyone through without a puzzle, and two only look friendly.

In the design file

  • Draw the sign-in without a puzzle first, and the bot check, if there is one, as a quiet line that asks for nothing.
  • Draw the screen the check shows when it doubts someone too, because that screen is where people get stuck.
  • Draw the way round the check at the same size and weight as the check, not as small grey text under it.
  • Write beside each picture what it is for, such as “Characters to type, to check you’re a person”, for its alt text.

Passes

  • Checking you’re not a bot…

    A check that runs by itself A small status line works while the page is used and only says when it is done. Nobody sees, hears or solves anything, so there is nothing to give another sense or a way round.
  • Choose how to go on

    Two equal ways to go on The check and the way round it sit side by side as two cards of the same size, so nobody has to find a small link. One card offers the characters to see or hear; the other emails a sign-in link with nothing to solve.

Fails

  • Slide to complete the puzzle

    Slide the piece into the gapWCAG 3.3.8 It feels lighter than typing characters, but it is still a puzzle: matching a piece to a gap needs sight and a steady drag, it has no audio form, and on a sign-in 3.3.8 doesn’t except puzzles. Here the slider moves with the arrow keys too, which doesn’t change that.
  • Select all squares with a bus

    Pick every square with a busWCAG 1.1.1 Picking out objects is allowed under 3.3.8 at AA, so this looks like the safe choice. But the squares are only pictures, with no audio version beside them, so someone who can’t see them can’t start: 1.1.1 asks for a second sense.
05

Verify the fix

4 checks, no mouse.

Test with: Screen reader, Keyboard, Sound off, Screen off

0 of 4 checked

Record the OS, browser and assistive-technology versions, the build, the date, and the actual result of each step. Repeat after the CAPTCHA service, its settings or the sign-in form change.

Limits

This is a starting pattern, not a guarantee for every form. Every CAPTCHA shuts out someone: an audio version doesn't help people who are deaf-blind, and an emailed link doesn't help someone who can't reach their email, so the surest fix is not to ask people to prove they are people. 3.3.8 covers signing in; a CAPTCHA on a contact form or a checkout falls under 1.1.1, not 3.3.8, but it shuts out the same people. Test the whole flow, including what appears only after a mistake, with the tools your users rely on.

This is a recreated teaching example, not a finding about a named client. The code is a starting pattern: test it in your own product. No completed assistive-technology test is claimed here.

Keep this fixed as your code changes.

Turn guides like this into rules your coding agents and CI follow, then have the result retested with a keyboard and screen readers.

How retests work