tamper[box]

Naughty Strings List

Hostile Test Inputs

Test forms, parsers and imports with tricky strings. Choose the cases and export them for your tests.

Search 158 hostile test strings for forms, APIs, imports and file names, each with what it tests, and copy them as JSON, CSV, JavaScript or Python.

129 strings ready to copy. Data only, no active payloads.

Every string here is data that a system should store and show unchanged. Injection, formula and path payloads are hidden until you include them.

The list is built into the page. Searching, filtering and copying happen in your browser.

Nothing is sent or stored. No server request is made for any input.

Copy the list

Strings

129 of 158
  • (empty string)

    Is an empty value refused, stored as nothing or stored as the text "null"?

    Empty and punctuation, 0 characters, 0 bytes

  • '

    An unbalanced quote that breaks naive string building.

    Empty and punctuation, 1 character, 1 byte

  • "

    The same for double quotes and JSON.

    Empty and punctuation, 1 character, 1 byte

  • `

    Shell and template-literal delimiter.

    Empty and punctuation, 1 character, 1 byte

  • \

    An escape character with nothing to escape.

    Empty and punctuation, 1 character, 1 byte

  • \\

    Is a backslash stored once, twice or not at all?

    Empty and punctuation, 2 characters, 2 bytes

  • %

    A URL escape that is not followed by two hex digits, and a SQL wildcard.

    Empty and punctuation, 1 character, 1 byte

  • &

    Is an HTML entity shown as typed, decoded, or decoded twice?

    Empty and punctuation, 5 characters, 5 bytes

  • <>

    Markup with nothing in it.

    Empty and punctuation, 2 characters, 2 bytes

  • {}

    An empty JSON object, and a template placeholder start.

    Empty and punctuation, 2 characters, 2 bytes

  • []

    An empty JSON array.

    Empty and punctuation, 2 characters, 2 bytes

  • ""

    Two quote characters, which some CSV and JSON handling reads as empty.

    Empty and punctuation, 2 characters, 2 bytes

  • One space: blank to a person, not empty to a program.

    Whitespace, 1 character, 1 byte

  • Several spaces: does a "required" check count them as a value?

    Whitespace, 10 characters, 10 bytes

  • A tab: blank, and a column separator in TSV.

    Whitespace, 1 character, 1 byte

  • A line break in a single-line field.

    Whitespace, 1 character, 1 byte

  • ⟦CR⟧

    A Windows line break.

    Whitespace, 2 characters, 2 bytes

  • leading space

    Is the value trimmed, or does it become a different record?

    Whitespace, 14 characters, 14 bytes

  • trailing space

    Looks the same as the trimmed value on screen.

    Whitespace, 15 characters, 15 bytes

  • line one line two

    A newline inside a value: breaks CSV rows, log lines and headers.

    Whitespace, 17 characters, 17 bytes

  • non⟦U+00A0⟧breaking

    A no-break space: trim() and split(" ") treat it differently from a space.

    Whitespace, 12 characters, 13 bytes

  • ⟦U+3000⟧

    A full-width space; blank, and not removed by a plain ASCII trim.

    Whitespace, 1 character, 3 bytes

  • line⟦U+2028⟧separator

    A line break that JSON, regexes and many editors do not count as one.

    Whitespace, 14 characters, 16 bytes

  • ad⟦U+200B⟧min

    Looks like "admin" and compares unequal. Duplicate-account and allow-list checks miss it.

    Invisible and tricky Unicode, 6 characters, 8 bytes

  • ⟦U+200B⟧

    Looks empty, passes a "not empty" check.

    Invisible and tricky Unicode, 1 character, 3 bytes

  • a⟦U+200D⟧b

    Invisible joiner between two letters.

    Invisible and tricky Unicode, 3 characters, 5 bytes

  • ⟦U+FEFF⟧value

    A byte order mark at the start, as left by some editors and exports.

    Invisible and tricky Unicode, 6 characters, 8 bytes

  • ⟦U+3164⟧

    Renders blank but is a letter, so "must not be blank" checks accept it.

    Invisible and tricky Unicode, 1 character, 3 bytes

  • ⟦U+2800⟧

    A blank-looking symbol that is not whitespace.

    Invisible and tricky Unicode, 1 character, 3 bytes

  • invoice⟦U+202E⟧txt.exe

    The right-to-left override reverses what follows it, so a file named "invoice" + override + "txt.exe" is shown as "invoiceexe.txt" while it really ends in .exe.

    Invisible and tricky Unicode, 15 characters, 17 bytes

  • مرحبا بالعالم

    Right-to-left text: alignment, cursor movement and truncation.

    Invisible and tricky Unicode, 13 characters, 25 bytes

  • abc אבג 123

    Mixed directions in one line; digits and punctuation reorder.

    Invisible and tricky Unicode, 11 characters, 14 bytes

  • pаypal

    The "a" is Cyrillic. Looks identical to "paypal" and is a different string.

    Invisible and tricky Unicode, 6 characters, 7 bytes

  • Αpple

    The first letter is Greek capital alpha.

    Invisible and tricky Unicode, 5 characters, 6 bytes

  • café

    The "é" is "e" plus a combining accent: 5 code points that look like 4 characters, unequal to the composed form.

    Invisible and tricky Unicode, 5 characters, 6 bytes

  • café

    The composed form of the same word. Store both and compare.

    Invisible and tricky Unicode, 4 characters, 5 bytes

  • Å

    Angstrom sign, which normalizes to a different character (Å) and so changes under NFC.

    Invisible and tricky Unicode, 1 character, 3 bytes

  • ffi

    The "ffi" ligature as one character: length 1, uppercases to "FFI" (length 3), and NFKC turns it into three.

    Invisible and tricky Unicode, 1 character, 3 bytes

  • ⟦U+FF21⟧⟦U+FF22⟧⟦U+FF23⟧⟦U+FF11⟧⟦U+FF12⟧⟦U+FF13⟧

    Fullwidth letters and digits: look like ASCII, compare unequal, and NFKC makes them ASCII.

    Invisible and tricky Unicode, 6 characters, 18 bytes

  • Z͑ͫ̓ͪ̂ͫ̽⟦U+034F⟧̴̙̤̞͉͚à́̂̃̄̅̆̇l̀́̂̃̄̅̆̇g̀́̂̃̄̅̆̇ò́̂̃̄̅̆̇

    Stacked combining marks that spill out of the line.

    Invisible and tricky Unicode, 51 characters, 97 bytes

  • 😀

    One character, two UTF-16 units, four UTF-8 bytes.

    Invisible and tricky Unicode, 1 character, 4 bytes

  • 👨‍👩‍👧‍👦

    One visible character made of seven code points; cut in the middle, it falls apart into four people.

    Invisible and tricky Unicode, 7 characters, 25 bytes

  • 🏳️‍🌈

    A flag built from a flag, a variation selector, a joiner and a rainbow.

    Invisible and tricky Unicode, 4 characters, 14 bytes

  • 👍🏽

    An emoji with a modifier: two code points, one character.

    Invisible and tricky Unicode, 2 characters, 8 bytes

  • ⟦U+D83D⟧

    Half of a surrogate pair. Not valid Unicode: JSON and UTF-8 encoders replace or reject it.

    Invisible and tricky Unicode, 1 character, 3 bytes

  • ⟦U+10FFFF⟧

    The last valid code point, a noncharacter.

    Invisible and tricky Unicode, 1 character, 4 bytes

  • tag⟦U+E0041⟧⟦U+E0042⟧

    Invisible tag characters that can smuggle hidden text.

    Invisible and tricky Unicode, 5 characters, 11 bytes

  • before⟦U+0000⟧after

    A NUL byte inside a value: ends the string in C and some databases.

    Invisible and tricky Unicode, 12 characters, 12 bytes

  • ⟦U+FFFD⟧

    The replacement character, as left by an earlier decoding error.

    Invisible and tricky Unicode, 1 character, 3 bytes

  • İstanbul ısı

    Dotted capital İ and dotless ı: case conversion depends on locale.

    Invisible and tricky Unicode, 12 characters, 15 bytes

  • Straße

    Uppercases to "STRASSE": a different length.

    Invisible and tricky Unicode, 6 characters, 7 bytes

  • ΟΔΟΣ

    Lowercases to a word ending in the final sigma "ς", not "σ".

    Invisible and tricky Unicode, 4 characters, 8 bytes

  • é́́́́́́́́́́́́́́́́́́́́́́́́́́́́́́́́́́́́́́́

    Forty accents on one letter.

    Invisible and tricky Unicode, 41 characters, 81 bytes

  • café

    Mojibake: UTF-8 text that was read as Windows-1252. Seen in imports and old exports.

    Encoding damage, 5 characters, 7 bytes

  • “quotedâ€⟦U+009D⟧

    The same damage on curly quotes.

    Encoding damage, 12 characters, 20 bytes

  • café

    Damaged twice.

    Encoding damage, 7 characters, 11 bytes

  • &#169; &#x1F600;

    Numeric character references in a field that is not HTML.

    Encoding damage, 16 characters, 16 bytes

  • %E2%9C%93%20ok

    Is already-encoded input decoded, encoded again, or kept?

    Encoding damage, 14 characters, 14 bytes

  • %c0%af

    An overlong UTF-8 encoding of "/" that filters have missed.

    Encoding damage, 6 characters, 6 bytes

  • dGVzdA==

    Looks like Base64; does anything decode it on its own?

    Encoding damage, 8 characters, 8 bytes

  • O'Brien

    An apostrophe in a real surname: breaks naive SQL and quote handling.

    Real names that break rules, 7 characters, 7 bytes

  • Null

    A real surname that systems turn into a missing value.

    Real names that break rules, 4 characters, 4 bytes

  • Smith-Jones

    A hyphenated family name.

    Real names that break rules, 11 characters, 11 bytes

  • Ng

    A two-letter name, and "X" alone is a legal given name in places.

    Real names that break rules, 2 characters, 2 bytes

  • Sukarno

    One name only: there is no first and last.

    Real names that break rules, 7 characters, 7 bytes

  • Wolfeschlegelsteinhausenbergerdorff

    A long real surname.

    Real names that break rules, 35 characters, 35 bytes

  • 李小龍

    No spaces, three characters, 9 UTF-8 bytes.

    Real names that break rules, 3 characters, 9 bytes

  • Nguyễn Thị Hồng Nhung

    Stacked diacritics in Vietnamese; very often stored decomposed.

    Real names that break rules, 21 characters, 27 bytes

  • Mary Jo van der Berg

    Several spaces and particles.

    Real names that break rules, 20 characters, 20 bytes

  • Bruce Wayne 3rd

    A digit in a name field.

    Real names that break rules, 15 characters, 15 bytes

  • 0

    Zero as text: false in some languages, and a valid value.

    Numbers and keywords as text, 1 character, 1 byte

  • -0

    Negative zero.

    Numbers and keywords as text, 2 characters, 2 bytes

  • 0.30000000000000004

    The result of 0.1 + 0.2 in binary floating point.

    Numbers and keywords as text, 19 characters, 19 bytes

  • 2147483648

    One more than the largest signed 32-bit integer.

    Numbers and keywords as text, 10 characters, 10 bytes

  • -2147483649

    One less than the smallest signed 32-bit integer.

    Numbers and keywords as text, 11 characters, 11 bytes

  • 4294967296

    One more than the largest unsigned 32-bit integer.

    Numbers and keywords as text, 10 characters, 10 bytes

  • 9007199254740993

    Not representable as a double: becomes 9007199254740992.

    Numbers and keywords as text, 16 characters, 16 bytes

  • 9223372036854775808

    One more than the largest signed 64-bit integer.

    Numbers and keywords as text, 19 characters, 19 bytes

  • 1e309

    Overflows a double to Infinity.

    Numbers and keywords as text, 5 characters, 5 bytes

  • NaN

    Not a number, written as text.

    Numbers and keywords as text, 3 characters, 3 bytes

  • Infinity

    Parsed as a number by some languages.

    Numbers and keywords as text, 8 characters, 8 bytes

  • 0x1F

    Parsed as a number by some parsers and not by others.

    Numbers and keywords as text, 4 characters, 4 bytes

  • 010

    Eight or ten? A leading zero changes the meaning in some parsers.

    Numbers and keywords as text, 3 characters, 3 bytes

  • 1,000.50

    Comma thousands separator.

    Numbers and keywords as text, 8 characters, 8 bytes

  • 1.000,50

    The same amount in many European locales.

    Numbers and keywords as text, 8 characters, 8 bytes

  • ١٢٣

    Arabic-Indic digits: \d matches them in some regex engines and parseInt rejects them.

    Numbers and keywords as text, 3 characters, 6 bytes

  • ⟦U+FF11⟧⟦U+FF12⟧⟦U+FF13⟧

    Fullwidth digits.

    Numbers and keywords as text, 3 characters, 9 bytes

  • null

    The word, not the value.

    Numbers and keywords as text, 4 characters, 4 bytes

  • undefined

    What JavaScript prints for a missing value.

    Numbers and keywords as text, 9 characters, 9 bytes

  • None

    What Python prints for a missing value.

    Numbers and keywords as text, 4 characters, 4 bytes

  • true

    A boolean written as text.

    Numbers and keywords as text, 4 characters, 4 bytes

  • [object Object]

    What an object looks like after bad string conversion.

    Numbers and keywords as text, 15 characters, 15 bytes

  • nil

    What Ruby and Go print for a missing value.

    Numbers and keywords as text, 3 characters, 3 bytes

  • \N

    The text-export marker for NULL in MySQL.

    Numbers and keywords as text, 2 characters, 2 bytes

  • 2024-02-29

    Valid only in leap years.

    Dates and times, 10 characters, 10 bytes

  • 2023-02-29

    Not a date; some parsers roll it to 1 March.

    Dates and times, 10 characters, 10 bytes

  • 0000-00-00

    The "zero date" some databases accept and others reject.

    Dates and times, 10 characters, 10 bytes

  • 1970-01-01T00:00:00Z

    The Unix epoch: often treated as "no date".

    Dates and times, 20 characters, 20 bytes

  • 2038-01-19T03:14:08Z

    One second past the signed 32-bit time limit.

    Dates and times, 20 characters, 20 bytes

  • 2016-12-31T23:59:60Z

    A leap second; many parsers refuse it.

    Dates and times, 20 characters, 20 bytes

  • 9999-12-31T23:59:59Z

    The last second many systems can store.

    Dates and times, 20 characters, 20 bytes

  • 03/04/2025

    March 4th or April 3rd?

    Dates and times, 10 characters, 10 bytes

  • 2025-03-09T02:30:00

    A local time that does not exist in US time zones.

    Dates and times, 19 characters, 19 bytes

  • first.last+tag@example.com

    A valid address that many forms reject.

    Emails, URLs and identifiers, 26 characters, 26 bytes

  • "first last"@example.com

    A valid address with a space in it.

    Emails, URLs and identifiers, 24 characters, 24 bytes

  • user@localhost

    Valid in mail systems, refused by many validators.

    Emails, URLs and identifiers, 14 characters, 14 bytes

  • user@exämple.com

    An internationalized domain name.

    Emails, URLs and identifiers, 16 characters, 17 bytes

  • aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@example.com

    The longest allowed local part (64 characters).

    Emails, URLs and identifiers, 76 characters, 76 bytes

  • aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@example.com

    One over the local part limit.

    Emails, URLs and identifiers, 77 characters, 77 bytes

  • https://user:pass@example.com/

    Credentials in a URL.

    Emails, URLs and identifiers, 30 characters, 30 bytes

  • http://[::1]:8080/

    An IPv6 literal host.

    Emails, URLs and identifiers, 18 characters, 18 bytes

  • #section

    A relative reference.

    Emails, URLs and identifiers, 8 characters, 8 bytes

  • https://例え.テスト/パス?q=値

    Non-ASCII host, path and query.

    Emails, URLs and identifiers, 21 characters, 37 bytes

  • +1 (555) 010-0100 ext. 7

    Punctuation, a country code and an extension.

    Emails, URLs and identifiers, 24 characters, 24 bytes

  • 00000000-0000-0000-0000-000000000000

    The nil UUID: valid, and often treated as "unset".

    Emails, URLs and identifiers, 36 characters, 36 bytes

  • 123E4567-E89B-12D3-A456-426614174000

    Uppercase: equal to the lowercase form, unequal as text.

    Emails, URLs and identifiers, 36 characters, 36 bytes

  • 192.168.001.001

    Decimal or octal? Parsers disagree.

    Emails, URLs and identifiers, 15 characters, 15 bytes

  • 127.1

    A shortened loopback address that parsers and browsers accept.

    Emails, URLs and identifiers, 5 characters, 5 bytes

  • a,"b",c

    Commas and quotes inside a value; exports must quote and double them.

    Spreadsheet formulas, 7 characters, 7 bytes

  • %_

    LIKE wildcards in a search box.

    Injection, 2 characters, 2 bytes

  • invoice.pdf.exe

    A file name that looks like a PDF.

    Paths and reserved names, 15 characters, 15 bytes

  • CON

    A reserved device name on Windows.

    Paths and reserved names, 3 characters, 3 bytes

  • NUL.txt

    Reserved on Windows even with an extension.

    Paths and reserved names, 7 characters, 7 bytes

  • COM1

    Another reserved name on Windows.

    Paths and reserved names, 4 characters, 4 bytes

  • report.

    Windows removes the trailing dot, so this collides with "report".

    Paths and reserved names, 7 characters, 7 bytes

  • .htaccess

    A hidden configuration file name.

    Paths and reserved names, 9 characters, 9 bytes

  • fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff.txt

    259 characters, over the 255-byte limit of most file systems.

    Paths and reserved names, 259 characters, 259 bytes

  • README.md

    Collides with "readme.md" on case-insensitive file systems.

    Paths and reserved names, 9 characters, 9 bytes

  • résumé 日本語 😀.pdf

    Non-ASCII file name: headers, ZIP entries and paths encode it differently.

    Paths and reserved names, 16 characters, 27 bytes

How it works

The list is built into the page: 158 strings in eleven groups, from empty values and whitespace to invisible Unicode, encoding damage, real names that break validation rules, numbers and keywords written as text, dates, emails and URLs, spreadsheet formulas, injection and paths. Each string says what it tests. Search matches the name, the reason and the value, including code points such as U+200B. Copy one string, or copy and download the filtered list as JSON, JavaScript, Python, CSV or one value per line. JSON, JavaScript and Python exports escape invisible characters. CSV preserves values with CSV quoting, and one-per-line export keeps raw values.

The full method, every rule and worked examples are on docs.tamperbox.dev.

Limits and interpretation

Active payloads (injection, spreadsheet formulas and path traversal) are hidden until you include them. They are built to be acted on if they reach a parser, interpreter or file system, so use them only against systems you own or are allowed to test. None of them is malware and none needs a network. The list is a starting set, not a complete security test: a value that is stored and shown unchanged has passed, and anything else is worth a closer look. The one-per-line format cannot hold values that contain line breaks; use JSON or CSV for those. Nothing is stored.

Frequently asked questions

What is a naughty string?

A value that is valid input from a person or another system but that software often mishandles: an apostrophe in a surname, an emoji that is two units long in JavaScript, a zero width space that makes two names look the same, or a cell that a spreadsheet runs as a formula.

Is it safe to paste these into a staging system?

The default list is data only and should be stored and shown unchanged. Active payloads are off until you include them, because they are designed to trigger behaviour in systems that mishandle them. Use those only where you are allowed to test.

How is this different from the Big List of Naughty Strings?

The idea is the same. This set is smaller, every string carries a reason, active payloads are separated from plain data, and the list can be filtered and exported with invisible characters escaped.

References

OWASP Web Security Testing Guide · OWASP: CSV Injection · Unicode Technical Standard #39: Unicode Security Mechanisms · RFC 5321: Simple Mail Transfer Protocol, section 4.5.3.1 · Microsoft: Naming files, paths, and namespaces.

Are you an AI agent? You are in the right place.

This page and every tool are available as plain text with their methods and limits, and the same checks run over MCP.