...

File Upload Security, Built In

Validation, malware detection, encrypted delivery, and access control in one API. Ship a hardened upload pipeline on day one and scale it globally from a single integration.

99.9%
Platform uptime
100K+
Applications secured
Trusted by teams at
SendGrid logo with stylized gray text and overlapping square shapes on the left.
LinkedIn logo followed by the word SlideShare in gray text on a light background.
The word teachable is written in all lowercase, sans-serif letters with a colon between teach and able, in a light purple color on a light background.
A gray Airtable logo featuring a geometric cube design to the left of the word Airtable in bold, modern font.
5 controls
SOC 2 Type II certified 99.9% platform uptime Multi-region storage Global CDN delivery TLS encryption in transit

A Secure Layer in Front of Your Infrastructure

Six controls run on every file before a byte reaches your systems.

Untrusted

Upload Sources

  • Web and mobile uploads
  • Server and API uploads
  • Import by URL
  • Third-party integrations

May carry malware, embedded scripts, disguised and oversized files.

Filestack ingestion layer

Six Controls Run Automatically on Every File

TLS encryption in transit MIME and signature validation Malware and virus scan HMAC-SHA256 policy signing Tokenized access control Activity and audit logging

Malicious and invalid files are rejected here. Only clean, signed files pass through to your stack.

Trusted

Your Infrastructure

  • Your backend and APIs
  • Cloud storage on S3, GCS, or Azure
  • Global CDN delivery

Only validated, signed, access-controlled files.

Close the Six Attack Vectors at the Upload Layer

Pick an attack vector to see the safeguard that closes it.

Malware

Files Carrying Viruses, Trojans, or Spyware

A file that infects devices or internal systems the moment it is opened.

Stopped by Malware and virus scanning. Security documentation →

XSS

Scripts Embedded in an Uploaded File

An SVG or HTML fragment that executes in the browser when it is served back.

Stopped by MIME validation and script stripping. Security documentation →

Ransomware

Payloads Engineered to Encrypt and Spread

A file built to encrypt systems and move laterally once executed.

Stopped by Malware scanning and signed delivery. Scan inside a workflow →

Backend

Infrastructure Reached Through a File Input

Attackers probe the code that handles uploads: parsers, image libraries, archive extractors.

Stopped by An isolated ingestion layer. How ingestion works →

Access

Files Read or Written Without Authorization

Weak controls let an attacker download, overwrite, or enumerate files they should never see.

Stopped by Tokenized URLs and policy signing. Policies and signatures →

SSRF

Import by URL Turned Against the Network

A supplied URL fetched without restriction reaches internal endpoints and metadata services.

Stopped by URL-fetch allow-listing. Store by URL →

Secure Uploads in Your Language

One SDK gives you the whole pipeline: validation, scanning, policy signing, signed delivery.

  • Server-side policy signing, so the application secret stays on your server
  • Scoped, expiring tokens on every request
  • Type and size allow-lists enforced at the ingestion layer
import * as filestack from 'filestack-js';

const client = filestack.init('YOUR_API_KEY');

// policy and signature are generated server-side
client.picker({
  security: { policy, signature },
  accept: ['image/*', 'application/pdf'],
  maxSize: 25 * 1024 * 1024,
  onUploadDone: (res) => {
    console.log(res.filesUploaded); // scanned and signed
  },
}).open();
from filestack import Client, Security

# the app secret stays on your server
security = Security(policy, app_secret)
client = Client('YOUR_API_KEY', security=security)

filelink = client.upload(filepath='contract.pdf')
print(filelink.handle) # scanned and signed
import { PickerOverlay } from 'filestack-react';

<PickerOverlay
  apikey="YOUR_API_KEY"
  clientOptions={{ security: { policy, signature } }}
  pickerOptions={{
    accept: ['image/*', 'application/pdf'],
    maxSize: 25 * 1024 * 1024,
  }}
  onSuccess={(res) => console.log(res.filesUploaded)}
/>
use Filestack\FilestackClient;
use Filestack\FilestackSecurity;

// the app secret stays on your server
$security = new FilestackSecurity($app_secret);
$client = new FilestackClient($api_key, $security);

$filelink = $client->upload('contract.pdf');
echo $filelink->handle; // scanned and signed

Validated, Scanned Uploads at Any Volume

Every upload is scanned at ingestion, across every supported format, and reachable afterwards only by someone with permission.

  • Every upload validated and scanned automatically, at any volume
  • Blocked files quarantined at ingestion, so only clean files continue to your backend
  • Delivered files reachable through a signed, expiring URL and nothing else
What the upload firewall does to a batch · illustration
contract.pdf
Clean, delivered
2.4 MB
profile-photo.jpg
Clean, delivered
840 KB
resume.pdf.exe
Trojan detected, blocked
1.1 MB
image.svg
Embedded script stripped
96 KB
4 files processed 2 blocked or cleaned 0 reached your backend

Built to Pass Your Security Review

Documented, audited, and enforced by default.

SOC 2 Type II Certified

Controls tested over a period, not on a single day. That is the distinction a Type II report makes.

TLS Encryption in Transit

Encrypted in transit both ways, and at rest in storage.

HMAC-SHA256 Policy Signing

The signature covers the allowed calls and the expiry. Alter either and it stops matching.

Activity Logs for Audit Trails

Upload and access history per file. A bucket policy shows what was permitted, this shows what happened.

Filestack turned our document processing bottleneck into a seamless, secure, and scalable asset pipeline for millions of digital signatures.
Javier Hasbun, CEO, TuFirma.Digital

Secure File Upload Architecture, Written Out

Security

Secure vs. Regular Document Upload Apps

IBM put the average breach at USD 4.88M in 2024. Why a secure upload path is now a compliance requirement.

Read the article →

Developer guide

Implementing Secure File Delivery

Signed URLs, expiry windows, and the headers that decide how a file is rendered.

Read the article →

Tutorial

Securing Web App File Delivery With Webpack

Wired into a build you already have.

Read the article →

Frequently Asked Questions

Does the file reach my backend before it is scanned?

The file never reaches your backend unscanned. Validation, scanning, and signing run in the ingestion layer, between the client and your infrastructure. A file that fails a check is rejected there, so your servers only handle files that already passed every control.

What stops a file that is disguised as another type?

MIME type and file signature validation. The declared type is checked against the actual bytes at the head of the file, so an executable renamed as a PDF is caught by its signature rather than its extension.

How are delivery URLs protected?

Delivery runs on signed URLs. A policy scoping the allowed calls and the expiry is signed server-side with HMAC-SHA256, so a URL cannot be altered or reused outside its window. The application secret stays on your server.

Can an import-by-URL feature be pointed at internal endpoints?

URL fetching is allow-listed, which is the control that closes server-side request forgery through a file input. A supplied URL that resolves to an internal endpoint, a cloud resource, or a metadata service is not fetched.

What can I hand to a security reviewer?

SOC 2 Type II certification, TLS encryption in transit, HMAC-SHA256 policy signing, and activity logs covering upload and access history per file. All four are enforced by default rather than configured per project.

Complete Upload Security in One API

Filestack validates, scans, and signs every upload automatically, and intercepts malware, ransomware payloads, and script injections at the ingestion layer.