silentparams
Find HTTP APIs that silently ignore misspelled query parameters.
You call GET /issues?states=closed. The API only knows state. It does not
answer "unknown parameter": it answers 200 with every open issue, and your
code (or your agent) believes it filtered. Nothing failed, so nothing alerts.
silentparams sends a handful of read-only requests with plausible misspellings
of each parameter in your URL and tells you, per name, whether the API rejects
it, accepts it as an alias, or ignores it without a word.
$ silentparams "https://api.github.com/repos/python/cpython/issues?state=closed&per_page=3"
Parameter 'state=closed': removing it changes the response
states HTTP 200 IGNORED silently (2xx, same as without the parameter)
STATE HTTP 200 IGNORED silently (2xx, same as without the parameter)
zzb22fbb9f HTTP 200 IGNORED silently (2xx, same as without the parameter)
...
RESULT: this API silently ignores unknown parameter names. A typo in a filter returns unfiltered data with HTTP 200.
That is not a bug in GitHub. Ignoring unknown parameters is a common design choice. It just means a typo in your client is invisible, so you should know which APIs behave this way before you trust a filtered result.
Install
pip install silentparams # no dependencies, Python 3.10+
# or the latest code: pip install git+https://github.com/novasdiego1/silentparams
How it works
For each query parameter p in the URL:
| Request | Purpose |
|---|---|
| the URL as given, twice | baseline, and a check that the response is stable |
the URL without p |
what the API returns when p is absent |
p renamed (plural/singular, trailing _, case, snake/kebab/camel, doubled letter) and one nonsense name |
the decoys |
Each decoy is classified by comparing normalized response bodies (JSON is canonicalized, so key order does not matter):
| Verdict | Meaning |
|---|---|
IGNORED silently |
2xx and the same response as without p: the name was dropped without a word |
rejected |
4xx: the API refuses unknown names (the safe behaviour) |
alias |
2xx and the same response as the baseline: the variant is accepted |
different |
2xx with some other response: inconclusive |
It also tells you when removing p changes nothing, which usually means p
itself is being ignored.
Options
-H 'Name: value' extra header (repeatable), e.g. an Authorization token
--ignore-key KEY JSON key to ignore when comparing (timestamps, request ids)
--decoys N decoy names per parameter (default 6)
--max-requests N hard cap on requests sent (default 60)
--delay S seconds between requests (default 0.5)
--json machine-readable report
Exit code: 1 if the API silently ignores unknown names, 0 if not, 2 on
usage errors. That makes it usable as a CI check for an API you own.
If the same request returns different bodies (a timestamp, a request id), the
report warns that results are unreliable: add --ignore-key for those fields.
Be polite
It only sends GET requests, waits between them, and stops at
--max-requests. Point it at APIs you are allowed to query, and mind their
rate limits.
Why this exists
An auditor reported reaching a wrong conclusion this way. They tried four
spellings of a per-author filter (author, agent, agent_id, pubkey) on an
API that only declared authors. Every request returned 200 with unfiltered
rows, so they wrote that no such filter existed. The same API rejected a bad
limit value with 422: it checked values carefully and never checked names.
License
MIT
Metadata
Release files for silentparams 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| silentparams-0.1.0.tar.gz | 11.3 kB | Without provenance | Details for silentparams-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| silentparams-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for silentparams-0.1.0-py3-none-any.whl |
Total release size: 20.8 kB
Release files / silentparams-0.1.0.tar.gz
| Download URL | silentparams-0.1.0.tar.gz |
|---|---|
| Size | 11.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ed541faf75ac2d99003ab9471004579c246c590b24a46e5dbc9caa9c2a49ff91
|
|
BLAKE2b-256 checksum How to use checksums |
858270feb8b9dff62aec8b738fe339ea0c1e752709afa76759097894efc0cd0d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.4
|
Release files / silentparams-0.1.0-py3-none-any.whl
| Download URL | silentparams-0.1.0-py3-none-any.whl |
|---|---|
| Size | 9.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e074c8178b3d478bdf5420d4fa012624e986d8e0ed4a9ce5bf34cc13c6a9cda7
|
|
BLAKE2b-256 checksum How to use checksums |
49241962fe86ef72a1475612feebb0d35811408e029f61298be4af10d0391a13
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.4
|
Security for silentparams 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.