4.9 KiB
4.9 KiB
Configuration Reference
This file maps the top-level configuration keys used by uploadshield.json (UploadShield) to their effect and defaults. Use absolute paths in production where possible.
Top-level sections
-
modules(object): enable or disable features by name. Keys used in code:flood(bool) — per-IP upload counting and flood alerts. Default:true.filename(bool) — runFilenameDetector. Default:true.mime_sniff(bool) — runMimeDetector& content sniffing. Default:true.hashing(bool) — compute hashes for forensic records. Default:true.base64_detection(bool) — detect JSON/base64 embedded payloads in raw bodies. Default:true.raw_peek(bool) — allow guarded reads ofphp://input. Disabled by default (false) because it may consume request bodies.archive_inspect(bool) — inspect archives moved to quarantine. Default:true.quarantine(bool) — enable quarantine moves. Default:true.
-
paths(object): filesystem locations used by the script. Common keys:log_file(string) — path to JSON log file. Default:logs/uploads.log(relative to script). Recommended: absolute path under a per-site.securityfolder.quarantine_dir(string) — path to quarantine directory. Default:quarantine.state_dir(string) — path to store flood counters/state. Default:state.allowlist_file(string) — optional allowlist of URIs/content-types. Default:allowlist.json.
-
limits(object): thresholds controlling scanning and resource limits.max_size(int) — bytes threshold forbig_uploadwarning. Default:52428800(50 MB).raw_body_min(int) — min bytes for raw body events. Default:512000(500 KB).sniff_max_bytes(int) — bytes to read from a file head for content sniffing. Default:8192(8 KB).sniff_max_filesize(int) — only sniff files up to this size. Default:2097152(2 MB).hash_max_filesize(int) — max file size to compute hashes for. Default:10485760(10 MB).archive_max_inspect_size(int) — skip inspecting archives larger than this. Default:52428800(50 MB).archive_max_entries(int) — max entries to inspect inside an archive. Default:200.
-
ops(object): operator-facing options.quarantine_owner/quarantine_group(string) — desired owner:group for quarantine. Default:root:www-data.quarantine_dir_perms(string) — octal string for dir perms (recommended0700). Default:0700.block_suspicious(bool) — whentruethe script returns 403 for suspicious uploads. Default:false(observe mode).log_rotate(object) — hints for log rotation (size, keep, enabled) used in examples.trusted_proxy_ips(array) — proxies allowed to signal buffered bodies or peek permission.
-
allowlists(object): reduce false positives for known safe flows.base64_uris(array of strings) — substrings or PCRE (when wrapped with#) matching URIs to ignore for base64/raw detections.ctypes(array of strings) — content-types treated as trusted for encoded payloads (e.g.,image/svg+xml).
Detector-specific keys
detectors.content(object)sniff_max_bytes(int) — overridelimits.sniff_max_bytesfor content detector.sniff_max_filesize(int) — overridelimits.sniff_max_filesize.allow_xml_eval(bool) — relaxeval()detection for XML/SVG content when true.custom_patterns(array) — array of PCRE patterns (as strings) applied to the file head. Invalid patterns are ignored.
Example uploadshield.json
{
"modules": { "flood": true, "filename": true, "mime_sniff": true, "hashing": true, "base64_detection": true, "raw_peek": false, "archive_inspect": true, "quarantine": true },
"paths": { "log_file": "/var/www/site/.security/logs/uploads.log", "quarantine_dir": "/var/www/site/quarantine", "state_dir": "/var/www/site/state", "allowlist_file": "/var/www/site/.security/allowlist.json" },
"limits": { "max_size": 52428800, "raw_body_min": 512000, "sniff_max_bytes": 8192, "sniff_max_filesize": 2097152 },
"ops": { "quarantine_owner": "root", "quarantine_group": "www-data", "quarantine_dir_perms": "0700", "block_suspicious": false },
"allowlists": { "base64_uris": ["/api/uploads/avatars"], "ctypes": ["image/svg+xml"] }
}
Operational tips
- Keep
block_suspiciousdisabled while tuning; useallowlists.base64_urisandctypesto reduce false positives. - Avoid enabling
raw_peekunless your front end buffers request bodies or you accept the risk of consumingphp://input. - Use absolute paths in
paths.*when deploying under systemd/Ansible to avoid cwd surprises. - Ensure
quarantine_diris inaccessible from the web and set to ownerrootand mode0700; files inside should be0600.
If you want, I can generate a per-site uploadshield.json filled with your preferred absolute paths and ownership values.
--