Symptom: Registration or recovery responses differ depending on whether an email belongs to an account.
Fastest fix: Test your own application with controlled registered and unregistered addresses, then compare the response, email behavior, and resulting account state.
This guide is for developers checking their product’s registration flow for unnecessary account disclosure.
It also helps QA engineers verify that identity and recovery screens, emails, and account records agree.
Independent developers and product security owners can use it to review an authorized staging environment.
Set the boundary before running account enumeration tests
Account enumeration testing checks whether someone outside the application can infer that an account exists. The goal here is to test a product we own or have explicit permission to assess—not to probe a third-party service, automate sign-ups elsewhere, or bypass another service’s controls.
A useful test does not treat one screen message as proof of safety. It separates evidence into distinct categories:
- Application response: visible copy, HTTP status, response body, redirects, and relevant headers.
- Processing behavior: whether comparable requests appear to take noticeably different amounts of time.
- Email behavior: whether the expected message arrives at a controlled inbox, and what it says.
- Account state: whether the address is registered, pending verification, changed, or still associated with the original account.
OWASP’s Web Security Testing Guide for account enumeration describes testing for differences that can reveal valid accounts. The OWASP Authentication Cheat Sheet also advises considering response content and timing. These are security signals to evaluate—not a universal implementation recipe that overrides product requirements.
Before testing, prepare addresses that we control and whose account states we can verify. Use a known registered address and a separate address that is not registered in the test environment. Keep them out of production unless production testing is approved and controlled. Record the environment, starting account state, request, observed response, inbox evidence, and final account state for each case.
Boundary check: A test inbox can show that a message arrived and help us inspect its content. It cannot establish that the application’s access controls, token handling, or broader identity design are secure.
Registration: do duplicate-address responses reveal account status?
To test whether the registration page leaks that an email is already registered, submit a controlled new address and a controlled registered address through the same product flow. Compare what a prospective user could observe, not just the wording on the page.
Check the visible message, status code, response body, redirect destination, and any other response detail available to the client. A message that explicitly says an account already exists may disclose state. But identical copy alone does not settle the question: a different status code, response shape, or consistently distinguishable timing may still provide a clue.
We should also review what happens after submission. Some products choose to show a general confirmation and communicate next steps through a separate, controlled process. Others may have different requirements based on their product design. The appropriate behavior depends on the application and its security review; the OWASP guidance supports assessing avoidable differences, not forcing every product into identical wording or workflows.
| Evidence to compare | What we check | What it can tell us |
|---|---|---|
| Page message and response body | Whether registered and new addresses receive distinguishable text or content | Whether the client receives a direct account-status signal |
| HTTP status and redirect | Whether the application returns different outcomes or destinations | Whether state may be exposed outside the visible message |
| Processing time | Whether comparable requests repeatedly show a notable timing difference in our environment | Whether timing warrants investigation; it is not a verdict by itself |
| Follow-up email | Whether the controlled address receives the message expected for that flow | Whether the notification behavior matches the product’s rules |
| Final account state | Whether registration, verification, or account association changed as intended | Whether the flow completed correctly, beyond what the page claimed |
To keep the comparison meaningful, use the same environment and equivalent request conditions. Avoid changing unrelated fields between submissions. If a result differs, repeat the controlled comparison and investigate why before labeling it an enumeration issue. A single slow response can have many causes, including background load or an external mail dependency.
Password reset: how do we check for account enumeration?
Run the password reset flow with a controlled registered address and a controlled unregistered address. Compare the public response first. Does the page unnecessarily confirm that one address has an account? Do the response body, status, or redirect differ? Does one request take noticeably longer in a pattern that can be reproduced in the same environment?
OWASP’s Forgot Password Cheat Sheet recommends consistent messages and response timing as ways to reduce account disclosure in password recovery. Treat that as guidance to evaluate for the product—not as proof that identical text alone makes a flow safe, or that every product must implement recovery in exactly the same way.
Then use a controlled inbox to check the mail behavior against your own rules. For example, a registered account may be eligible for a recovery message while an unregistered address is not. Confirm that the outcome shown to the requester does not unnecessarily disclose this distinction. The recipient-side evidence answers a different question from the public response: it helps us determine which message was sent and whether it matches the intended flow.
Inspect the recovery link or token as part of the authorized test. Verify that following the expected path produces the intended result and that the account state changes only when the required steps are complete. Do not treat receipt of a reset email as proof that a password was changed, or that the whole recovery process is secure. If the test account remains unchanged after receiving the message, record that distinction rather than marking the flow successful.
The OWASP Email Validation and Verification Cheat Sheet discusses verification as a way to establish control of an email address. That is relevant to designing and testing identity flows, but it does not determine the exact recovery policy for every application.
Email change: does confirmation match the account state?
Changing an email address tests more than whether a notification was sent. We need to know which address receives each message, what action the message requests, and when the application changes the account’s identity association.
Start with a controlled account whose current address and proposed new address are both under our control. Submit the change and record the page response. Check the current inbox and the proposed new inbox for the notifications the product is designed to send. A message reaching either inbox is evidence of delivery to that address; it is not, by itself, evidence that the change was confirmed or safely applied.
Verify the account record at each meaningful state in the flow:
- Verified: the existing account is associated with the expected confirmed address.
- Pending confirmation: the application records a change request but has not yet completed the association change.
- Failed or expired: the request did not complete, and the account remains in the state the product intends.
The exact confirmation policy depends on the product and its risk review. Some applications may require confirmation from the new address, the current address, or both; we should test the policy the product actually adopts rather than assume one universal pattern. Check that the old address does not appear to be replaced before the required confirmation step, if that is the intended design. Also confirm that declined or incomplete requests do not leave the account in an ambiguous state.
| Scenario | Application response | Inbox evidence | Account-state evidence |
|---|---|---|---|
| Registration with a new address | Check that the response does not expose unrelated account data | Confirm the expected registration or verification message | Verify whether the account is new, pending, or unchanged |
| Registration with a registered address | Compare the response with the new-address case | Check whether any message follows the product’s policy | Confirm that an existing account was not unexpectedly altered |
| Password reset for a registered address | Review message, status, redirect, and reproducible timing differences | Inspect the controlled recovery message and its destination | Confirm whether the recovery action actually changed account state |
| Password reset for an unregistered address | Compare the public response with the registered-address case | Check whether any email behavior matches the product’s rules | Confirm that no unintended account was created or changed |
| Email change | Record the response for the requested change | Check the current and proposed addresses for expected notifications | Confirm the relationship before and after confirmation |
Make the evidence repeatable without increasing test traffic
A defensible account enumeration test needs a compact record, not a large volume of requests. Keep each test case tied to an authorized account state and an expected product outcome. Capture the request context, visible result, relevant response details, inbox evidence, and final account state. If timing is a concern, compare repeated observations from the same controlled environment; do not apply a generic threshold that has not been established for your system.
A practical record can include:
- Environment and test-account state before the request.
- Flow under test: registration, password reset, or email change.
- Public response: message, status, response body, redirect, and observed processing behavior.
- Mail evidence: whether a message arrived, which controlled address received it, and whether its contents match the expected action.
- Final account state and any unexplained differences.
For each difference, ask whether the result is intended, externally observable, and necessary for the product. Then trace it to the relevant implementation or dependency. For example, a difference may come from application logic, a notification worker, or an environment-specific mail configuration. The test identifies what to investigate; it does not tell us which component caused the result without further review.
Use the process only against your own product or an authorized environment. There is no need to expand the test into third-party probing, high-volume submissions, or attempts to evade rate limits. Those actions are outside this acceptance check and do not improve the quality of evidence for a controlled product review.
Use test email as evidence, not as a security verdict
A test email helps us inspect a real message in a controlled workflow: its subject, content, links, and relationship to the test account. It can also help keep development and QA traffic separate from a personal or work inbox. But a message arriving does not establish that the application avoided account enumeration. Nor does the absence of a message prove that the public response is safe; delivery can fail for reasons unrelated to the response.
For that reason, evaluate the application response and inbox evidence separately, then compare both with the final account state. This is especially important for registration and email verification: seeing a verification message confirms a mail event, while the account record tells us whether verification was actually completed and associated as expected.
For test data that should not reach a personal inbox, our privacy and routing guide explains considerations for separating email traffic. Our privacy guidance can help teams think through the information included in test messages. If we choose a temporary inbox for a controlled test, we should verify its current behavior and suitability from the service’s own information before relying on it. We should not assume an address’s lifetime, message retention, forwarding behavior, or delivery speed without checking those details.
QA note: Keep sensitive real-user data out of test messages where possible. Use controlled accounts and synthetic details, and avoid copying production recovery links or personal information into shared test logs.
A release check that separates the signals
Before closing the security review, confirm that each tested flow has an explanation for any externally observable difference. Registration responses, password reset responses, email-change notifications, and account records answer different questions. No single one substitutes for the others.
If a discrepancy remains, assign it to the responsible code path or product decision and document the risk. Re-test after the change using the same controlled account states. Keep the evidence scoped to your own product, and preserve only the test records your team needs.
For a temporary inbox used to inspect a controlled registration or verification message, tempget is one option to evaluate. Check its current service details before using it in a test, and treat it as a way to inspect email evidence—not as a substitute for reviewing response behavior, account access controls, or the full identity flow.
READY / NEW INBOX
Need to start over with a clean inbox?
Return to the tool, generate an address, copy it, and stay on the same page while you wait.