Zum Hauptinhalt springen
tsecurity.de LIVE
Echtzeit-Radar & Feeds
Alle RSS Feeds ➔
👥 Community & Social
•
Windows Tipps & SecurityBatterietester für unter 10 Euro: So prüfen Sie leere Batterien schnell(24.09.2026 um 13:14 Uhr)
•
Windows Tipps & SecurityBentley bringt sein erstes Elektroauto auf den Markt(24.09.2026 um 13:49 Uhr)
••
Windows Tipps & SecurityAvocor integriert Korbyt-CMS in B-Series Displays(24.09.2026 um 13:05 Uhr)
•
Windows Tipps & SecuritydBTechnologies erweitert Opera-Familie um Nona-Serie(24.09.2026 um 13:15 Uhr)
•
Windows Tipps & SecurityJens Miedek wird Senior Vice President Sales bei Qvest(24.09.2026 um 13:20 Uhr)
•
Windows Tipps & SecurityBenQ bringt vier neue Boards mit KI-Beschleuniger(24.09.2026 um 13:33 Uhr)
••
Unix & Linux Server(中文) 小U同学更新:操作更少,秒回更快(24.09.2026 um 13:04 Uhr)
••
Windows Tipps & SecurityBatterietester für unter 10 Euro: So prüfen Sie leere Batterien schnell(24.09.2026 um 13:14 Uhr)
•
Windows Tipps & SecurityBentley bringt sein erstes Elektroauto auf den Markt(24.09.2026 um 13:49 Uhr)
••
Windows Tipps & SecurityAvocor integriert Korbyt-CMS in B-Series Displays(24.09.2026 um 13:05 Uhr)
•
Windows Tipps & SecuritydBTechnologies erweitert Opera-Familie um Nona-Serie(24.09.2026 um 13:15 Uhr)
•
Windows Tipps & SecurityJens Miedek wird Senior Vice President Sales bei Qvest(24.09.2026 um 13:20 Uhr)
•
Windows Tipps & SecurityBenQ bringt vier neue Boards mit KI-Beschleuniger(24.09.2026 um 13:33 Uhr)
••
Unix & Linux Server(中文) 小U同学更新:操作更少,秒回更快(24.09.2026 um 13:04 Uhr)
•
Intelligence View
⚡ tsecurity.de Intelligence

Assembling a KYC packet on Deno Deploy

Compliance owns the KYC application template, not engineering — and they revise it without filing a ticket. Hardcode the field names once and the next template swap either breaks silently (a field goes unfilled) or throws unknown_field in p…

0
↗ Quelle (dev.to)
Reagiere als Erste:r — dein Feedback zählt!

Compliance owns the KYC application template, not engineering — and they revise it without filing a ticket. Hardcode the field names once and the next template swap either breaks silently (a field goes unfilled) or throws unknown_field in production. The fix is to stop assuming the shape of a PDF you don't control: ask it, at request time, what fields it actually has, fill whatever comes back, then merge the filled application with the applicant's uploaded ID scan into one packet. Here's the whole flow in ~45 lines on Deno Deploy, using the new pdfops-sdk instead of raw fetch calls.






Why inspect first



Every other example on this blog hardcodes a JSON object of field names — reasonable when the template PDF is a file you committed to your own repo. A KYC application template isn't that. It's owned by a compliance or ops team who edit it in Acrobat, rename a field, add a new disclosure checkbox, and re-upload it to wherever your app fetches it from — all without a code review on your side. Filling against a hardcoded key list against a template you don't control is a bug waiting for the next revision.



POST /api/inspect answers "what fields does this PDF have right now?" — every AcroForm field's name, type, and (for dropdowns/radios) its options, plus a ready-to-fill fillTemplate object keyed by name. Call it once per request against the live template, and the fill step only ever writes into fields that actually exist. A template revision changes what gets filled, not whether the request throws.






Install the SDK, get a key



Every earlier post here uses fetch and FormData directly against the HTTP API — that still works and always will. pdfops-sdk is a thin typed wrapper around the same endpoints: no dependencies, edge-safe (Workers, Vercel Edge, Deno, Bun, Node 18+, browsers), and it turns the multipart plumbing into three method calls.




npm install pdfops-sdk






You need a key to run more than the anonymous trial. A free one costs nothing and needs no card — email in, key out (the key arrives by email, not in the response body, so inbox possession is the verification step):




import { PdfOps } from 'pdfops-sdk';

const trial = new PdfOps(); // no key: 100 requests/IP/month
await trial.signup('[email protected]'); // free key, 250/month, no card — check your inbox






Once the key lands, wire it in and every call meters against your own quota instead of your IP's:




const pdfops = new PdfOps({ apiKey: Deno.env.get('PDFOPS_API_KEY') });









The Deno Deploy handler



The endpoint takes a multipart POST — the applicant's data as a JSON field, their ID scan as a file — pulls the current application template, inspects it, fills only the fields it finds, and merges in the ID scan. No browser, no second runtime, ~45 lines.




// main.ts — Deno Deploy
import { PdfOps, PdfOpsError } from 'pdfops-sdk';

const pdfops = new PdfOps({ apiKey: Deno.env.get('PDFOPS_API_KEY') });

Deno.serve(async (req: Request) => {
if (req.method !== 'POST') {
return new Response('POST multipart/form-data: applicant, id_scan', { status: 405 });
}

const form = await req.formData();
const idScan = form.get('id_scan');
const applicantRaw = form.get('applicant');
if (!(idScan instanceof File) || typeof applicantRaw !== 'string') {
return new Response('expected fields "applicant" (JSON) and "id_scan" (file)', { status: 400 });
}
const applicant: Record<string, unknown> = JSON.parse(applicantRaw);

// 1. Pull the CURRENT template — compliance swaps this file on their
// own schedule, so the fetch (not a bundled asset) is deliberate.
const templateResp = await fetch(Deno.env.get('TEMPLATE_URL')!);
const template = new Uint8Array(await templateResp.arrayBuffer());

// 2. Ask the template what fields it has right now, instead of
// assuming a fixed shape.
const { fillTemplate } = await pdfops.inspect(template);

// 3. Map applicant data onto whatever fields actually exist. A field
// the template dropped is silently skipped; a field the applicant
// didn't send stays at the template's default.
const values: Record<string, string> = {};
for (const name of Object.keys(fillTemplate)) {
if (name in applicant) values[name] = String(applicant[name]);
}

try {
// 4. Fill the application.
const filled = await pdfops.fillForm(template, values);

// 5. Merge the filled application with the uploaded ID scan into
// one packet — page order follows array order.
const idBytes = new Uint8Array(await idScan.arrayBuffer());
const packet = await pdfops.merge([filled, idBytes]);

return new Response(packet, { headers: { 'content-type': 'application/pdf' } });
} catch (e) {
if (e instanceof PdfOpsError) {
return new Response(JSON.stringify({ error: e.code, details: e.message }), { status: e.status });
}
throw e;
}
});






deployctl deploy main.ts, set PDFOPS_API_KEY and TEMPLATE_URL as environment variables, and you have a live endpoint. The fillForm and merge calls both return Uint8Array PDF bytes — hand them to storage, a Response, or an email attachment as-is; nothing in this handler buffers more than one document at a time.






Why merge goes last, and what else it can hold



merge([filled, idBytes]) concatenates pages in array order, so the filled application always lands as page 1 — the reviewer opens the packet and reads the application first, attachments after. The array isn't capped at two: a real KYC packet is usually merge([filled, idFront, idBack, proofOfAddress]) — every attachment the applicant uploaded, in the order you want a reviewer to see them, still one POST /api/merge call.






Errors and watching your quota



Every non-2xx response the SDK sees throws a PdfOpsError with the API's stable error slug — the catch block above turns unknown_field, invalid_pdf, or a 429 rate_limited straight into the right HTTP status for the caller, instead of a generic 500. And because the free tier has a real ceiling (250/month per key), check it before you're surprised by one:




const { used, remaining, resets_at } = await pdfops.usage();






That's GET /api/usage under the hood — it reads the same counter the 429 fires on, so the number you show a user is never out of sync with the number that blocks them.






Where this fits a real app



Swap the runtime and the trigger, and the same three-call shape — inspect, fill, merge — covers most "combine a filled form with something a user uploaded" flows:



The part that's new here is inspect in the chain — reach for it whenever the template isn't a file you fully control, not just for KYC packets.






Try it



All three endpoints are live. Prove the chain from your terminal before writing a line of Deno:




# 1. What fields does this template have?
curl -X POST https://pdfops.dev/api/inspect -F "[email protected]"

# 2. Fill it
curl -X POST https://pdfops.dev/api/fill-form \
-F "[email protected]" \
-F 'fields={"applicant_name":"Ada Lovelace","country":"UK"}' \
-o filled.pdf

# 3. Merge with the ID scan
curl -X POST https://pdfops.dev/api/merge \
-F "[email protected]" -F "[email protected]" \
-o packet.pdf






You get 100 keyless requests per IP per month, or pdfops.signup('[email protected]') / the form at /pricing for a free key (250/mo, no card — delivered by email).



Building a KYC or onboarding flow and something about inspect's field-type coverage doesn't fit yours? Drop a note on the feedback form — it's the fastest way to influence what ships next.

SOC Incident Playbook: Remote Code Execution (RCE) Defense
title: Detect Exploitation - Assembling a KYC packet on Deno Deploy
id: b88d376d-22aa-4b00-8114-57cf712ecdb2
status: experimental
description: Automatisch generierte SIEM-Erkennungsregel basierend auf CTI Intelligence
references:
  - https://tsecurity.de/
author: iShareStuff CTI Automated Detection Engine
date: 2026-09-24
logsource:
  category: network_connection
  product: any
detection:
  selection:
      CommandLine|contains:
        - 'exploit'
  condition: selection
falsepositives:
  - Legitime administrative Zugriffe oder Penetrationstests
level: high
tags:
  - attack.initial_access
rule CTI_Threat_Indicator {
    meta:
        author = "iShareStuff CTI Automated Detection Engine"
        date = "2026-09-24"
        description = "YARA Signature for "
    strings:
        $str = "Assembling a KYC packet on Den" ascii wide
    condition:
        any of them
}
tsecurity.de Cognitive Threat RAG
Fokus-Vektor:

Kognitive Analyse für identifizierte Bedrohung: Erhöhte Bedrohungslage im Bereich Assembling a KYC packet on Deno Deploy.... Basierend auf 368k Vektor-Korrelationen werden sofortige Isolationsmaßnahmen für betroffene Endpunkte empfohlen.

🛡️ Angriffsfläche & Exposure

Netzwerk/Remote-Zugriff ohne Vorauthentifizierung möglich.

⚡ Empfohlene Sofortmaßnahmen
  • 1. Perimeter-Inspektion: Relevante Portfreigaben und exponierte Endpunkte unverzüglich scannen.
  • 2. Patch-Applikation: Hersteller-Hotfix einspielen oder betroffene Daemons in isolierte DMZ-Segmente überführen.
  • 3. Telemetrie & EDR-Alerts: Prozessaufrufe und Child-Processes auf anomale Shell-Spawns überwachen.
🔗 Semantisch verwandte Zero-Days MariaDB 11.7 VEC
Ähnliche Beiträge
🔍 Verwandte News

Auch interessante Nachrichten Assembling a KYC packet on Deno Deploy

Thematisch verwandte Begriffe: Assembling, packet, Deno, Deploy · 6 Treffer

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Zum Aktualisieren ziehen
ZERO-DAY CVE-2026-97152 | Nanomsg versions 0.5-beta through 1.x before 1.2.3 has a remotely exploi…
Advisory →
TTS Reader • tsecurity.de Voice
tsecurity.de Icon
tsecurity.de App
Offline-Lesen, Eilmeldungen & 0ms Ladezeit

Installiere tsecurity.de direkt auf deinen Home-Bildschirm für das ultimative Vollbild-Magazinerlebnis ohne Browser-Leisten.

Nächster Beitrag
Themen-Radar & Intelligence Matrix
Echtzeit-Taxonomie nach Angriffsvektoren & Plattformen

tsecurity.de Live Threat Radar

🔴 LIVE RADAR
MONITORING
AKTIV
CVE-DATENBANK
LIVE
🔍
Community Radar & Live Chat
Sentinel Bot online • Live-Stream
Dein Cluster: Security Explorer
Match:
lädt…
Verbindung zum Community-Stream wird aufgebaut...
Bearbeitungsmodus — Senden überschreibt deine Nachricht
Community-Puls — was gerade passiert
lädt…
Aktivitäten deiner Analysten
lädt…
Neues Thema oder Eilmeldung einreichen

Reiche interessante Links, Zero-Days oder Debatten ein. Die Community entscheidet per Upvote über die Veröffentlichung.

Heiß diskutierte Einreichungen
🔖 Gespeicherte Artikel
📂 Keine gespeicherten Artikel vorhanden.
Zurück Ziehen Vor
Links: vorheriger Artikel • Rechts: nächster Artikel • unten: schließen
News NIS-2 Frühwarnung Tier-1 Intel TTP ⏱️ 3 Min vor 10 Min
Artikeldaten werden geladen...

Zurück: vorheriger • Vor: nächster
↗ Original-Quelle
Social Reaktionen Deine Reaktion zählt
Einstufung & Relevanz-Poll 0 Stimmen
In sozialen Netzwerken teilen 1-Klick