---
title: "Sikker deling af links for udviklere | LinkPilot-bloggen"
url: https://uselinkpilot.com/da/blog/secure-link-sharing-for-developers
description: "En praktisk guide til udviklingsteams: hvornår du bruger engangslinks, hvordan du opretter dem fra et script, og hvordan de passer ind i onboarding og CI."
lang: da
---

Sikkerhed (https://uselinkpilot.com/da/blog/category/security)

# Sikker deling af links for udviklere

En praktisk guide til udviklingsteams: hvornår du bruger engangslinks, hvordan du opretter dem fra et script, og hvordan de passer ind i onboarding og CI.

W. Miller (https://uselinkpilot.com/da/author/w-miller)26. maj 2026 · Opdateret 22. oktober 2026 · Om LinkPilot (https://uselinkpilot.com/da/about)

For en udvikler dukker deling af hemmeligheder som regel op tre steder: **onboarding**, **overdragelse til leverandører** og **hændelseshåndtering**. Her er en udviklers syn på, hvornår du skal bruge et engangslink, hvornår du skal lade være, og hvordan du opretter det fra et script uden at lække hemmeligheden til din shellhistorik undervejs. Vil du prøve mekanismen først, kræver den gratis generator til hemmelige engangslinks (https://uselinkpilot.com/da/tools/free-secret-link-generator) ingen konto.

## Hvornår skal en udvikler bruge et engangslink?

Når der er et menneske i mindst den ene ende af overdragelsen, og værdien ikke må ligge nogen steder bagefter. De typiske tilfælde:

- Onboarding af en ny udvikler med de første loginoplysninger.
- Deling af en midlertidig administratoradgangskode under en hændelse.
- Levering af et token til en leverandør eller konsulent, som ikke skal ligge i din boks.
- Skift af loginoplysninger, hvor den gamle værdi hurtigt skal holde op med at virke.
- Afsendelse af den API-nøgle, du har oprettet til en kunde.

## Hvornår du ikke skal bruge et engangslink

- **Hemmeligheder fra maskine til maskine.** Miljøvariabler i CI (fx GitHub Actions secrets (https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions)), Kubernetes Secrets (https://kubernetes.io/docs/concepts/configuration/secret/) og dynamiske loginoplysninger fra Vault er den rigtige byggesten her. Et link er til overdragelsen fra et menneske ind i de systemer.
- **Langlivede loginoplysninger til teamet.** De hører hjemme i en adgangskodeadministrator.
- **Offentlig konfiguration.** Lad være med at klæde konfiguration, der ikke er hemmelig, ud som en hemmelighed. Brug et almindeligt link.

Skillelinjen: Er begge ender af overførslen maskiner, bruger du platformens lager til hemmeligheder. Er mindst den ene ende et menneske, er et engangslink som regel den reneste byggesten.

| Situation | Rigtig byggesten |
| --- | --- |
| En ny udviklers første loginoplysninger | Hemmeligt engangslink |
| En CI-pipeline skal bruge et deploytoken, når den kører | CI-lager til hemmeligheder / miljøvariabler |
| En pod skal bruge en databaseadgangskode | K8s secret / external secrets operator |
| Et teamlogin, som fem personer bruger dagligt | Adgangskodeadministrator (delt boks) |
| En kunde skal bruge den API-nøgle, der er oprettet til den | Hemmeligt engangslink |
| En hemmelighed skal bruges i et git-repo | Aldrig. Henvis til et lager til hemmeligheder, og tilføj scanning i CI |

## Opret det fra et script

LinkPilot har et REST-API (på alle planer, også Free). Sådan ser det ud, når et script opretter en hemmelighed:

```bash
LP_KEY=lp_live_...

URL=$(curl -sS https://api.uselinkpilot.com/v1/secrets \
  -H "Authorization: Bearer $LP_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "payload": "'"$NEW_DB_PASSWORD"'",
    "expires_in": 3600,
    "burn_after_read": true,
    "passphrase": "'"$ONBOARDING_PASSPHRASE"'"
  }' | jq -r '.url')

echo "Secret link: $URL"
```

Send URL'en videre til den kanal, du allerede bruger: en direkte besked i Slack, en e-mail eller dit onboardingværktøjs webhook.

### Hold indholdet ude af proceslisten

Eksemplet ovenfor har en klassisk fejl: Når indholdet indsættes i `-d`, havner det på curls kommandolinje, hvor alle lokale brugere kan læse det via `ps`, mens kaldet kører. Byg i stedet JSON'en med `jq` (https://jqlang.org/manual/), og send den via stdin med curls `-d @-` (https://curl.se/docs/manpage.html#-d):

```bash
set -euo pipefail

jq -n --arg payload "$NEW_DB_PASSWORD" \
      --arg pass "$ONBOARDING_PASSPHRASE" \
      '{payload: $payload, expires_in: 3600,
        burn_after_read: true, passphrase: $pass}' |
curl -sS https://api.uselinkpilot.com/v1/secrets \
  -H "Authorization: Bearer $LP_KEY" \
  -H "Content-Type: application/json" \
  -d @- | jq -r '.url'
```

Tre vaner, der bør sidde på rygraden:

- Værdierne kommer fra miljøvariabler eller CLI'en til et lager til hemmeligheder, aldrig fra en interaktiv shell, hvor de ender i historikken.
- Scriptet udskriver _linket_, aldrig indholdet.
- `set -euo pipefail`, så et mislykket API-kald ikke i stilhed kan give en tom URL videre til næste trin.

## Skabelon til onboarding

Et mønster, der virker godt for nye udviklere på første dag:

1. Onboardingscriptet opretter konti og henter loginoplysninger til engangsbrug.
2. Scriptet opretter et hemmeligt link for hvert sæt loginoplysninger med udløb efter 4 timer og en fælles adgangssætning.
3. Scriptet sender en e-mail med alle linkene og en direkte besked i Slack med adgangssætningen.
4. Udvikleren åbner hvert link og kopierer loginoplysningerne over i sin adgangskodeadministrator.
5. Alt, der ikke er læst ved arbejdsdagens slutning, bliver tilbagekaldt og sendt igen i udviklerens eget tempo.

Derfor disse indstillinger: Udløbet på 4 timer dækker en normal første formiddag, uden at loginoplysningerne er aktive natten over. Adgangssætningen sendes via en anden kanal, så en videresendt eller fejlleveret e-mail er harmløs. Fordi linkene slettes efter læsning, indeholder udviklerens indbakke kun døde URL'er, når dagen er slut.

Sig det tydeligt til den nyansatte: _”Hvert link virker kun én gang. Gem værdien i din adgangskodeadministrator, før du lukker fanen.”_ Den mest almindelige fejl ved onboarding er en modtager, der læser hemmeligheden, lukker fanen og regner med at kunne vende tilbage senere.

## En drejebog for skift

Sådan skifter du en delt databaseadgangskode, når en konsulent eller kollega er modtager:

1. Opret den nye adgangskode, og tag den i brug i kildesystemet (databasen, cloudkonsollen eller der, hvor den autoritative værdi ligger).
2. Opdater dine egne forbrugere først (CI-boksen, K8s secret, appkonfigurationen), så intet går i stykker, mens overdragelsen til mennesket foregår.
3. Opret et engangslink til den nye værdi: slettes efter læsning, udløber efter 1 time, med adgangssætning.
4. Lever link og adgangssætning via forskellige kanaler.
5. Tjek viewed-hændelsen i revisionsloggen. Ingen visning før udløbet? Tilbagekald linket, og opret et nyt. Send aldrig det samme link igen.
6. Bekræft, at de gamle loginoplysninger er deaktiveret ved kilden.

Hvert skift får sit eget link. Links er uafhængige af hinanden med vilje. Det er en fordel ved levering og en mangel ved styring, så _planen_ for skift hører hjemme i din adgangskodeadministrator eller drejebog, ikke i linkværktøjet.

## Hændelseshåndtering

Under en hændelse skal du ofte skifte loginoplysninger og hurtigt give de nye til et par af dem, der håndterer hændelsen. Indsæt dem ikke i hændelseskanalen. Kanalen bliver gemt til evalueringen, og hemmeligheden ender i eksporten, i evalueringsdokumentet og i alle de arkivsystemer, der ligger efter dem.

- Skift loginoplysningerne i kildesystemet.
- Opret et hemmeligt link, der udløber efter 30 minutter.
- Læg linket i kanalen, og send adgangssætningen som direkte besked.
- Bekræft efter hændelsen, at linket er slettet eller tilbagekaldt.

Evalueringen indeholder så en død URL i stedet for en aktiv administratoradgangskode, og revisionsloggen giver den, der gennemgår tidslinjen, en præcis registrering, ”loginoplysninger udstedt igen kl. 14:32, læst kl. 14:33”, helt gratis.

En bemærkning om forhåndsvisninger: Chatprogrammer henter indsatte URL'er for at vise en forhåndsvisning. Et veludformet hemmeligt link overlever det, fordi forhåndsvisningen er et `GET`, mens visningen af hemmeligheden er et eksplicit `POST`. Se linkscannere og engangshemmeligheder (https://uselinkpilot.com/da/blog/link-scanners-and-one-time-secrets) for hele mekanikken. Hvis du vurderer et værktøj, så test det før en hændelse, ikke under den.

## Hvad fortæller revisionsloggen dig?

Om en hemmelighed er læst, hvornår og nogenlunde hvorfra, og om nogen har prøvet en forkert adgangssætning. Hver hemmelighed i LinkPilot har en tidslinje med hændelser: created, viewed, failed_passphrase, burned, expired, revoked. Visninger registreres med tidsstempel, grov geolokation, når den er tilgængelig, brugeragent og en hashet IP-adresse (SHA-256 med et salt, der skiftes dagligt; den rå IP-adresse gemmes aldrig). I praksis giver det tre svar, som scripts og drejebøger kan regne med:

- **Leveringsbekræftelse.** En viewed-hændelse betyder, at overdragelsen er sket.
- **Opdagelse af afvigelser.** En række failed_passphrase-hændelser eller en visning, du ikke genkender, er dit signal til at skifte med det samme.
- **En ren registrering til gennemgange.** ”Leveret én gang, læst én gang, slettet” er en sætning, revisorer kan lide.

## Begrænsninger: hvad links ikke løser

- **De er ikke en boks.** Et engangslink styrer ikke løbende adgang, planer for skift eller overblik over, hvem der har hvad.
- **Linket er nøglen.** LinkPilot krypterer tekstindhold i din browser og modtager aldrig nøglen, men nøglen rejser i den del af URL'en, der står efter #. Alle, der får fat i hele linket, kan derfor læse hemmeligheden, og går linket tabt, kan hemmeligheden ikke gendannes. Vedhæftede filer krypteres på samme måde, men deres navne og størrelser krypteres ikke. Kort udløb og sletning efter læsning betyder stadig noget. _Opdatering den 29. september 2026: Dette punkt sagde tidligere ”de er ikke end-to-end-krypterede”, hvilket var korrekt indtil den dato._ Detaljerne står på siden om sikkerhedsarkitektur (https://uselinkpilot.com/da/security-architecture).
- **De løser ikke spredning af hemmeligheder i koden.** Nøgler, der er hardcodet i repos, kræver scanning og skift, ikke en bedre leveringsmetode.
- **De kan ikke beskytte den anden ende.** Når et menneske har læst værdien, skal du gå ud fra, at den findes overalt, hvor vedkommende har lagt den.

Prøv det gratis, uden tilmelding

### Generator til hemmelige engangslinks

Del en adgangskode eller en note via et link, der kun kan åbnes én gang.

Åbn værktøjet (https://uselinkpilot.com/da/tools/free-secret-link-generator)

## Læs også

- Sådan deler du API-nøgler sikkert: https://uselinkpilot.com/da/blog/how-to-share-api-keys-securely
- Links, der udløber: hvorfor korte tidsrum betyder noget: https://uselinkpilot.com/da/blog/expiring-links-security
- LinkPilots sikkerhedsarkitektur: https://uselinkpilot.com/da/security-architecture

## Kilder

- GitHub Docs, Using secrets in GitHub Actions (https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions).
- Kubernetes, Secrets (https://kubernetes.io/docs/concepts/configuration/secret/).
- jq, Manual (https://jqlang.org/manual/).
- curl, Manual page, `-d, --data` (https://curl.se/docs/manpage.html#-d).

## Værktøjer til denne artikel

Generator til hemmelige engangslinks

Del en adgangskode eller en note via et link, der kun kan åbnes én gang.
https://uselinkpilot.com/da/tools/free-secret-link-generator

Selvdestruerende besked

Send en note, der forsvinder efter én læsning.
https://uselinkpilot.com/da/tools/burn-after-read-secret

Generator til links med udløb

Opret links, der holder op med at virke på et bestemt tidspunkt.
https://uselinkpilot.com/da/tools/temporary-link

## Ofte stillede spørgsmål

### Kan jeg oprette hemmelige links fra et script?

### Skal hemmeligheder overhovedet ligge i miljøvariabler i CI?

### Hvordan håndterer jeg skift af nøgler og adgangskoder i scripts?

### Ender hemmeligheden ikke i min shellhistorik eller proceslisten?

### Hvordan bekræfter jeg, at modtageren faktisk har fået loginoplysningerne?

## LinkPilot sender et hemmeligt link, der er væk, når det er åbnet.

Krypteres i din browser, vises én gang og destrueres derefter. Kræver ingen konto.

Opret et hemmeligt link (https://uselinkpilot.com/da/tools/free-secret-link-generator)

## Læs videre

Sikkerhed

### Hemmelige links eller adgangskodeadministratorer

En adgangskodeadministrator gemmer et teams loginoplysninger. Et engangslink giver én person én adgangskode én gang. De fleste teams skal bruge begge.
https://uselinkpilot.com/da/blog/secret-links-vs-password-managers

Sikkerhed

### Linkscannere og engangshemmeligheder

Slettes et engangslink ved GET, dør det, når Slack eller en e-mailgateway viser en forhåndsvisning. Send metadata på GET, og slet først ved klik på Vis.
https://uselinkpilot.com/da/blog/link-scanners-and-one-time-secrets

Sikkerhed

### Sådan deler du API-nøgler sikkert

Indsæt aldrig en API-nøgle i chat eller e-mail. Send et engangslink, der krypteres i din browser og slettes efter én åbning, og roter nøgler, du har indsat.
https://uselinkpilot.com/da/blog/how-to-share-api-keys-securely

## Structured data

```json
[
  {
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    "itemListElement": [
      {
        "@type": "ListItem",
        "position": 1,
        "name": "Forside",
        "item": "https://uselinkpilot.com/da"
      },
      {
        "@type": "ListItem",
        "position": 2,
        "name": "Blog",
        "item": "https://uselinkpilot.com/da/blog"
      },
      {
        "@type": "ListItem",
        "position": 3,
        "name": "Sikker deling af links for udviklere",
        "item": "https://uselinkpilot.com/da/blog/secure-link-sharing-for-developers"
      }
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "BlogPosting",
    "@id": "https://uselinkpilot.com/da/blog/secure-link-sharing-for-developers#article",
    "headline": "Sikker deling af links for udviklere",
    "description": "En praktisk guide til udviklingsteams: hvornår du bruger engangslinks, hvordan du opretter dem fra et script, og hvordan de passer ind i onboarding og CI.",
    "inLanguage": "da",
    "datePublished": "2026-05-26",
    "dateModified": "2026-10-22",
    "image": "https://uselinkpilot.com/logo-512.png",
    "author": {
      "@type": "Person",
      "@id": "https://uselinkpilot.com/author/w-miller#person",
      "name": "W. Miller",
      "url": "https://uselinkpilot.com/da/author/w-miller",
      "worksFor": {
        "@type": "Organization",
        "name": "LinkPilot",
        "url": "https://uselinkpilot.com"
      }
    },
    "publisher": {
      "@type": "Organization",
      "name": "LinkPilot",
      "url": "https://uselinkpilot.com",
      "logo": {
        "@type": "ImageObject",
        "url": "https://uselinkpilot.com/logo-512.png",
        "width": 512,
        "height": 512
      }
    },
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://uselinkpilot.com/da/blog/secure-link-sharing-for-developers"
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "Kan jeg oprette hemmelige links fra et script?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Ja. LinkPilot har et REST-API (på alle planer, også Free), så du kan oprette hemmeligheder fra onboardingscripts, CI-jobs eller interne værktøjer. Hvert kald returnerer en URL, som du kan sende videre til e-mail, Slack eller sms."
        }
      },
      {
        "@type": "Question",
        "name": "Skal hemmeligheder overhovedet ligge i miljøvariabler i CI?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Ja, det er stadig den rigtige byggesten, når CI kører. Brug hemmelige links til overdragelsen fra menneske til menneske (når udvikleren får de første loginoplysninger, der skal ind i CI-boksen), ikke til vejen fra maskine til maskine."
        }
      },
      {
        "@type": "Question",
        "name": "Hvordan håndterer jeg skift af nøgler og adgangskoder i scripts?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Opret nye loginoplysninger i kildesystemet, læg dem i et engangslink, send linket, og lad modtageren gemme dem i sin adgangskodeadministrator eller CI-boks. Genbrug ikke links på tværs af skift. Hvert skift får sit eget link."
        }
      },
      {
        "@type": "Question",
        "name": "Ender hemmeligheden ikke i min shellhistorik eller proceslisten?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Det er den reelle risiko ved naive scripts: Kommandolinjeargumenter kan ses af andre lokale brugere via ps, mens kommandoen kører, og interaktive shells skriver historikfiler. Send indholdet via stdin (curl -d @-), og hold API-nøgler i miljøvariabler, aldrig i flag."
        }
      },
      {
        "@type": "Question",
        "name": "Hvordan bekræfter jeg, at modtageren faktisk har fået loginoplysningerne?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Tjek hemmelighedens revisionslog. En viewed- eller burned-hændelse med tidsstempel bekræfter leveringen. Udløber en hemmelighed uden en visning, er leveringen mislykkedes. Tilbagekald og send igen i stedet for at gætte."
        }
      }
    ],
    "inLanguage": "da"
  },
  {
    "@context": "https://schema.org",
    "@type": "SoftwareApplication",
    "@id": "https://uselinkpilot.com/#software",
    "name": "LinkPilot",
    "applicationCategory": "BusinessApplication",
    "operatingSystem": "Web",
    "description": "LinkPilot is a secure link management platform for creating branded short links, tracking engagement, and sharing secrets with expiring, protected, self-destructing links.",
    "url": "https://uselinkpilot.com",
    "offers": [
      {
        "@type": "Offer",
        "name": "Free",
        "price": "0",
        "priceCurrency": "USD",
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Pro",
        "price": "29",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "29",
          "priceCurrency": "USD",
          "billingDuration": "P1M"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Agency",
        "price": "299",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "299",
          "priceCurrency": "USD",
          "billingDuration": "P1M"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Agency Plus",
        "price": "799",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "799",
          "priceCurrency": "USD",
          "billingDuration": "P1M"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Pro (yearly)",
        "price": "288",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "288",
          "priceCurrency": "USD",
          "billingDuration": "P1Y"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Agency (yearly)",
        "price": "2988",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "2988",
          "priceCurrency": "USD",
          "billingDuration": "P1Y"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Agency Plus (yearly)",
        "price": "7980",
        "priceCurrency": "USD",
        "priceSpecification": {
          "@type": "UnitPriceSpecification",
          "price": "7980",
          "priceCurrency": "USD",
          "billingDuration": "P1Y"
        },
        "url": "https://uselinkpilot.com/pricing"
      },
      {
        "@type": "Offer",
        "name": "Enterprise",
        "priceSpecification": {
          "@type": "PriceSpecification",
          "priceCurrency": "USD"
        },
        "url": "https://uselinkpilot.com/pricing"
      }
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "Organization",
    "@id": "https://uselinkpilot.com/#organization",
    "name": "LinkPilot",
    "alternateName": "LinkPilot by TetraCore",
    "url": "https://uselinkpilot.com",
    "contactPoint": {
      "@type": "ContactPoint",
      "contactType": "customer support",
      "email": "support@uselinkpilot.com",
      "url": "https://uselinkpilot.com/support"
    },
    "parentOrganization": {
      "@type": "Organization",
      "@id": "https://tetracorehq.com/#organization",
      "name": "TetraCore",
      "url": "https://tetracorehq.com/"
    },
    "logo": {
      "@type": "ImageObject",
      "url": "https://uselinkpilot.com/logo-512.png",
      "width": 512,
      "height": 512
    },
    "description": "LinkPilot is a secure link management platform for creating branded short links, tracking engagement, and sharing secrets with expiring, protected, self-destructing links.",
    "sameAs": [
      "https://x.com/uselinkpilot",
      "https://www.linkedin.com/company/uselinkpilot",
      "https://facebook.com/uselinkpilot",
      "https://github.com/TetraCoreHQ/linkpilot-cli",
      "https://github.com/TetraCoreHQ/linkpilot-mcp",
      "https://www.npmjs.com/package/linkpilot",
      "https://www.npmjs.com/package/@uselinkpilot/sdk",
      "https://www.npmjs.com/package/@uselinkpilot/mcp",
      "https://chromewebstore.google.com/detail/linkpilot-short-links-and/mnmppadihpcncicldpkmgknhnjkondad",
      "https://addons.mozilla.org/en-US/firefox/addon/uselinkpilot/"
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "WebSite",
    "name": "LinkPilot",
    "url": "https://uselinkpilot.com",
    "potentialAction": {
      "@type": "SearchAction",
      "target": "https://uselinkpilot.com/blog?q={search_term_string}",
      "query-input": "required name=search_term_string"
    }
  }
]
```