| name | Form Validation Breaker |
| description | Exhaustive testing of form validation logic including boundary values, injection payloads, encoding edge cases, and client-server validation bypass techniques |
| version | 1.0.0 |
| author | Pramod |
| license | MIT |
| tags | ["form-validation","input-testing","boundary-testing","injection-testing","xss-prevention","validation-bypass","fuzzing"] |
| testingTypes | ["security","e2e"] |
| frameworks | ["playwright"] |
| languages | ["typescript","javascript"] |
| domains | ["web"] |
| agents | ["claude-code","cursor","github-copilot","windsurf","codex","aider","continue","cline","zed","bolt","gemini-cli","amp"] |
Form Validation Breaker Skill
You are an expert QA security engineer specializing in form validation testing. When the user asks you to test form inputs, break validation logic, or verify server-side protection against malicious input, follow these detailed instructions.
Core Principles
- Client-side validation is a convenience, not a defense -- Every form must have server-side validation that mirrors or exceeds client-side rules. Testing must bypass client-side checks to verify the server rejects invalid input.
- Boundary values reveal more bugs than random values -- The edges of valid ranges (min, max, min-1, max+1, zero, empty, null) are where validation logic most commonly fails.
- Encoding matters as much as content -- The same character can be represented in UTF-8, URL encoding, HTML entities, Unicode escapes, and base64. Validation that blocks
<script> but allows %3Cscript%3E is broken.
- Test the entire submission pipeline -- A form value passes through DOM event handlers, client-side framework validation, HTTP serialization, server-side parsing, database binding, and output rendering. Each stage can transform or mishandle the input.
- Every input type has unique attack vectors -- Text fields, email inputs, file uploads, dropdowns, checkboxes, hidden fields, date pickers, and rich text editors each have distinct failure modes. Test each type specifically.
- Multi-step forms have inter-step vulnerabilities -- When a form spans multiple pages or tabs, state can leak between steps. Manipulating step order, replaying previous steps, or submitting incomplete flows exposes logic bugs.
- Validation error messages should not leak implementation details -- Error messages like "SQL syntax error" or "column 'users.email' not found" reveal the database schema. Verify that error messages are generic and user-friendly.
Project Structure
Organize your form validation testing suite with this structure:
tests/
form-validation/
boundary-values.spec.ts
injection-payloads.spec.ts
encoding-edge-cases.spec.ts
file-upload-validation.spec.ts
client-bypass.spec.ts
multi-step-forms.spec.ts
real-time-validation.spec.ts
fixtures/
form-breaker.fixture.ts
helpers/
payload-generator.ts
boundary-calculator.ts
encoding-transformer.ts
validation-reporter.ts
payloads/
xss-vectors.json
sql-injection.json
unicode-edge-cases.json
playwright.config.ts
Payload Generator
The payload generator creates targeted test inputs for different validation scenarios.
{
: ;
: ;
: ;
: | ;
: ;
}
(): [] {
: [] = [];
{ minLength = , maxLength = , minValue, maxValue, required = , = } = options;
(required) {
payloads.({
: ,
: ,
: ,
: ,
: ,
});
payloads.({
: ,
: ,
: ,
: ,
: ,
});
payloads.({
: ,
: ,
: ,
: ,
: ,
});
payloads.({
: ,
: ,
: ,
: ,
: ,
});
}
(minLength > ) {
payloads.({
: ,
: .(minLength - ),
: ,
: ,
: ,
});
payloads.({
: ,
: .(minLength),
: ,
: ,
: ,
});
}
(maxLength) {
payloads.({
: ,
: .(maxLength),
: ,
: ,
: ,
});
payloads.({
: ,
: .(maxLength + ),
: ,
: ,
: ,
});
payloads.({
: ,
: .(maxLength * ),
: ,
: ,
: ,
});
}
( === && minValue !== && maxValue !== ) {
payloads.(
{ : , : (minValue - ), : , : , : },
{ : , : (minValue), : , : , : },
{ : , : (maxValue), : , : , : },
{ : , : (maxValue + ), : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : }
);
}
payloads;
}
(): [] {
[
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
];
}
(): [] {
[
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
{ : , : , : , : , : },
];
}