{"id":5552,"date":"2026-10-12T11:11:09","date_gmt":"2026-10-12T09:11:09","guid":{"rendered":"https:\/\/wwwschutz.de\/blog\/?p=5552"},"modified":"2026-10-06T13:11:47","modified_gmt":"2026-10-06T11:11:47","slug":"der-15-minuten-sicherheitscheck-fuer-websites","status":"publish","type":"post","link":"https:\/\/wwwschutz.de\/blog\/der-15-minuten-sicherheitscheck-fuer-websites\/","title":{"rendered":"Der 15-Minuten-Sicherheitscheck f\u00fcr Websites"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Die meisten Website-Betreiber k\u00fcmmern sich um Inhalte, Design und Suchmaschinen, und denken an Sicherheit erst, wenn etwas passiert ist. Dabei lassen sich viele typische Schwachstellen in einer Viertelstunde aufsp\u00fcren. Dieser Beitrag f\u00fchrt in sieben Schritten von je zwei bis drei Minuten durch einen Basis-Check, der ohne Spezialwissen durchgef\u00fchrt werden kann. Am Ende haben Sie eine Ampel-Auswertung und eine klare Reihenfolge, was Sie zuerst angehen sollten.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Der Zeitplan im \u00dcberblick: sieben Stationen, zusammen 15 Minuten.<\/em><\/p>\n\n\n\n<!-- Animation: Der 15-Minuten-Sicherheitscheck f\u00fcr Websites (Pinselstriche, reines JavaScript, ca. 50 Sekunden, Endlosschleife) -->\n<!-- Einbinden: diesen kompletten Block in die Zielseite einf\u00fcgen. Alle Stile sind auf .wsc15-* begrenzt. -->\n<div class=\"wsc15-wrap\" data-wsc15>\n  <canvas class=\"wsc15-canvas\" tabindex=\"0\" role=\"img\" aria-label=\"Animation: Der 15-Minuten-Sicherheitscheck f\u00fcr Websites in sieben Schritten. Klicken oder Leertaste zum Anhalten und Fortsetzen.\"><\/canvas>\n  <p class=\"wsc15-sr\">Der 15-Minuten-Sicherheitscheck in sieben Schritten: 1. Verschl\u00fcsselung und Zertifikat (2 Minuten), 2. Updates (3 Minuten), 3. Zug\u00e4nge und Passw\u00f6rter (2 Minuten), 4. Backups (2 Minuten), 5. Konfiguration und Sicherheits-Header (2 Minuten), 6. Bekannte Schwachstellen (2 Minuten), 7. Notfallplan und Pflichten (2 Minuten). Zum Schluss eine Ampel-Auswertung: rote Punkte zuerst beheben, danach die gelben, mit dem Backup beginnen und den Check monatlich wiederholen.<\/p>\n<\/div>\n<style>\n.wsc15-wrap{position:relative;display:block;width:100%;max-width:1000px;margin:0 auto;padding:0;border:0;border-radius:14px;overflow:hidden;background:#fbf8f2;box-shadow:0 2px 14px rgba(35,48,64,.12);box-sizing:border-box;line-height:0;font-size:0}\n.wsc15-wrap::before{content:\"\";display:block;padding-top:56%}\n.wsc15-wrap .wsc15-canvas{position:absolute;top:0;left:0;width:100%;height:100%;display:block;margin:0;padding:0;border:0;cursor:pointer;outline:none;max-width:none}\n.wsc15-wrap .wsc15-canvas:focus-visible{outline:3px solid #2f6fb5;outline-offset:-3px}\n.wsc15-wrap .wsc15-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n<\/style>\n<script>\n(function () {\n  \"use strict\";\n\n  var W = 1000, H = 560, TOTAL = 50;\n  var FONT = '\"Segoe UI\", \"Helvetica Neue\", Helvetica, Arial, sans-serif';\n  var PAPER = \"#fbf8f2\", INK = \"#233040\", INK2 = \"#5a6573\";\n  var RED = \"#d64545\", YEL = \"#e2ad1f\", GRN = \"#3a9d57\";\n\n  var STATIONS = [\n    { c: \"#2f6fb5\", min: 2, title: \"Verschl\u00fcsselung und Zertifikat\", icon: \"lock\",\n      b: [\"http:\/\/ leitet auf https:\/\/ weiter\", \"Ablaufdatum des Zertifikats notieren\", \"Erneuerung automatisieren\"],\n      g: \"Gr\u00fcn: Weiterleitung klappt, Zertifikat g\u00fcltig, Erneuerung automatisch\" },\n    { c: \"#2a9d8f\", min: 3, title: \"Updates\", icon: \"update\",\n      b: [\"CMS, Plugins und Themes aktualisieren\", \"Inaktive Erweiterungen l\u00f6schen\", \"PHP-Version: noch unterst\u00fctzt?\"],\n      g: \"Gr\u00fcn: alles aktuell, keine \u00fcberfl\u00fcssigen Plugins, PHP wird unterst\u00fctzt\" },\n    { c: \"#7b5cc4\", min: 2, title: \"Zug\u00e4nge und Passw\u00f6rter\", icon: \"key\",\n      b: [\"Unbekannte Konten entfernen\", \"Admin-Rechte nur, wo n\u00f6tig\", \"Zwei-Faktor oder Passkey aktivieren\"],\n      g: \"Gr\u00fcn: nur bekannte Konten, starke Passw\u00f6rter, Zwei-Faktor f\u00fcr Admins\" },\n    { c: \"#e07a2e\", min: 2, title: \"Backups\", icon: \"db\",\n      b: [\"Dateien und Datenbank sichern\", \"Eine Kopie au\u00dferhalb des Servers\", \"Wiederherstellung testen\"],\n      g: \"Gr\u00fcn: aktuelles Backup, externe Kopie, Wiederherstellung getestet\" },\n    { c: \"#3d5a98\", min: 2, title: \"Konfiguration und Sicherheits-Header\", icon: \"shield\",\n      b: [\"Header-Test durchf\u00fchren\", \"Keine offenen Dateilisten\", \"Keine sichtbaren Fehlermeldungen\"],\n      g: \"Gr\u00fcn: wichtige Header gesetzt, keine Dateilisten, keine Fehlermeldungen\" },\n    { c: \"#d1495b\", min: 2, title: \"Bekannte Schwachstellen\", icon: \"lens\",\n      b: [\"Versionen von System und Plugins notieren\", \"Mit CVE-Datenbanken abgleichen\", \"Automatisierten Scan starten\"],\n      g: \"Gr\u00fcn: keine bekannten Schwachstellen in Ihrer Software\" },\n    { c: \"#a8792a\", min: 2, title: \"Notfallplan und Pflichten\", icon: \"clip\",\n      b: [\"Zust\u00e4ndige und Vertretung notieren\", \"Erste Schritte festlegen\", \"Ggf. Meldung binnen 72 Std. (DSGVO)\"],\n      g: \"Gr\u00fcn: Notfallzettel vorhanden, Zust\u00e4ndigkeiten gekl\u00e4rt\" }\n  ];\n  var CUM = [0, 2, 5, 7, 9, 11, 13, 15];\n\n  \/* Hilfsfunktionen *\/\n  function rng(seed) {\n    var s = seed >>> 0;\n    return function () {\n      s = (s + 0x6D2B79F5) >>> 0;\n      var t = s;\n      t = Math.imul(t ^ (t >>> 15), t | 1);\n      t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n      return ((t ^ (t >>> 14)) >>> 0) \/ 4294967296;\n    };\n  }\n  function clamp(v, a, b) { return v < a ? a : (v > b ? b : v); }\n  function ease(x) { x = clamp(x, 0, 1); return 0.5 - 0.5 * Math.cos(Math.PI * x); }\n  function prog(t, s, d) { return clamp((t - s) \/ d, 0, 1); }\n  function deg(d) { return d * Math.PI \/ 180; }\n  function hexToRgb(h) { var n = parseInt(h.slice(1), 16); return [n >> 16, (n >> 8) % 256, n % 256]; }\n  function mix(hex, amt) {\n    var c = hexToRgb(hex), t = amt > 0 ? 255 : 0, a = Math.abs(amt);\n    var out = \"#\", k, v;\n    for (k = 0; k < 3; k++) {\n      v = clamp(Math.round(c[k] + (t - c[k]) * a), 0, 255).toString(16);\n      out += v.length < 2 ? \"0\" + v : v;\n    }\n    return out;\n  }\n  function arcPts(cx, cy, r, a0, a1, n, ry) {\n    var out = [], i, a;\n    if (ry === undefined) ry = r;\n    for (i = 0; i <= n; i++) {\n      a = a0 + (a1 - a0) * i \/ n;\n      out.push([cx + r * Math.cos(a), cy + ry * Math.sin(a)]);\n    }\n    return out;\n  }\n  function spiral(cx, cy, r0, r1, turns, n) {\n    var out = [], i, f, a, r;\n    for (i = 0; i <= n; i++) {\n      f = i \/ n; a = f * turns * Math.PI * 2 - Math.PI \/ 2; r = r0 + (r1 - r0) * f;\n      out.push([cx + r * Math.cos(a), cy + r * Math.sin(a)]);\n    }\n    return out;\n  }\n  function head(E, d, L) {\n    var bx = -d[0], by = -d[1], a = deg(35);\n    var v1 = [bx * Math.cos(a) - by * Math.sin(a), bx * Math.sin(a) + by * Math.cos(a)];\n    var v2 = [bx * Math.cos(-a) - by * Math.sin(-a), bx * Math.sin(-a) + by * Math.cos(-a)];\n    return [[E[0] + v1[0] * L, E[1] + v1[1] * L], [E[0], E[1]], [E[0] + v2[0] * L, E[1] + v2[1] * L]];\n  }\n  function shift(pts, dx, dy) {\n    var out = [], i;\n    for (i = 0; i < pts.length; i++) out.push([pts[i][0] + dx, pts[i][1] + dy]);\n    return out;\n  }\n\n  \/* Pinselstrich aus einzelnen Borsten *\/\n  var seedCounter = 11;\n  function Stroke(pts, o) {\n    o = o || {};\n    this.w = o.w || 12;\n    this.color = o.color || INK;\n    this.t0 = o.t0 || 0;\n    this.dur = o.dur || 0.5;\n    this.solid = !!o.solid;\n    this.step = o.step || 3;\n    seedCounter += 1;\n    var r = rng(o.seed || seedCounter * 7919);\n    var dense = [], i, j, a, b, len, steps;\n    for (i = 0; i < pts.length - 1; i++) {\n      a = pts[i]; b = pts[i + 1];\n      len = Math.hypot(b[0] - a[0], b[1] - a[1]);\n      steps = Math.max(1, Math.ceil(len \/ this.step));\n      for (j = 0; j < steps; j++) dense.push([a[0] + (b[0] - a[0]) * j \/ steps, a[1] + (b[1] - a[1]) * j \/ steps]);\n    }\n    dense.push(pts[pts.length - 1].slice());\n    var n = dense.length, nx = [], ny = [], k, p0, p1, dx, dy, d, s, wo;\n    for (k = 0; k < n; k++) {\n      p0 = dense[Math.max(0, k - 2)]; p1 = dense[Math.min(n - 1, k + 2)];\n      dx = p1[0] - p0[0]; dy = p1[1] - p0[1]; d = Math.hypot(dx, dy) || 1;\n      nx.push(-dy \/ d); ny.push(dx \/ d);\n    }\n    var wob = o.wobble === undefined ? 1.2 : o.wobble, ph1 = r() * 6.28, ph2 = r() * 6.28;\n    for (k = 0; k < n; k++) {\n      s = k \/ Math.max(1, n - 1);\n      wo = wob * (Math.sin(s * 7 + ph1) + 0.5 * Math.sin(s * 17 + ph2));\n      dense[k][0] += nx[k] * wo; dense[k][1] += ny[k] * wo;\n    }\n    this.p = dense; this.nx = nx; this.ny = ny; this.n = n;\n    var cnt = o.bristles || Math.round(clamp(this.w * 0.9, 6, 34));\n    this.br = [];\n    for (k = 0; k < cnt; k++) {\n      var bo = (k + 0.5) \/ cnt - 0.5 + (r() - 0.5) * 0.6 \/ cnt;\n      var edge = Math.abs(bo) * 2;\n      this.br.push({\n        off: bo,\n        lw: Math.max(0.8, this.w \/ cnt * (1.3 + r() * 1.3)),\n        alpha: this.solid ? 1 : (0.45 + r() * 0.5) * (1 - edge * 0.3),\n        col: this.solid ? this.color : mix(this.color, (r() - 0.5) * 0.28),\n        gf: 0.015 + r() * 0.045,\n        gp: r() * 6.28,\n        gt: this.solid ? 2 : (0.985 - edge * edge * 0.22 - r() * 0.05),\n        s0: r() * 0.04 * edge,\n        s1: 1 - r() * 0.07 * edge,\n        pp: r() * 6.28\n      });\n    }\n  }\n  Stroke.prototype.draw = function (ctx, t) {\n    var raw = (t - this.t0) \/ this.dur;\n    if (raw <= 0) return;\n    var p = ease(raw), n = this.n, last = Math.floor(p * (n - 1));\n    var k, b, i, i0, i1, s, tp, pr, x, y, on;\n    ctx.lineCap = \"round\"; ctx.lineJoin = \"round\";\n    for (k = 0; k < this.br.length; k++) {\n      b = this.br[k];\n      i0 = Math.floor(b.s0 * (n - 1));\n      i1 = Math.min(last, Math.floor(b.s1 * (n - 1)));\n      if (i1 <= i0) continue;\n      ctx.beginPath(); on = false;\n      for (i = i0; i <= i1; i++) {\n        s = i \/ Math.max(1, n - 1);\n        tp = Math.sqrt(Math.max(Math.min(1, s \/ 0.07, (1 - s) \/ 0.1), 0.15));\n        pr = 0.88 + 0.12 * Math.sin(s * 5 + b.pp);\n        x = this.p[i][0] + this.nx[i] * b.off * this.w * tp * pr;\n        y = this.p[i][1] + this.ny[i] * b.off * this.w * tp * pr;\n        if (Math.sin(i * this.step * b.gf + b.gp) > b.gt) { on = false; continue; }\n        if (on) { ctx.lineTo(x, y); } else { ctx.moveTo(x, y); on = true; }\n      }\n      ctx.globalAlpha = b.alpha;\n      ctx.strokeStyle = b.col;\n      ctx.lineWidth = b.lw;\n      ctx.stroke();\n    }\n    if (raw < 1) {\n      if (!this.solid) {\n        ctx.globalAlpha = 0.22;\n        ctx.fillStyle = this.color;\n        ctx.beginPath();\n        ctx.arc(this.p[last][0], this.p[last][1], this.w * 0.42, 0, Math.PI * 2);\n        ctx.fill();\n      }\n    }\n    ctx.globalAlpha = 1;\n  };\n\n  \/* Text, der wie mit dem Pinsel aufgetragen erscheint *\/\n  function drawText(ctx, str, x, y, size, color, weight, p, align, maxW) {\n    if (p <= 0) return;\n    ctx.save();\n    ctx.font = weight + \" \" + size + \"px \" + FONT;\n    ctx.textAlign = align; ctx.textBaseline = \"alphabetic\";\n    var w = ctx.measureText(str).width;\n    if (maxW) { if (w > maxW) w = maxW; }\n    var x0 = x;\n    if (align === \"center\") x0 = x - w \/ 2;\n    if (align === \"right\") x0 = x - w;\n    ctx.beginPath();\n    ctx.rect(x0 - 6, y - size * 1.15, (w + 12) * ease(p), size * 1.6);\n    ctx.clip();\n    ctx.globalAlpha = clamp(p * 2.2, 0, 1);\n    ctx.fillStyle = color;\n    if (maxW) { ctx.fillText(str, x, y, maxW); } else { ctx.fillText(str, x, y); }\n    ctx.restore();\n  }\n  function TextItem(str, x, y, size, color, weight, t0, dur, align, maxW) {\n    this.s = str; this.x = x; this.y = y; this.size = size; this.color = color;\n    this.weight = weight || 400; this.t0 = t0; this.dur = dur || 0.5;\n    this.align = align || \"left\"; this.maxW = maxW || 0;\n  }\n  TextItem.prototype.draw = function (ctx, t) {\n    drawText(ctx, this.s, this.x, this.y, this.size, this.color, this.weight, prog(t, this.t0, this.dur), this.align, this.maxW);\n  };\n  function fitSize(ctx, str, weight, size, maxW) {\n    while (size > 14) {\n      ctx.font = weight + \" \" + size + \"px \" + FONT;\n      if (ctx.measureText(str).width <= maxW) break;\n      size -= 1;\n    }\n    return size;\n  }\n  function textWidth(ctx, str, weight, size) {\n    ctx.font = weight + \" \" + size + \"px \" + FONT;\n    return ctx.measureText(str).width;\n  }\n  function wrap(ctx, str, weight, size, maxW) {\n    var words = str.split(\" \"), lines = [], line = \"\", i, test;\n    ctx.font = weight + \" \" + size + \"px \" + FONT;\n    for (i = 0; i < words.length; i++) {\n      test = line ? line + \" \" + words[i] : words[i];\n      if (ctx.measureText(test).width > maxW) {\n        if (line) { lines.push(line); line = words[i]; } else { lines.push(test); line = \"\"; }\n      } else { line = test; }\n    }\n    if (line) lines.push(line);\n    return lines;\n  }\n\n  \/* Symbole als Pinselpfade, zentriert um (0,0) *\/\n  function iconPaths(name) {\n    var a1, a2, e1, e2;\n    if (name === \"lock\") {\n      return [\n        [[-35, -2]].concat(arcPts(0, -32, 35, deg(180), deg(360), 20)).concat([[35, -2]]),\n        [[-55, -2], [55, -2], [55, 62], [-55, 62], [-55, -2]],\n        [[0, 14], [0, 38]]\n      ];\n    }\n    if (name === \"update\") {\n      a1 = arcPts(0, 0, 55, deg(200), deg(330), 22);\n      a2 = arcPts(0, 0, 55, deg(20), deg(150), 22);\n      e1 = a1[a1.length - 1]; e2 = a2[a2.length - 1];\n      return [a1, head(e1, [-Math.sin(deg(330)), Math.cos(deg(330))], 22), a2, head(e2, [-Math.sin(deg(150)), Math.cos(deg(150))], 22)];\n    }\n    if (name === \"key\") {\n      return [arcPts(-38, 0, 26, 0, deg(375), 26), [[-12, 0], [66, 0]], [[42, 0], [42, 22]], [[60, 0], [60, 18]]];\n    }\n    if (name === \"db\") {\n      return [\n        arcPts(0, -45, 50, 0, deg(365), 30, 16),\n        [[-50, -45], [-50, 45]], [[50, -45], [50, 45]],\n        arcPts(0, 0, 50, 0, deg(180), 18, 16),\n        arcPts(0, 45, 50, 0, deg(180), 18, 16)\n      ];\n    }\n    if (name === \"shield\") {\n      return [[[0, -68], [55, -48], [50, 12], [0, 68], [-50, 12], [-55, -48], [0, -68]], [[-24, 0], [-6, 20], [28, -24]]];\n    }\n    if (name === \"lens\") {\n      return [arcPts(-14, -14, 40, 0, deg(370), 32), [[16, 16], [58, 58]]];\n    }\n    return [\n      [[-45, -52], [45, -52], [45, 70], [-45, 70], [-45, -52]],\n      [[-18, -60], [18, -60]],\n      [[-26, -14], [26, -14]], [[-26, 12], [26, 12]], [[-26, 38], [10, 38]]\n    ];\n  }\n\n  function wipeStroke(t0) {\n    return new Stroke([[-160, 270], [300, 262], [700, 276], [1160, 266]],\n      { w: 500, color: PAPER, solid: true, t0: t0, dur: 0.6, wobble: 6, step: 6, bristles: 30 });\n  }\n\n  \/* Szenen aufbauen *\/\n  function build(ctx) {\n    var scenes = [], items, i, k, st, c, y, size, tw, lines, j;\n\n    \/* Intro *\/\n    items = [];\n    items.push(new Stroke(spiral(290, 270, 10, 150, 3, 140), { w: 62, color: mix(\"#2f6fb5\", 0.8), t0: 0.0, dur: 0.9, wobble: 2 }));\n    items.push(new Stroke(arcPts(290, 270, 150, deg(-95), deg(272), 90), { w: 18, color: \"#2f6fb5\", t0: 0.4, dur: 1.0 }));\n    for (k = 0; k < 12; k++) {\n      var ang = deg(k * 30);\n      items.push(new Stroke([[290 + 124 * Math.cos(ang), 270 + 124 * Math.sin(ang)], [290 + 136 * Math.cos(ang), 270 + 136 * Math.sin(ang)]],\n        { w: 5, color: INK2, t0: 0.9 + k * 0.04, dur: 0.15, wobble: 0 }));\n    }\n    items.push(new Stroke([[246, 222], [276, 196], [276, 346]], { w: 24, color: \"#1f3b5c\", t0: 1.2, dur: 0.45 }));\n    items.push(new Stroke([[362, 198], [312, 198], [308, 262]].concat(arcPts(332, 300, 42, deg(-120), deg(140), 24)), { w: 24, color: \"#1f3b5c\", t0: 1.55, dur: 0.7 }));\n    items.push(new TextItem(\"Minuten\", 290, 398, 22, INK2, 600, 2.1, 0.5, \"center\"));\n    size = fitSize(ctx, \"Sicherheitscheck\", 700, 52, 470);\n    tw = textWidth(ctx, \"Sicherheitscheck\", 700, size);\n    items.push(new TextItem(\"Der 15-Minuten-\", 500, 190, 42, INK, 700, 1.7, 0.6));\n    items.push(new Stroke([[492, 250], [500 + tw + 12, 245]], { w: 48, color: \"#f6d36b\", t0: 2.0, dur: 0.5 }));\n    items.push(new TextItem(\"Sicherheitscheck\", 500, 264, size, INK, 700, 2.15, 0.6));\n    items.push(new TextItem(\"f\u00fcr Websites\", 500, 322, 42, INK, 700, 2.55, 0.6));\n    items.push(new TextItem(\"Sieben Stationen, je zwei bis drei Minuten.\", 500, 382, 20, INK2, 400, 3.0, 0.6, \"left\", 470));\n    items.push(new TextItem(\"Ohne Spezialwissen, f\u00fcr Ihre eigene Website.\", 500, 414, 20, INK2, 400, 3.35, 0.6, \"left\", 470));\n    items.push(wipeStroke(4.4));\n    scenes.push({ start: 0, dur: 5, items: items, idx: -1 });\n\n    \/* Sieben Stationen *\/\n    for (i = 0; i < STATIONS.length; i++) {\n      st = STATIONS[i]; c = st.c; items = [];\n      items.push(new Stroke(spiral(240, 270, 10, 118, 2.6, 120), { w: 58, color: mix(c, 0.74), t0: 0.05, dur: 0.7, wobble: 2 }));\n      var ip = iconPaths(st.icon);\n      for (k = 0; k < ip.length; k++) {\n        items.push(new Stroke(shift(ip[k], 240, 270), { w: 13, color: mix(c, -0.28), t0: 0.5 + k * 0.28, dur: 0.4 }));\n      }\n      items.push(new TextItem(\"Schritt \" + (i + 1) + \" von 7  \u00b7  \" + st.min + \" Minuten\", 470, 120, 17, c, 600, 0.35, 0.5));\n      size = fitSize(ctx, st.title, 700, 36, 490);\n      tw = textWidth(ctx, st.title, 700, size);\n      items.push(new Stroke([[460, 170], [470 + tw + 12, 166]], { w: 44, color: mix(c, 0.8), t0: 0.55, dur: 0.45 }));\n      items.push(new TextItem(st.title, 470, 182, size, INK, 700, 0.75, 0.6));\n      for (k = 0; k < 3; k++) {\n        y = 242 + k * 46;\n        items.push(new Stroke([[472, y - 9], [480, y - 1], [495, y - 17]], { w: 5, color: c, t0: 1.35 + k * 0.5, dur: 0.25, wobble: 0.3 }));\n        items.push(new TextItem(st.b[k], 508, y, 21, INK, 400, 1.45 + k * 0.5, 0.5, \"left\", 450));\n      }\n      items.push(new Stroke(spiral(482, 404, 2, 7, 1.6, 20), { w: 12, color: mix(RED, 0.55), t0: 2.95, dur: 0.25, wobble: 0 }));\n      items.push(new Stroke(spiral(510, 404, 2, 7, 1.6, 20), { w: 12, color: mix(YEL, 0.5), t0: 3.05, dur: 0.25, wobble: 0 }));\n      items.push(new Stroke(spiral(538, 404, 2, 7, 1.6, 20), { w: 12, color: GRN, t0: 3.15, dur: 0.25, wobble: 0 }));\n      items.push(new Stroke(arcPts(538, 404, 17, deg(-80), deg(300), 30), { w: 3, color: mix(GRN, -0.3), t0: 3.35, dur: 0.35, wobble: 0.6 }));\n      lines = wrap(ctx, st.g, 400, 16, 380);\n      for (j = 0; j < lines.length; j++) {\n        items.push(new TextItem(lines[j], 568, 400 + j * 22, 16, INK2, 400, 3.4 + j * 0.25, 0.5));\n      }\n      items.push(wipeStroke(4.4));\n      scenes.push({ start: 5 + i * 5, dur: 5, items: items, idx: i });\n    }\n\n    \/* Auswertung *\/\n    items = [];\n    items.push(new TextItem(\"Ihre Auswertung\", 90, 95, 38, INK, 700, 0.1, 0.6));\n    tw = textWidth(ctx, \"Ihre Auswertung\", 700, 38);\n    items.push(new Stroke([[86, 113], [96 + tw, 109]], { w: 9, color: \"#2f6fb5\", t0: 0.5, dur: 0.5 }));\n    var names = [\"HTTPS und Zertifikat\", \"Updates\", \"Zug\u00e4nge\", \"Backups\", \"Konfiguration und Header\", \"Schwachstellen\", \"Notfallplan\"];\n    var res = [GRN, YEL, YEL, RED, YEL, GRN, RED];\n    var words = [\"Gr\u00fcn\", \"Gelb\", \"Gelb\", \"Rot\", \"Gelb\", \"Gr\u00fcn\", \"Rot\"];\n    for (i = 0; i < 7; i++) {\n      y = 160 + i * 44;\n      items.push(new TextItem((i + 1) + \"   \" + names[i], 90, y, 20, INK, 400, 0.7 + i * 0.22, 0.45, \"left\", 330));\n      items.push(new Stroke([[440, y - 7], [492, y - 9]], { w: 24, color: res[i], t0: 0.9 + i * 0.22, dur: 0.3 }));\n      items.push(new TextItem(words[i], 506, y, 17, mix(res[i], -0.35), 700, 1.0 + i * 0.22, 0.4));\n    }\n    items.push(new Stroke(arcPts(468, 152 + 3 * 44, 50, deg(-20), deg(345), 44, 22), { w: 4, color: mix(RED, -0.25), t0: 2.6, dur: 0.5 }));\n    items.push(new Stroke(arcPts(468, 152 + 6 * 44, 50, deg(-20), deg(345), 44, 22), { w: 4, color: mix(RED, -0.25), t0: 2.85, dur: 0.5 }));\n    items.push(new TextItem(\"So gehen Sie vor\", 600, 160, 26, INK, 700, 3.0, 0.5));\n    var plan = [\"Rote Punkte zuerst beheben\", \"Danach die gelben Punkte\", \"Mit dem Backup beginnen\"];\n    var planCol = [RED, YEL, \"#2f6fb5\"];\n    for (k = 0; k < 3; k++) {\n      y = 212 + k * 46;\n      items.push(new Stroke(spiral(614, y - 7, 2, 10, 1.8, 26), { w: 14, color: planCol[k], t0: 3.4 + k * 0.6, dur: 0.3, wobble: 0 }));\n      items.push(new TextItem(String(k + 1), 614, y - 1, 15, \"#ffffff\", 700, 3.6 + k * 0.6, 0.2, \"center\"));\n      items.push(new TextItem(plan[k], 640, y, 21, INK, 400, 3.6 + k * 0.6, 0.5, \"left\", 330));\n    }\n    var la = arcPts(625, 377, 22, deg(-60), deg(230), 28);\n    var le = la[la.length - 1];\n    items.push(new Stroke(la, { w: 6, color: GRN, t0: 5.6, dur: 0.45 }));\n    items.push(new Stroke(head(le, [-Math.sin(deg(230)), Math.cos(deg(230))], 12), { w: 6, color: GRN, t0: 6.0, dur: 0.2, wobble: 0 }));\n    items.push(new TextItem(\"Monatlich wiederholen\", 660, 375, 22, INK, 700, 5.9, 0.5, \"left\", 300));\n    items.push(new TextItem(\"15 Minuten im Kalender eintragen\", 660, 404, 18, INK2, 400, 6.3, 0.5, \"left\", 300));\n    tw = textWidth(ctx, \"Sicherheit ist kein Zustand, sondern eine Gewohnheit.\", 700, 22);\n    items.push(new Stroke([[500 - tw \/ 2 - 16, 465], [500 + tw \/ 2 + 16, 461]], { w: 40, color: \"#f6d36b\", t0: 7.1, dur: 0.6 }));\n    items.push(new TextItem(\"Sicherheit ist kein Zustand, sondern eine Gewohnheit.\", 500, 471, 22, INK, 700, 7.4, 0.8, \"center\", 860));\n    items.push(wipeStroke(9.4));\n    scenes.push({ start: 40, dur: 10, items: items, idx: 7 });\n\n    \/* Zeitleiste unten *\/\n    var tl = [];\n    for (i = 0; i < 7; i++) {\n      tl.push(new Stroke([[tx(CUM[i]) + 3, 518], [tx(CUM[i + 1]) - 3, 517]],\n        { w: 10, color: STATIONS[i].c, t0: 5 + i * 5 + 0.3, dur: 3.6, wobble: 0.6 }));\n    }\n    return { scenes: scenes, timeline: tl };\n  }\n  function tx(m) { return 110 + 780 * m \/ 15; }\n\n  function makeTexture() {\n    var c = document.createElement(\"canvas\");\n    c.width = W; c.height = H;\n    var g = c.getContext(\"2d\"), r = rng(4242), i, x, y, a, l;\n    for (i = 0; i < 7000; i++) {\n      g.fillStyle = r() < 0.5 ? \"rgba(90,70,40,0.05)\" : \"rgba(255,255,255,0.35)\";\n      g.fillRect(r() * W, r() * H, 1 + r() * 1.4, 1 + r() * 1.4);\n    }\n    g.lineWidth = 0.6;\n    for (i = 0; i < 160; i++) {\n      x = r() * W; y = r() * H; a = r() * 6.28; l = 6 + r() * 18;\n      g.strokeStyle = \"rgba(120,100,70,0.06)\";\n      g.beginPath(); g.moveTo(x, y);\n      g.quadraticCurveTo(x + Math.cos(a + 0.6) * l * 0.5, y + Math.sin(a + 0.6) * l * 0.5, x + Math.cos(a) * l, y + Math.sin(a) * l);\n      g.stroke();\n    }\n    var grad = g.createRadialGradient(W \/ 2, H \/ 2, H * 0.35, W \/ 2, H \/ 2, H * 0.95);\n    grad.addColorStop(0, \"rgba(120,95,60,0)\");\n    grad.addColorStop(1, \"rgba(120,95,60,0.10)\");\n    g.fillStyle = grad; g.fillRect(0, 0, W, H);\n    return c;\n  }\n\n  function init(wrap) {\n    if (wrap.getAttribute(\"data-wsc15-init\") === \"1\") return;\n    wrap.setAttribute(\"data-wsc15-init\", \"1\");\n    var canvas = wrap.querySelector(\"canvas\");\n    if (!canvas) return;\n    var ctx = canvas.getContext(\"2d\");\n    if (!ctx) return;\n    var data = build(ctx), tex = makeTexture();\n    var T = 0, last = null, visible = true, paused = false, sx = 1, sy = 1;\n\n    function resize() {\n      var r = canvas.getBoundingClientRect();\n      var dpr = Math.min(window.devicePixelRatio || 1, 2);\n      var cw = Math.max(1, Math.round(r.width * dpr)), ch = Math.max(1, Math.round(r.height * dpr));\n      if (canvas.width !== cw) canvas.width = cw;\n      if (canvas.height !== ch) canvas.height = ch;\n      sx = cw \/ W; sy = ch \/ H;\n    }\n\n    function drawTimeline(t, sc) {\n      var a = prog(t, 4.4, 0.6), i, m, cur;\n      if (a <= 0) return;\n      ctx.save();\n      ctx.globalAlpha = a * 0.35;\n      ctx.strokeStyle = INK2; ctx.lineWidth = 1.2;\n      if (ctx.setLineDash) ctx.setLineDash([4, 5]);\n      ctx.beginPath(); ctx.moveTo(tx(0), 518); ctx.lineTo(tx(15), 518); ctx.stroke();\n      ctx.restore();\n      for (i = 0; i < data.timeline.length; i++) data.timeline[i].draw(ctx, t);\n      cur = sc.idx;\n      ctx.save();\n      ctx.globalAlpha = a;\n      for (i = 0; i <= 7; i++) {\n        ctx.beginPath(); ctx.arc(tx(CUM[i]), 518, 4.5, 0, Math.PI * 2);\n        ctx.fillStyle = t >= 5 + i * 5 ? INK : PAPER; ctx.fill();\n        ctx.lineWidth = 1.5; ctx.strokeStyle = INK2; ctx.stroke();\n      }\n      ctx.textBaseline = \"alphabetic\";\n      for (i = 0; i < 7; i++) {\n        m = (tx(CUM[i]) + tx(CUM[i + 1])) \/ 2;\n        ctx.textAlign = \"center\";\n        if (i === cur) { ctx.font = \"700 14px \" + FONT; ctx.fillStyle = STATIONS[i].c; }\n        else { ctx.font = \"400 13px \" + FONT; ctx.fillStyle = INK2; }\n        ctx.fillText(String(i + 1), m, 545);\n      }\n      ctx.font = \"400 13px \" + FONT; ctx.fillStyle = INK2;\n      ctx.textAlign = \"right\"; ctx.fillText(\"0 Min.\", tx(0) - 12, 523);\n      ctx.textAlign = \"left\"; ctx.fillText(\"15 Min.\", tx(15) + 12, 523);\n      ctx.restore();\n    }\n\n    function drawHeader(t, sc) {\n      var p = prog(t, 5, 0.6), label, col, m;\n      if (p <= 0) return;\n      drawText(ctx, \"15-Minuten-Sicherheitscheck f\u00fcr Websites\", 40, 40, 15, INK2, 600, p, \"left\");\n      if (sc.idx === 7) { label = \"15 Minuten geschafft\"; col = GRN; }\n      else {\n        m = CUM[sc.idx] + (CUM[sc.idx + 1] - CUM[sc.idx]) * ease(prog(t - sc.start, 0.3, 3.6));\n        label = \"Minute \" + Math.round(m) + \" von 15\";\n        col = STATIONS[sc.idx].c;\n      }\n      drawText(ctx, label, 960, 40, 15, col, 700, p, \"right\");\n    }\n\n    function drawPause() {\n      var x = 330, y = 250, w = 340, h = 46, r = 23;\n      ctx.save();\n      ctx.globalAlpha = 0.85; ctx.fillStyle = INK;\n      ctx.beginPath();\n      ctx.moveTo(x + r, y); ctx.lineTo(x + w - r, y);\n      ctx.arc(x + w - r, y + r, r, -Math.PI \/ 2, Math.PI \/ 2);\n      ctx.lineTo(x + r, y + h);\n      ctx.arc(x + r, y + r, r, Math.PI \/ 2, Math.PI * 1.5);\n      ctx.fill();\n      ctx.globalAlpha = 1; ctx.fillStyle = \"#ffffff\";\n      ctx.font = \"600 17px \" + FONT; ctx.textAlign = \"center\"; ctx.textBaseline = \"middle\";\n      ctx.fillText(\"Pausiert: zum Fortsetzen klicken\", x + w \/ 2, y + h \/ 2 + 1);\n      ctx.restore();\n    }\n\n    function render() {\n      var i, sc = data.scenes[0], lt;\n      for (i = 0; i < data.scenes.length; i++) {\n        if (T >= data.scenes[i].start) sc = data.scenes[i];\n      }\n      lt = T - sc.start;\n      ctx.setTransform(sx, 0, 0, sy, 0, 0);\n      ctx.globalAlpha = 1;\n      ctx.fillStyle = PAPER;\n      ctx.fillRect(0, 0, W, H);\n      for (i = 0; i < sc.items.length; i++) sc.items[i].draw(ctx, lt);\n      drawTimeline(T, sc);\n      drawHeader(T, sc);\n      ctx.drawImage(tex, 0, 0, W, H);\n      if (paused) drawPause();\n    }\n\n    function frame(now) {\n      if (last === null) last = now;\n      var dt = Math.min(0.1, (now - last) \/ 1000);\n      last = now;\n      if (visible) {\n        if (!document.hidden) {\n          if (!paused) T = (T + dt) % TOTAL;\n          render();\n        }\n      }\n      window.requestAnimationFrame(frame);\n    }\n\n    function toggle() { paused = !paused; render(); }\n    canvas.addEventListener(\"click\", toggle);\n    canvas.addEventListener(\"keydown\", function (e) {\n      if (e.key === \" \" || e.key === \"Enter\") { e.preventDefault(); toggle(); }\n    });\n\n    resize();\n    if (window.ResizeObserver) { new ResizeObserver(resize).observe(wrap); }\n    else { window.addEventListener(\"resize\", resize); }\n\n    if (window.IntersectionObserver) {\n      visible = false;\n      new IntersectionObserver(function (entries) {\n        visible = entries[0].isIntersecting;\n        last = null;\n      }, { threshold: 0.15 }).observe(wrap);\n    }\n    window.requestAnimationFrame(frame);\n  }\n\n  function start() {\n    var list = document.querySelectorAll(\"[data-wsc15]\"), i;\n    for (i = 0; i < list.length; i++) init(list[i]);\n  }\n  if (document.readyState === \"loading\") { document.addEventListener(\"DOMContentLoaded\", start); }\n  else { start(); }\n})();\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\">Das Wichtigste vorab<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Schritt<\/th><th>Thema<\/th><th>Dauer<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>Verschl\u00fcsselung (HTTPS) und Zertifikat<\/td><td>2 Min.<\/td><\/tr><tr><td>2<\/td><td>Updates f\u00fcr CMS, Plugins und PHP<\/td><td>3 Min.<\/td><\/tr><tr><td>3<\/td><td>Zug\u00e4nge, Passw\u00f6rter und Zwei-Faktor-Anmeldung<\/td><td>2 Min.<\/td><\/tr><tr><td>4<\/td><td>Backups<\/td><td>2 Min.<\/td><\/tr><tr><td>5<\/td><td>Konfiguration und Sicherheits-Header<\/td><td>2 Min.<\/td><\/tr><tr><td>6<\/td><td>Bekannte Schwachstellen und automatisierter Scan<\/td><td>2 Min.<\/td><\/tr><tr><td>7<\/td><td>Notfallplan und Pflichten<\/td><td>2 Min.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Jeder Schritt endet mit einer Ampel: <strong>gr\u00fcn<\/strong> (in Ordnung), <strong>gelb<\/strong> (sollte bald verbessert werden) oder <strong>rot<\/strong> (zeitnah beheben). Die Auswertung am Ende hilft Ihnen, aus den Ergebnissen eine Aufgabenliste zu machen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"511\" src=\"https:\/\/wwwschutz.de\/blog\/wp-content\/uploads\/zeitplan_15_minuten_sieben_stationen-1024x511.png\" alt=\"Zeitplan des 15-Minuten-Sicherheitschecks: sieben Stationen mit Minutenangaben von HTTPS bis Notfallplan\" class=\"wp-image-5556\" srcset=\"https:\/\/wwwschutz.de\/blog\/wp-content\/uploads\/zeitplan_15_minuten_sieben_stationen-1024x511.png 1024w, https:\/\/wwwschutz.de\/blog\/wp-content\/uploads\/zeitplan_15_minuten_sieben_stationen-300x150.png 300w, https:\/\/wwwschutz.de\/blog\/wp-content\/uploads\/zeitplan_15_minuten_sieben_stationen-768x383.png 768w, https:\/\/wwwschutz.de\/blog\/wp-content\/uploads\/zeitplan_15_minuten_sieben_stationen-1536x766.png 1536w, https:\/\/wwwschutz.de\/blog\/wp-content\/uploads\/zeitplan_15_minuten_sieben_stationen-2048x1021.png 2048w, https:\/\/wwwschutz.de\/blog\/wp-content\/uploads\/zeitplan_15_minuten_sieben_stationen-640x319.png 640w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Website-Check: Sieben Stationen in 15 Minuten<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Vorbereitung: Das brauchen Sie<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>einen Browser und Ihre Website-Adresse<\/li>\n\n\n\n<li>Zugang zum Verwaltungsbereich Ihres Systems (bei WordPress das Dashboard)<\/li>\n\n\n\n<li>Zugang zum Konto bei Ihrem Hosting-Anbieter, falls vorhanden<\/li>\n\n\n\n<li>einen Zettel oder eine Notiz-Datei f\u00fcr die Ergebnisse<\/li>\n\n\n\n<li>eine Uhr, damit es bei 15 Minuten bleibt<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wichtig:<\/strong> F\u00fchren Sie diese Pr\u00fcfung nur an Websites durch, f\u00fcr die Sie verantwortlich sind. Das Testen fremder Seiten ohne Erlaubnis ist nicht zul\u00e4ssig.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 1: Verschl\u00fcsselung und Zertifikat (2 Minuten)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Warum das wichtig ist:<\/strong> HTTPS sch\u00fctzt Daten auf dem Weg zwischen Besucher und Server, etwa Eingaben in Formularen und Logins. Browser warnen bei unverschl\u00fcsselten Seiten, und Besucher springen dann h\u00e4ufig ab.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>So pr\u00fcfen Sie:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Rufen Sie Ihre Seite mit <code>http:\/\/<\/code> (ohne \u201es\u201c) auf. Sie sollten automatisch auf <code>https:\/\/<\/code> weitergeleitet werden.<\/li>\n\n\n\n<li>Klicken Sie in der Adresszeile auf das Schloss-Symbol und \u00f6ffnen Sie die Zertifikatsdetails. Notieren Sie das Ablaufdatum.<\/li>\n\n\n\n<li>Achten Sie auf Warnhinweise des Browsers. \u201eGemischte Inhalte\u201c bedeuten, dass einzelne Bilder oder Skripte noch unverschl\u00fcsselt geladen werden.<\/li>\n\n\n\n<li>Optional: Starten Sie den kostenlosen Server-Test von Qualys SSL Labs (ssllabs.com) f\u00fcr Ihre Domain. Er l\u00e4uft einige Minuten im Hintergrund, das Ergebnis sehen Sie sp\u00e4ter.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Gut zu wissen:<\/strong> Zertifikate \u00f6ffentlicher Zertifizierungsstellen werden nach einem Beschluss des CA\/Browser Forums schrittweise k\u00fcrzer g\u00fcltig. Der aktuelle Fahrplan sieht h\u00f6chstens 200 Tage vor, ab M\u00e4rz 2027 nur noch 100 Tage und ab 2029 47 Tage. Wer Zertifikate noch von Hand erneuert, sollte auf automatische Erneuerung umstellen. Viele Hosting-Anbieter bieten das an, h\u00e4ufig \u00fcber Let's Encrypt.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Ampel<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td>Gr\u00fcn<\/td><td>Weiterleitung funktioniert, Zertifikat g\u00fcltig, Erneuerung automatisch<\/td><\/tr><tr><td>Gelb<\/td><td>Zertifikat g\u00fcltig, aber Erneuerung manuell oder Ablauf in weniger als 30 Tagen<\/td><\/tr><tr><td>Rot<\/td><td>Browser-Warnung, abgelaufenes Zertifikat, kein HTTPS oder keine Weiterleitung<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 2: Updates (3 Minuten)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Warum das wichtig ist:<\/strong> Viele Angriffe nutzen bekannte L\u00fccken in veralteter Software, f\u00fcr die l\u00e4ngst Updates existieren. Das betrifft das Content-Management-System selbst, aber auch Plugins, Themes und die PHP-Version auf dem Server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>So pr\u00fcfen Sie (am Beispiel WordPress):<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u00d6ffnen Sie im Dashboard den Bereich <strong>Aktualisierungen<\/strong>. Stehen dort Updates an, notieren Sie diese.<\/li>\n\n\n\n<li>Gehen Sie die Liste der <strong>Plugins<\/strong> durch. Pr\u00fcfen Sie f\u00fcr jedes Plugin, ob es noch gepflegt wird. Im Plugin-Verzeichnis sehen Sie, wann es zuletzt aktualisiert wurde. Plugins, die seit langer Zeit keine Updates mehr bekommen, sind ein Risiko.<\/li>\n\n\n\n<li>L\u00f6schen Sie <strong>inaktive Plugins und Themes<\/strong>, die Sie nicht brauchen. Auch deaktivierte Erweiterungen k\u00f6nnen Schwachstellen enthalten, solange ihre Dateien auf dem Server liegen.<\/li>\n\n\n\n<li>Pr\u00fcfen Sie die <strong>PHP-Version<\/strong> unter <em>Werkzeuge \u2192 Website-Zustand \u2192 Info \u2192 Server<\/em>. Vergleichen Sie sie mit der \u00dcbersicht der unterst\u00fctzten Versionen auf php.net\/supported-versions.php. Eine Version, die keine Sicherheitsupdates mehr erh\u00e4lt, sollte zeitnah ersetzt werden.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Bei anderen Systemen wie Joomla, TYPO3, Shopware oder Typo ist das Vorgehen \u00e4hnlich: Version des Systems, der Erweiterungen und der Serversoftware pr\u00fcfen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Tipp:<\/strong> Legen Sie vor gr\u00f6\u00dferen Updates ein Backup an. F\u00fcr kleine Sicherheitsupdates lassen sich automatische Aktualisierungen aktivieren.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Ampel<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td>Gr\u00fcn<\/td><td>Alles aktuell, keine \u00fcberfl\u00fcssigen Plugins, PHP wird unterst\u00fctzt<\/td><\/tr><tr><td>Gelb<\/td><td>Einzelne Updates stehen aus oder es gibt inaktive Plugins<\/td><\/tr><tr><td>Rot<\/td><td>Updates seit Wochen offen, ungepflegte Plugins oder nicht mehr unterst\u00fctzte PHP-Version<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 3: Zug\u00e4nge und Passw\u00f6rter (2 Minuten)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Warum das wichtig ist:<\/strong> Gestohlene oder erratene Passw\u00f6rter sind einer der h\u00e4ufigsten Wege in eine Website. Jeder zus\u00e4tzliche, vergessene Zugang vergr\u00f6\u00dfert die Angriffsfl\u00e4che.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>So pr\u00fcfen Sie:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u00d6ffnen Sie die <strong>Benutzerliste<\/strong> Ihres Systems. Kennen Sie jede Person? L\u00f6schen oder sperren Sie Konten ehemaliger Mitarbeiter, Praktikanten und Agenturen.<\/li>\n\n\n\n<li>Pr\u00fcfen Sie die <strong>Rollen<\/strong>. Nicht jeder braucht Administratorrechte. Redakteure kommen mit weniger aus.<\/li>\n\n\n\n<li>Vermeiden Sie den Benutzernamen \u201eadmin\u201c und verwenden Sie f\u00fcr jedes Konto ein <strong>eigenes, langes Passwort<\/strong> aus einem Passwortmanager.<\/li>\n\n\n\n<li>Ist f\u00fcr Administratorkonten die <strong>Zwei-Faktor-Anmeldung<\/strong> oder ein <strong>Passkey<\/strong> aktiviert? Das ist die wirksamste Einzelma\u00dfnahme gegen Konto\u00fcbernahmen.<\/li>\n\n\n\n<li>Denken Sie auch an Zug\u00e4nge au\u00dferhalb des CMS: Hosting-Konto, Datenbank, FTP oder SFTP. Bevorzugen Sie SFTP statt FTP, weil FTP Zugangsdaten unverschl\u00fcsselt \u00fcbertr\u00e4gt.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Ampel<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td>Gr\u00fcn<\/td><td>Nur bekannte Konten, starke Passw\u00f6rter, Zwei-Faktor f\u00fcr Administratoren<\/td><\/tr><tr><td>Gelb<\/td><td>Zwei-Faktor fehlt oder einzelne Konten haben zu viele Rechte<\/td><\/tr><tr><td>Rot<\/td><td>Alte oder unbekannte Konten, Standardbenutzer \u201eadmin\u201c mit schwachem Passwort, gemeinsame Zug\u00e4nge<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 4: Backups (2 Minuten)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Warum das wichtig ist:<\/strong> Wenn alles andere versagt, ist das Backup Ihre Lebensversicherung, ob nach einem Angriff, einem fehlerhaften Update oder einem Serverausfall. Entscheidend ist nicht, dass ein Backup existiert, sondern dass es sich auch wiederherstellen l\u00e4sst.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Beantworten Sie vier Fragen:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Gibt es ein Backup von <strong>Dateien und Datenbank<\/strong>?<\/li>\n\n\n\n<li>Wie <strong>aktuell<\/strong> ist das letzte Backup? Bei Websites mit t\u00e4glichen \u00c4nderungen sollte es h\u00f6chstens einen Tag alt sein.<\/li>\n\n\n\n<li>Liegt eine Kopie <strong>au\u00dferhalb<\/strong> des Servers, auf dem die Website l\u00e4uft? Ein Backup nur auf demselben Server geht mit diesem verloren.<\/li>\n\n\n\n<li>Haben Sie eine <strong>Wiederherstellung schon einmal getestet<\/strong>?<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Die 3-2-1-Regel als Richtschnur:<\/strong> drei Kopien, auf zwei verschiedenen Medien, davon eine an einem anderen Ort.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Ampel<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td>Gr\u00fcn<\/td><td>Aktuelles Backup, externe Kopie, Wiederherstellung getestet<\/td><\/tr><tr><td>Gelb<\/td><td>Backup vorhanden, aber nur auf dem Server oder nie getestet<\/td><\/tr><tr><td>Rot<\/td><td>Kein Backup, oder niemand wei\u00df, wo es liegt<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 5: Konfiguration und Sicherheits-Header (2 Minuten)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Warum das wichtig ist:<\/strong> Browser und Server tauschen vor jeder Seite Zusatzinformationen aus, die sogenannten HTTP-Header. Sicherheits-Header sagen dem Browser, wie er Ihre Seite sicher behandeln soll. Sie sind kein Ersatz f\u00fcr Updates, aber ein g\u00fcnstiger zus\u00e4tzlicher Schutz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>So pr\u00fcfen Sie:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Geben Sie Ihre Adresse bei einem Header-Test ein, zum Beispiel securityheaders.com oder dem MDN HTTP Observatory von Mozilla. Das Ergebnis erscheint nach wenigen Sekunden.<\/li>\n\n\n\n<li>Achten Sie auf diese Header:<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Header<\/th><th>Wof\u00fcr er gut ist<\/th><\/tr><\/thead><tbody><tr><td>Strict-Transport-Security (HSTS)<\/td><td>Erzwingt dauerhaft verschl\u00fcsselte Verbindungen<\/td><\/tr><tr><td>X-Content-Type-Options<\/td><td>Verhindert, dass der Browser Dateitypen \u201eerr\u00e4t\u201c<\/td><\/tr><tr><td>Referrer-Policy<\/td><td>Begrenzt, welche Seitenadresse an andere Anbieter weitergegeben wird<\/td><\/tr><tr><td>Content-Security-Policy<\/td><td>Legt fest, woher Skripte und Inhalte geladen werden d\u00fcrfen, auch gegen Einbettung in fremde Seiten<\/td><\/tr><tr><td>Permissions-Policy<\/td><td>Schr\u00e4nkt Browserfunktionen wie Kamera oder Standort ein<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Rufen Sie <strong>nur auf Ihrer eigenen Seite<\/strong> testweise einen Ordner wie <code>\/wp-content\/uploads\/<\/code> auf. Es darf keine Dateiliste erscheinen.<\/li>\n\n\n\n<li>Pr\u00fcfen Sie, dass keine <strong>Sicherungs- oder Testdateien<\/strong> \u00f6ffentlich erreichbar sind, etwa Archive, Datenbank-Dumps oder Konfigurationsdateien. Im Zweifel fragen Sie Ihren Hoster oder Ihre Agentur.<\/li>\n\n\n\n<li>Fehlermeldungen von PHP oder dem System geh\u00f6ren nicht in den sichtbaren Bereich f\u00fcr Besucher.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>F\u00fcr Fortgeschrittene:<\/strong> Mit einem Befehl in der Eingabeaufforderung sehen Sie die Header Ihrer eigenen Seite direkt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -I https:\/\/www.ihre-domain.de<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Vorsicht bei HSTS:<\/strong> Aktivieren Sie diesen Header erst, wenn die gesamte Seite zuverl\u00e4ssig \u00fcber HTTPS l\u00e4uft. Eine Fehlkonfiguration kann Besucher aussperren.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Ampel<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td>Gr\u00fcn<\/td><td>Wichtige Header gesetzt, keine Dateilisten, keine sichtbaren Fehlermeldungen<\/td><\/tr><tr><td>Gelb<\/td><td>Einzelne Header fehlen<\/td><\/tr><tr><td>Rot<\/td><td>Dateilisten, \u00f6ffentlich erreichbare Backups oder Konfigurationsdateien, sichtbare Fehlermeldungen<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 6: Bekannte Schwachstellen und automatisierter Scan (2 Minuten)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Warum das wichtig ist:<\/strong> Sicherheitsl\u00fccken in Software werden \u00f6ffentlich als <strong>CVE<\/strong> (Common Vulnerabilities and Exposures) mit einer eindeutigen Kennung gelistet. Dazu geh\u00f6rt meist eine Bewertung des Schweregrads, der CVSS-Wert. Angreifer durchsuchen das Netz automatisiert nach Seiten, die betroffene Versionen einsetzen. Lesen Sie dazu auch den Beitrag <a href=\"https:\/\/wwwschutz.de\/blog\/angreifer-brauchen-sekunden-ihre-website-braucht-einen-plan\/\">Angreifer brauchen Sekunden \u2013 Ihre Website braucht einen Plan<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>So pr\u00fcfen Sie:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Notieren Sie Namen und Version Ihres Systems sowie Ihrer wichtigsten Plugins und Themes.<\/li>\n\n\n\n<li>Suchen Sie diese in einer Schwachstellendatenbank, etwa in der National Vulnerability Database (nvd.nist.gov) oder in speziellen WordPress-Datenbanken wie denen von Patchstack oder WPScan.<\/li>\n\n\n\n<li>Lassen Sie einen automatisierten Scan laufen, der das f\u00fcr Sie \u00fcbernimmt. Der <a href=\"https:\/\/wwwschutz.de\/security-checks.html\">Website Security Check<\/a> pr\u00fcft zum Beispiel neben bekannten Schwachstellen auch DNS- und Hosting-Einstellungen, JavaScript, CMS und Plugins sowie Kontaktformulare. Das Ergebnis ist ein Bericht, der Befunde nach Dringlichkeit sortiert, sodass Sie wissen, womit Sie anfangen.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wichtig:<\/strong> Ein automatisierter Scan ist ein schneller erster Blick, ersetzt aber keinen Penetrationstest durch Fachleute. Er findet bekannte Probleme zuverl\u00e4ssig, aber keine individuellen Fehler in selbst entwickelten Funktionen.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Ampel<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td>Gr\u00fcn<\/td><td>Keine bekannten Schwachstellen in eingesetzter Software<\/td><\/tr><tr><td>Gelb<\/td><td>Schwachstellen mit niedrigem oder mittlerem Schweregrad<\/td><\/tr><tr><td>Rot<\/td><td>Hohe oder kritische Schwachstellen, besonders wenn sie bereits aktiv ausgenutzt werden<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 7: Notfallplan und Pflichten (2 Minuten)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Warum das wichtig ist:<\/strong> Wenn eine Website kompromittiert wird, entscheiden die ersten Stunden \u00fcber den Schaden. Wer dann erst nach Zust\u00e4ndigkeiten und Zugangsdaten suchen muss, verliert wertvolle Zeit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Legen Sie jetzt einen Notfallzettel an mit:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>dem Namen und der Telefonnummer der <strong>verantwortlichen Person<\/strong> und einer Vertretung<\/li>\n\n\n\n<li>den Kontaktdaten Ihres <strong>Hosting-Anbieters<\/strong> und Ihrer <strong>Agentur<\/strong><\/li>\n\n\n\n<li>dem Ort, an dem <strong>Backups<\/strong> und <strong>Zugangsdaten<\/strong> sicher liegen<\/li>\n\n\n\n<li>einer kurzen Liste der <strong>ersten Schritte<\/strong>: Passw\u00f6rter \u00e4ndern, Seite in den Wartungsmodus setzen, Backup einspielen, Protokolle sichern, Hoster informieren<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Datenschutz im Ernstfall:<\/strong> Wurden personenbezogene Daten kompromittiert, m\u00fcssen Sie die Datenschutzverletzung unter bestimmten Voraussetzungen innerhalb von 72 Stunden der Aufsichtsbeh\u00f6rde melden (Art. 33 DSGVO), sofern ein Risiko f\u00fcr die Betroffenen besteht. Ein vorbereiteter Ablauf hilft, diese Frist einzuhalten. Mehr zu Datenschutzthemen finden Sie im Beitrag <a href=\"https:\/\/dr-dsgvo.de\/webseiten-check\/\" target=\"_blank\" rel=\"noopener\">Rechtssichere Webseiten mit dem DSGVO-Website-Check<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Auch kurz pr\u00fcfen:<\/strong> Sind Impressum und Datenschutzerkl\u00e4rung von jeder Seite aus erreichbar und aktuell?<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Ampel<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td>Gr\u00fcn<\/td><td>Notfallzettel vorhanden, Zust\u00e4ndigkeiten gekl\u00e4rt<\/td><\/tr><tr><td>Gelb<\/td><td>Teile bekannt, aber nichts schriftlich festgehalten<\/td><\/tr><tr><td>Rot<\/td><td>Niemand wei\u00df, was im Ernstfall zu tun ist<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Ihre Auswertung: Aus Ampeln wird eine Aufgabenliste<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tragen Sie Ihre Ergebnisse ein und erg\u00e4nzen Sie, wer was bis wann erledigt:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Schritt<\/th><th>Ergebnis (Gr\u00fcn, Gelb, Rot)<\/th><th>Aufgabe<\/th><th>Zust\u00e4ndig<\/th><th>Bis wann<\/th><\/tr><\/thead><tbody><tr><td>1 HTTPS und Zertifikat<\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>2 Updates<\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>3 Zug\u00e4nge<\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>4 Backups<\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>5 Konfiguration und Header<\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>6 Schwachstellen<\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>7 Notfallplan<\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>So kann eine ausgef\u00fcllte Auswertung aussehen: Rote Punkte zuerst, gelbe danach.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">In welcher Reihenfolge Sie vorgehen sollten<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn mehrere Punkte rot oder gelb sind, hilft diese Reihenfolge:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Backups:<\/strong> Ohne funktionierende Sicherung kann jedes andere Problem teuer werden.<\/li>\n\n\n\n<li><strong>Updates:<\/strong> Das schlie\u00dft die h\u00e4ufigsten Einfallstore.<\/li>\n\n\n\n<li><strong>Zug\u00e4nge und Zwei-Faktor:<\/strong> Das verhindert Konto\u00fcbernahmen.<\/li>\n\n\n\n<li><strong>HTTPS und Sicherheits-Header:<\/strong> Das st\u00e4rkt die Grundkonfiguration.<\/li>\n\n\n\n<li><strong>Schwachstellen:<\/strong> Beheben Sie kritische Befunde nach Dringlichkeit.<\/li>\n\n\n\n<li><strong>Notfallplan:<\/strong> Schreiben Sie ihn auf, solange nichts passiert ist.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"778\" src=\"https:\/\/wwwschutz.de\/blog\/wp-content\/uploads\/beispiel_ampel_auswertung_sicherheitscheck-1024x778.png\" alt=\"Beispiel einer Ampel-Auswertung mit sieben Zeilen f\u00fcr die Schritte des Sicherheitschecks\" class=\"wp-image-5553\" srcset=\"https:\/\/wwwschutz.de\/blog\/wp-content\/uploads\/beispiel_ampel_auswertung_sicherheitscheck-1024x778.png 1024w, https:\/\/wwwschutz.de\/blog\/wp-content\/uploads\/beispiel_ampel_auswertung_sicherheitscheck-300x228.png 300w, https:\/\/wwwschutz.de\/blog\/wp-content\/uploads\/beispiel_ampel_auswertung_sicherheitscheck-768x583.png 768w, https:\/\/wwwschutz.de\/blog\/wp-content\/uploads\/beispiel_ampel_auswertung_sicherheitscheck-1536x1166.png 1536w, https:\/\/wwwschutz.de\/blog\/wp-content\/uploads\/beispiel_ampel_auswertung_sicherheitscheck-2048x1555.png 2048w, https:\/\/wwwschutz.de\/blog\/wp-content\/uploads\/beispiel_ampel_auswertung_sicherheitscheck-640x486.png 640w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Beispiel einer Website-Auswertung.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">So bleiben Sie dran<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein einmaliger Check ist besser als keiner, aber Sicherheit ist kein Zustand, sondern eine Gewohnheit:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Monatlich:<\/strong> Wiederholen Sie die 15 Minuten. Ein fester Kalendereintrag hilft.<\/li>\n\n\n\n<li><strong>Nach \u00c4nderungen:<\/strong> Pr\u00fcfen Sie erneut nach neuen Plugins, einem Relaunch, einem Wechsel des Hosters oder einer neuen Agentur.<\/li>\n\n\n\n<li><strong>Viertelj\u00e4hrlich:<\/strong> Nehmen Sie sich mehr Zeit, testen Sie eine Wiederherstellung und \u00fcberpr\u00fcfen Sie Zug\u00e4nge gr\u00fcndlich.<\/li>\n\n\n\n<li><strong>Bei Fristen:<\/strong> Zertifikatslaufzeiten und Support-Enden von PHP-Versionen sind feste Termine, die Sie sich notieren sollten.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Grenzen dieses Checks<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der 15-Minuten-Check erfasst die wichtigsten Grundlagen, mehr nicht. Er ersetzt keinen Penetrationstest, keine Pr\u00fcfung selbst entwickelter Funktionen und keine rechtliche Bewertung. Betreiben Sie einen Online-Shop mit Zahlungsdaten oder verarbeiten Sie besonders sensible Daten, brauchen Sie zus\u00e4tzliche Ma\u00dfnahmen und fachkundige Begleitung.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">H\u00e4ufige Fragen<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Brauche ich daf\u00fcr IT-Kenntnisse?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr die meisten Schritte gen\u00fcgt Grundwissen im Umgang mit dem Verwaltungsbereich Ihrer Website. Bei Unsicherheit helfen Ihr Hosting-Anbieter oder Ihre Agentur.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Wie oft sollte ich den Check wiederholen?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Monatlich, sowie nach gr\u00f6\u00dferen \u00c4nderungen an der Website. Bei Shops und stark genutzten Seiten lohnt eine h\u00e4ufigere automatische Pr\u00fcfung.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Was mache ich, wenn mehrere Punkte rot sind?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bleiben Sie ruhig und arbeiten Sie die Reihenfolge von oben nach unten ab. Beginnen Sie mit dem Backup. Wenn Sie nicht allein weiterkommen, holen Sie sich Unterst\u00fctzung durch Ihren Hoster oder einen Fachbetrieb.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Reicht es, ein Sicherheits-Plugin zu installieren?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Plugin kann helfen, ersetzt aber nicht die Grundlagen: aktuelle Software, starke Zug\u00e4nge, Backups und ein Notfallplan. Ein Plugin, das selbst nicht aktuell gehalten wird, kann sogar zum Risiko werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Geh\u00f6rt Barrierefreiheit auch zur Website-Qualit\u00e4t?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ja. Wer seine Website regelm\u00e4\u00dfig auf Sicherheit pr\u00fcft, sollte die Zug\u00e4nglichkeit gleich mitdenken. Mehr dazu im Beitrag <a href=\"https:\/\/wwwschutz.de\/blog\/barrierefreiheit-im-web-technische-pflicht-und-gesellschaftliche-verantwortung\/\">Barrierefreiheit im Web<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sicherheit beginnt nicht mit teuren Werkzeugen, sondern mit Aufmerksamkeit f\u00fcr die Grundlagen. In 15 Minuten wissen Sie, ob Ihre Verschl\u00fcsselung stimmt, Ihre Software aktuell ist, Ihre Zug\u00e4nge sauber sind, ein brauchbares Backup existiert und ob Sie im Ernstfall handlungsf\u00e4hig w\u00e4ren. Wer das monatlich wiederholt, beseitigt die meisten typischen Risiken, bevor jemand sie ausnutzt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Website Security: Anleitung, um In 15 Minuten die wichtigsten Dinge zu pr\u00fcfen und die Webseite sicherer zu machen. Schritt-f\u00fcr-Schritt zum Erfolg.<\/p>\n","protected":false},"author":4,"featured_media":5555,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[90],"tags":[],"class_list":["post-5552","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-security","entry"],"blocks":"<!-- wp:paragraph -->\n<p><em>Die meisten Website-Betreiber k\u00fcmmern sich um Inhalte, Design und Suchmaschinen, und denken an Sicherheit erst, wenn etwas passiert ist. Dabei lassen sich viele typische Schwachstellen in einer Viertelstunde aufsp\u00fcren. Dieser Beitrag f\u00fchrt in sieben Schritten von je zwei bis drei Minuten durch einen Basis-Check, der ohne Spezialwissen durchgef\u00fchrt werden kann. Am Ende haben Sie eine Ampel-Auswertung und eine klare Reihenfolge, was Sie zuerst angehen sollten.<\/em><\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><em>Der Zeitplan im \u00dcberblick: sieben Stationen, zusammen 15 Minuten.<\/em><\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<!-- Animation: Der 15-Minuten-Sicherheitscheck f\u00fcr Websites (Pinselstriche, reines JavaScript, ca. 50 Sekunden, Endlosschleife) -->\n<!-- Einbinden: diesen kompletten Block in die Zielseite einf\u00fcgen. Alle Stile sind auf .wsc15-* begrenzt. -->\n<div class=\"wsc15-wrap\" data-wsc15>\n  <canvas class=\"wsc15-canvas\" tabindex=\"0\" role=\"img\" aria-label=\"Animation: Der 15-Minuten-Sicherheitscheck f\u00fcr Websites in sieben Schritten. Klicken oder Leertaste zum Anhalten und Fortsetzen.\"><\/canvas>\n  <p class=\"wsc15-sr\">Der 15-Minuten-Sicherheitscheck in sieben Schritten: 1. Verschl\u00fcsselung und Zertifikat (2 Minuten), 2. Updates (3 Minuten), 3. Zug\u00e4nge und Passw\u00f6rter (2 Minuten), 4. Backups (2 Minuten), 5. Konfiguration und Sicherheits-Header (2 Minuten), 6. Bekannte Schwachstellen (2 Minuten), 7. Notfallplan und Pflichten (2 Minuten). Zum Schluss eine Ampel-Auswertung: rote Punkte zuerst beheben, danach die gelben, mit dem Backup beginnen und den Check monatlich wiederholen.<\/p>\n<\/div>\n<style>\n.wsc15-wrap{position:relative;display:block;width:100%;max-width:1000px;margin:0 auto;padding:0;border:0;border-radius:14px;overflow:hidden;background:#fbf8f2;box-shadow:0 2px 14px rgba(35,48,64,.12);box-sizing:border-box;line-height:0;font-size:0}\n.wsc15-wrap::before{content:\"\";display:block;padding-top:56%}\n.wsc15-wrap .wsc15-canvas{position:absolute;top:0;left:0;width:100%;height:100%;display:block;margin:0;padding:0;border:0;cursor:pointer;outline:none;max-width:none}\n.wsc15-wrap .wsc15-canvas:focus-visible{outline:3px solid #2f6fb5;outline-offset:-3px}\n.wsc15-wrap .wsc15-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n<\/style>\n<script>\n(function () {\n  \"use strict\";\n\n  var W = 1000, H = 560, TOTAL = 50;\n  var FONT = '\"Segoe UI\", \"Helvetica Neue\", Helvetica, Arial, sans-serif';\n  var PAPER = \"#fbf8f2\", INK = \"#233040\", INK2 = \"#5a6573\";\n  var RED = \"#d64545\", YEL = \"#e2ad1f\", GRN = \"#3a9d57\";\n\n  var STATIONS = [\n    { c: \"#2f6fb5\", min: 2, title: \"Verschl\u00fcsselung und Zertifikat\", icon: \"lock\",\n      b: [\"http:\/\/ leitet auf https:\/\/ weiter\", \"Ablaufdatum des Zertifikats notieren\", \"Erneuerung automatisieren\"],\n      g: \"Gr\u00fcn: Weiterleitung klappt, Zertifikat g\u00fcltig, Erneuerung automatisch\" },\n    { c: \"#2a9d8f\", min: 3, title: \"Updates\", icon: \"update\",\n      b: [\"CMS, Plugins und Themes aktualisieren\", \"Inaktive Erweiterungen l\u00f6schen\", \"PHP-Version: noch unterst\u00fctzt?\"],\n      g: \"Gr\u00fcn: alles aktuell, keine \u00fcberfl\u00fcssigen Plugins, PHP wird unterst\u00fctzt\" },\n    { c: \"#7b5cc4\", min: 2, title: \"Zug\u00e4nge und Passw\u00f6rter\", icon: \"key\",\n      b: [\"Unbekannte Konten entfernen\", \"Admin-Rechte nur, wo n\u00f6tig\", \"Zwei-Faktor oder Passkey aktivieren\"],\n      g: \"Gr\u00fcn: nur bekannte Konten, starke Passw\u00f6rter, Zwei-Faktor f\u00fcr Admins\" },\n    { c: \"#e07a2e\", min: 2, title: \"Backups\", icon: \"db\",\n      b: [\"Dateien und Datenbank sichern\", \"Eine Kopie au\u00dferhalb des Servers\", \"Wiederherstellung testen\"],\n      g: \"Gr\u00fcn: aktuelles Backup, externe Kopie, Wiederherstellung getestet\" },\n    { c: \"#3d5a98\", min: 2, title: \"Konfiguration und Sicherheits-Header\", icon: \"shield\",\n      b: [\"Header-Test durchf\u00fchren\", \"Keine offenen Dateilisten\", \"Keine sichtbaren Fehlermeldungen\"],\n      g: \"Gr\u00fcn: wichtige Header gesetzt, keine Dateilisten, keine Fehlermeldungen\" },\n    { c: \"#d1495b\", min: 2, title: \"Bekannte Schwachstellen\", icon: \"lens\",\n      b: [\"Versionen von System und Plugins notieren\", \"Mit CVE-Datenbanken abgleichen\", \"Automatisierten Scan starten\"],\n      g: \"Gr\u00fcn: keine bekannten Schwachstellen in Ihrer Software\" },\n    { c: \"#a8792a\", min: 2, title: \"Notfallplan und Pflichten\", icon: \"clip\",\n      b: [\"Zust\u00e4ndige und Vertretung notieren\", \"Erste Schritte festlegen\", \"Ggf. Meldung binnen 72 Std. (DSGVO)\"],\n      g: \"Gr\u00fcn: Notfallzettel vorhanden, Zust\u00e4ndigkeiten gekl\u00e4rt\" }\n  ];\n  var CUM = [0, 2, 5, 7, 9, 11, 13, 15];\n\n  \/* Hilfsfunktionen *\/\n  function rng(seed) {\n    var s = seed >>> 0;\n    return function () {\n      s = (s + 0x6D2B79F5) >>> 0;\n      var t = s;\n      t = Math.imul(t ^ (t >>> 15), t | 1);\n      t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n      return ((t ^ (t >>> 14)) >>> 0) \/ 4294967296;\n    };\n  }\n  function clamp(v, a, b) { return v < a ? a : (v > b ? b : v); }\n  function ease(x) { x = clamp(x, 0, 1); return 0.5 - 0.5 * Math.cos(Math.PI * x); }\n  function prog(t, s, d) { return clamp((t - s) \/ d, 0, 1); }\n  function deg(d) { return d * Math.PI \/ 180; }\n  function hexToRgb(h) { var n = parseInt(h.slice(1), 16); return [n >> 16, (n >> 8) % 256, n % 256]; }\n  function mix(hex, amt) {\n    var c = hexToRgb(hex), t = amt > 0 ? 255 : 0, a = Math.abs(amt);\n    var out = \"#\", k, v;\n    for (k = 0; k < 3; k++) {\n      v = clamp(Math.round(c[k] + (t - c[k]) * a), 0, 255).toString(16);\n      out += v.length < 2 ? \"0\" + v : v;\n    }\n    return out;\n  }\n  function arcPts(cx, cy, r, a0, a1, n, ry) {\n    var out = [], i, a;\n    if (ry === undefined) ry = r;\n    for (i = 0; i <= n; i++) {\n      a = a0 + (a1 - a0) * i \/ n;\n      out.push([cx + r * Math.cos(a), cy + ry * Math.sin(a)]);\n    }\n    return out;\n  }\n  function spiral(cx, cy, r0, r1, turns, n) {\n    var out = [], i, f, a, r;\n    for (i = 0; i <= n; i++) {\n      f = i \/ n; a = f * turns * Math.PI * 2 - Math.PI \/ 2; r = r0 + (r1 - r0) * f;\n      out.push([cx + r * Math.cos(a), cy + r * Math.sin(a)]);\n    }\n    return out;\n  }\n  function head(E, d, L) {\n    var bx = -d[0], by = -d[1], a = deg(35);\n    var v1 = [bx * Math.cos(a) - by * Math.sin(a), bx * Math.sin(a) + by * Math.cos(a)];\n    var v2 = [bx * Math.cos(-a) - by * Math.sin(-a), bx * Math.sin(-a) + by * Math.cos(-a)];\n    return [[E[0] + v1[0] * L, E[1] + v1[1] * L], [E[0], E[1]], [E[0] + v2[0] * L, E[1] + v2[1] * L]];\n  }\n  function shift(pts, dx, dy) {\n    var out = [], i;\n    for (i = 0; i < pts.length; i++) out.push([pts[i][0] + dx, pts[i][1] + dy]);\n    return out;\n  }\n\n  \/* Pinselstrich aus einzelnen Borsten *\/\n  var seedCounter = 11;\n  function Stroke(pts, o) {\n    o = o || {};\n    this.w = o.w || 12;\n    this.color = o.color || INK;\n    this.t0 = o.t0 || 0;\n    this.dur = o.dur || 0.5;\n    this.solid = !!o.solid;\n    this.step = o.step || 3;\n    seedCounter += 1;\n    var r = rng(o.seed || seedCounter * 7919);\n    var dense = [], i, j, a, b, len, steps;\n    for (i = 0; i < pts.length - 1; i++) {\n      a = pts[i]; b = pts[i + 1];\n      len = Math.hypot(b[0] - a[0], b[1] - a[1]);\n      steps = Math.max(1, Math.ceil(len \/ this.step));\n      for (j = 0; j < steps; j++) dense.push([a[0] + (b[0] - a[0]) * j \/ steps, a[1] + (b[1] - a[1]) * j \/ steps]);\n    }\n    dense.push(pts[pts.length - 1].slice());\n    var n = dense.length, nx = [], ny = [], k, p0, p1, dx, dy, d, s, wo;\n    for (k = 0; k < n; k++) {\n      p0 = dense[Math.max(0, k - 2)]; p1 = dense[Math.min(n - 1, k + 2)];\n      dx = p1[0] - p0[0]; dy = p1[1] - p0[1]; d = Math.hypot(dx, dy) || 1;\n      nx.push(-dy \/ d); ny.push(dx \/ d);\n    }\n    var wob = o.wobble === undefined ? 1.2 : o.wobble, ph1 = r() * 6.28, ph2 = r() * 6.28;\n    for (k = 0; k < n; k++) {\n      s = k \/ Math.max(1, n - 1);\n      wo = wob * (Math.sin(s * 7 + ph1) + 0.5 * Math.sin(s * 17 + ph2));\n      dense[k][0] += nx[k] * wo; dense[k][1] += ny[k] * wo;\n    }\n    this.p = dense; this.nx = nx; this.ny = ny; this.n = n;\n    var cnt = o.bristles || Math.round(clamp(this.w * 0.9, 6, 34));\n    this.br = [];\n    for (k = 0; k < cnt; k++) {\n      var bo = (k + 0.5) \/ cnt - 0.5 + (r() - 0.5) * 0.6 \/ cnt;\n      var edge = Math.abs(bo) * 2;\n      this.br.push({\n        off: bo,\n        lw: Math.max(0.8, this.w \/ cnt * (1.3 + r() * 1.3)),\n        alpha: this.solid ? 1 : (0.45 + r() * 0.5) * (1 - edge * 0.3),\n        col: this.solid ? this.color : mix(this.color, (r() - 0.5) * 0.28),\n        gf: 0.015 + r() * 0.045,\n        gp: r() * 6.28,\n        gt: this.solid ? 2 : (0.985 - edge * edge * 0.22 - r() * 0.05),\n        s0: r() * 0.04 * edge,\n        s1: 1 - r() * 0.07 * edge,\n        pp: r() * 6.28\n      });\n    }\n  }\n  Stroke.prototype.draw = function (ctx, t) {\n    var raw = (t - this.t0) \/ this.dur;\n    if (raw <= 0) return;\n    var p = ease(raw), n = this.n, last = Math.floor(p * (n - 1));\n    var k, b, i, i0, i1, s, tp, pr, x, y, on;\n    ctx.lineCap = \"round\"; ctx.lineJoin = \"round\";\n    for (k = 0; k < this.br.length; k++) {\n      b = this.br[k];\n      i0 = Math.floor(b.s0 * (n - 1));\n      i1 = Math.min(last, Math.floor(b.s1 * (n - 1)));\n      if (i1 <= i0) continue;\n      ctx.beginPath(); on = false;\n      for (i = i0; i <= i1; i++) {\n        s = i \/ Math.max(1, n - 1);\n        tp = Math.sqrt(Math.max(Math.min(1, s \/ 0.07, (1 - s) \/ 0.1), 0.15));\n        pr = 0.88 + 0.12 * Math.sin(s * 5 + b.pp);\n        x = this.p[i][0] + this.nx[i] * b.off * this.w * tp * pr;\n        y = this.p[i][1] + this.ny[i] * b.off * this.w * tp * pr;\n        if (Math.sin(i * this.step * b.gf + b.gp) > b.gt) { on = false; continue; }\n        if (on) { ctx.lineTo(x, y); } else { ctx.moveTo(x, y); on = true; }\n      }\n      ctx.globalAlpha = b.alpha;\n      ctx.strokeStyle = b.col;\n      ctx.lineWidth = b.lw;\n      ctx.stroke();\n    }\n    if (raw < 1) {\n      if (!this.solid) {\n        ctx.globalAlpha = 0.22;\n        ctx.fillStyle = this.color;\n        ctx.beginPath();\n        ctx.arc(this.p[last][0], this.p[last][1], this.w * 0.42, 0, Math.PI * 2);\n        ctx.fill();\n      }\n    }\n    ctx.globalAlpha = 1;\n  };\n\n  \/* Text, der wie mit dem Pinsel aufgetragen erscheint *\/\n  function drawText(ctx, str, x, y, size, color, weight, p, align, maxW) {\n    if (p <= 0) return;\n    ctx.save();\n    ctx.font = weight + \" \" + size + \"px \" + FONT;\n    ctx.textAlign = align; ctx.textBaseline = \"alphabetic\";\n    var w = ctx.measureText(str).width;\n    if (maxW) { if (w > maxW) w = maxW; }\n    var x0 = x;\n    if (align === \"center\") x0 = x - w \/ 2;\n    if (align === \"right\") x0 = x - w;\n    ctx.beginPath();\n    ctx.rect(x0 - 6, y - size * 1.15, (w + 12) * ease(p), size * 1.6);\n    ctx.clip();\n    ctx.globalAlpha = clamp(p * 2.2, 0, 1);\n    ctx.fillStyle = color;\n    if (maxW) { ctx.fillText(str, x, y, maxW); } else { ctx.fillText(str, x, y); }\n    ctx.restore();\n  }\n  function TextItem(str, x, y, size, color, weight, t0, dur, align, maxW) {\n    this.s = str; this.x = x; this.y = y; this.size = size; this.color = color;\n    this.weight = weight || 400; this.t0 = t0; this.dur = dur || 0.5;\n    this.align = align || \"left\"; this.maxW = maxW || 0;\n  }\n  TextItem.prototype.draw = function (ctx, t) {\n    drawText(ctx, this.s, this.x, this.y, this.size, this.color, this.weight, prog(t, this.t0, this.dur), this.align, this.maxW);\n  };\n  function fitSize(ctx, str, weight, size, maxW) {\n    while (size > 14) {\n      ctx.font = weight + \" \" + size + \"px \" + FONT;\n      if (ctx.measureText(str).width <= maxW) break;\n      size -= 1;\n    }\n    return size;\n  }\n  function textWidth(ctx, str, weight, size) {\n    ctx.font = weight + \" \" + size + \"px \" + FONT;\n    return ctx.measureText(str).width;\n  }\n  function wrap(ctx, str, weight, size, maxW) {\n    var words = str.split(\" \"), lines = [], line = \"\", i, test;\n    ctx.font = weight + \" \" + size + \"px \" + FONT;\n    for (i = 0; i < words.length; i++) {\n      test = line ? line + \" \" + words[i] : words[i];\n      if (ctx.measureText(test).width > maxW) {\n        if (line) { lines.push(line); line = words[i]; } else { lines.push(test); line = \"\"; }\n      } else { line = test; }\n    }\n    if (line) lines.push(line);\n    return lines;\n  }\n\n  \/* Symbole als Pinselpfade, zentriert um (0,0) *\/\n  function iconPaths(name) {\n    var a1, a2, e1, e2;\n    if (name === \"lock\") {\n      return [\n        [[-35, -2]].concat(arcPts(0, -32, 35, deg(180), deg(360), 20)).concat([[35, -2]]),\n        [[-55, -2], [55, -2], [55, 62], [-55, 62], [-55, -2]],\n        [[0, 14], [0, 38]]\n      ];\n    }\n    if (name === \"update\") {\n      a1 = arcPts(0, 0, 55, deg(200), deg(330), 22);\n      a2 = arcPts(0, 0, 55, deg(20), deg(150), 22);\n      e1 = a1[a1.length - 1]; e2 = a2[a2.length - 1];\n      return [a1, head(e1, [-Math.sin(deg(330)), Math.cos(deg(330))], 22), a2, head(e2, [-Math.sin(deg(150)), Math.cos(deg(150))], 22)];\n    }\n    if (name === \"key\") {\n      return [arcPts(-38, 0, 26, 0, deg(375), 26), [[-12, 0], [66, 0]], [[42, 0], [42, 22]], [[60, 0], [60, 18]]];\n    }\n    if (name === \"db\") {\n      return [\n        arcPts(0, -45, 50, 0, deg(365), 30, 16),\n        [[-50, -45], [-50, 45]], [[50, -45], [50, 45]],\n        arcPts(0, 0, 50, 0, deg(180), 18, 16),\n        arcPts(0, 45, 50, 0, deg(180), 18, 16)\n      ];\n    }\n    if (name === \"shield\") {\n      return [[[0, -68], [55, -48], [50, 12], [0, 68], [-50, 12], [-55, -48], [0, -68]], [[-24, 0], [-6, 20], [28, -24]]];\n    }\n    if (name === \"lens\") {\n      return [arcPts(-14, -14, 40, 0, deg(370), 32), [[16, 16], [58, 58]]];\n    }\n    return [\n      [[-45, -52], [45, -52], [45, 70], [-45, 70], [-45, -52]],\n      [[-18, -60], [18, -60]],\n      [[-26, -14], [26, -14]], [[-26, 12], [26, 12]], [[-26, 38], [10, 38]]\n    ];\n  }\n\n  function wipeStroke(t0) {\n    return new Stroke([[-160, 270], [300, 262], [700, 276], [1160, 266]],\n      { w: 500, color: PAPER, solid: true, t0: t0, dur: 0.6, wobble: 6, step: 6, bristles: 30 });\n  }\n\n  \/* Szenen aufbauen *\/\n  function build(ctx) {\n    var scenes = [], items, i, k, st, c, y, size, tw, lines, j;\n\n    \/* Intro *\/\n    items = [];\n    items.push(new Stroke(spiral(290, 270, 10, 150, 3, 140), { w: 62, color: mix(\"#2f6fb5\", 0.8), t0: 0.0, dur: 0.9, wobble: 2 }));\n    items.push(new Stroke(arcPts(290, 270, 150, deg(-95), deg(272), 90), { w: 18, color: \"#2f6fb5\", t0: 0.4, dur: 1.0 }));\n    for (k = 0; k < 12; k++) {\n      var ang = deg(k * 30);\n      items.push(new Stroke([[290 + 124 * Math.cos(ang), 270 + 124 * Math.sin(ang)], [290 + 136 * Math.cos(ang), 270 + 136 * Math.sin(ang)]],\n        { w: 5, color: INK2, t0: 0.9 + k * 0.04, dur: 0.15, wobble: 0 }));\n    }\n    items.push(new Stroke([[246, 222], [276, 196], [276, 346]], { w: 24, color: \"#1f3b5c\", t0: 1.2, dur: 0.45 }));\n    items.push(new Stroke([[362, 198], [312, 198], [308, 262]].concat(arcPts(332, 300, 42, deg(-120), deg(140), 24)), { w: 24, color: \"#1f3b5c\", t0: 1.55, dur: 0.7 }));\n    items.push(new TextItem(\"Minuten\", 290, 398, 22, INK2, 600, 2.1, 0.5, \"center\"));\n    size = fitSize(ctx, \"Sicherheitscheck\", 700, 52, 470);\n    tw = textWidth(ctx, \"Sicherheitscheck\", 700, size);\n    items.push(new TextItem(\"Der 15-Minuten-\", 500, 190, 42, INK, 700, 1.7, 0.6));\n    items.push(new Stroke([[492, 250], [500 + tw + 12, 245]], { w: 48, color: \"#f6d36b\", t0: 2.0, dur: 0.5 }));\n    items.push(new TextItem(\"Sicherheitscheck\", 500, 264, size, INK, 700, 2.15, 0.6));\n    items.push(new TextItem(\"f\u00fcr Websites\", 500, 322, 42, INK, 700, 2.55, 0.6));\n    items.push(new TextItem(\"Sieben Stationen, je zwei bis drei Minuten.\", 500, 382, 20, INK2, 400, 3.0, 0.6, \"left\", 470));\n    items.push(new TextItem(\"Ohne Spezialwissen, f\u00fcr Ihre eigene Website.\", 500, 414, 20, INK2, 400, 3.35, 0.6, \"left\", 470));\n    items.push(wipeStroke(4.4));\n    scenes.push({ start: 0, dur: 5, items: items, idx: -1 });\n\n    \/* Sieben Stationen *\/\n    for (i = 0; i < STATIONS.length; i++) {\n      st = STATIONS[i]; c = st.c; items = [];\n      items.push(new Stroke(spiral(240, 270, 10, 118, 2.6, 120), { w: 58, color: mix(c, 0.74), t0: 0.05, dur: 0.7, wobble: 2 }));\n      var ip = iconPaths(st.icon);\n      for (k = 0; k < ip.length; k++) {\n        items.push(new Stroke(shift(ip[k], 240, 270), { w: 13, color: mix(c, -0.28), t0: 0.5 + k * 0.28, dur: 0.4 }));\n      }\n      items.push(new TextItem(\"Schritt \" + (i + 1) + \" von 7  \u00b7  \" + st.min + \" Minuten\", 470, 120, 17, c, 600, 0.35, 0.5));\n      size = fitSize(ctx, st.title, 700, 36, 490);\n      tw = textWidth(ctx, st.title, 700, size);\n      items.push(new Stroke([[460, 170], [470 + tw + 12, 166]], { w: 44, color: mix(c, 0.8), t0: 0.55, dur: 0.45 }));\n      items.push(new TextItem(st.title, 470, 182, size, INK, 700, 0.75, 0.6));\n      for (k = 0; k < 3; k++) {\n        y = 242 + k * 46;\n        items.push(new Stroke([[472, y - 9], [480, y - 1], [495, y - 17]], { w: 5, color: c, t0: 1.35 + k * 0.5, dur: 0.25, wobble: 0.3 }));\n        items.push(new TextItem(st.b[k], 508, y, 21, INK, 400, 1.45 + k * 0.5, 0.5, \"left\", 450));\n      }\n      items.push(new Stroke(spiral(482, 404, 2, 7, 1.6, 20), { w: 12, color: mix(RED, 0.55), t0: 2.95, dur: 0.25, wobble: 0 }));\n      items.push(new Stroke(spiral(510, 404, 2, 7, 1.6, 20), { w: 12, color: mix(YEL, 0.5), t0: 3.05, dur: 0.25, wobble: 0 }));\n      items.push(new Stroke(spiral(538, 404, 2, 7, 1.6, 20), { w: 12, color: GRN, t0: 3.15, dur: 0.25, wobble: 0 }));\n      items.push(new Stroke(arcPts(538, 404, 17, deg(-80), deg(300), 30), { w: 3, color: mix(GRN, -0.3), t0: 3.35, dur: 0.35, wobble: 0.6 }));\n      lines = wrap(ctx, st.g, 400, 16, 380);\n      for (j = 0; j < lines.length; j++) {\n        items.push(new TextItem(lines[j], 568, 400 + j * 22, 16, INK2, 400, 3.4 + j * 0.25, 0.5));\n      }\n      items.push(wipeStroke(4.4));\n      scenes.push({ start: 5 + i * 5, dur: 5, items: items, idx: i });\n    }\n\n    \/* Auswertung *\/\n    items = [];\n    items.push(new TextItem(\"Ihre Auswertung\", 90, 95, 38, INK, 700, 0.1, 0.6));\n    tw = textWidth(ctx, \"Ihre Auswertung\", 700, 38);\n    items.push(new Stroke([[86, 113], [96 + tw, 109]], { w: 9, color: \"#2f6fb5\", t0: 0.5, dur: 0.5 }));\n    var names = [\"HTTPS und Zertifikat\", \"Updates\", \"Zug\u00e4nge\", \"Backups\", \"Konfiguration und Header\", \"Schwachstellen\", \"Notfallplan\"];\n    var res = [GRN, YEL, YEL, RED, YEL, GRN, RED];\n    var words = [\"Gr\u00fcn\", \"Gelb\", \"Gelb\", \"Rot\", \"Gelb\", \"Gr\u00fcn\", \"Rot\"];\n    for (i = 0; i < 7; i++) {\n      y = 160 + i * 44;\n      items.push(new TextItem((i + 1) + \"   \" + names[i], 90, y, 20, INK, 400, 0.7 + i * 0.22, 0.45, \"left\", 330));\n      items.push(new Stroke([[440, y - 7], [492, y - 9]], { w: 24, color: res[i], t0: 0.9 + i * 0.22, dur: 0.3 }));\n      items.push(new TextItem(words[i], 506, y, 17, mix(res[i], -0.35), 700, 1.0 + i * 0.22, 0.4));\n    }\n    items.push(new Stroke(arcPts(468, 152 + 3 * 44, 50, deg(-20), deg(345), 44, 22), { w: 4, color: mix(RED, -0.25), t0: 2.6, dur: 0.5 }));\n    items.push(new Stroke(arcPts(468, 152 + 6 * 44, 50, deg(-20), deg(345), 44, 22), { w: 4, color: mix(RED, -0.25), t0: 2.85, dur: 0.5 }));\n    items.push(new TextItem(\"So gehen Sie vor\", 600, 160, 26, INK, 700, 3.0, 0.5));\n    var plan = [\"Rote Punkte zuerst beheben\", \"Danach die gelben Punkte\", \"Mit dem Backup beginnen\"];\n    var planCol = [RED, YEL, \"#2f6fb5\"];\n    for (k = 0; k < 3; k++) {\n      y = 212 + k * 46;\n      items.push(new Stroke(spiral(614, y - 7, 2, 10, 1.8, 26), { w: 14, color: planCol[k], t0: 3.4 + k * 0.6, dur: 0.3, wobble: 0 }));\n      items.push(new TextItem(String(k + 1), 614, y - 1, 15, \"#ffffff\", 700, 3.6 + k * 0.6, 0.2, \"center\"));\n      items.push(new TextItem(plan[k], 640, y, 21, INK, 400, 3.6 + k * 0.6, 0.5, \"left\", 330));\n    }\n    var la = arcPts(625, 377, 22, deg(-60), deg(230), 28);\n    var le = la[la.length - 1];\n    items.push(new Stroke(la, { w: 6, color: GRN, t0: 5.6, dur: 0.45 }));\n    items.push(new Stroke(head(le, [-Math.sin(deg(230)), Math.cos(deg(230))], 12), { w: 6, color: GRN, t0: 6.0, dur: 0.2, wobble: 0 }));\n    items.push(new TextItem(\"Monatlich wiederholen\", 660, 375, 22, INK, 700, 5.9, 0.5, \"left\", 300));\n    items.push(new TextItem(\"15 Minuten im Kalender eintragen\", 660, 404, 18, INK2, 400, 6.3, 0.5, \"left\", 300));\n    tw = textWidth(ctx, \"Sicherheit ist kein Zustand, sondern eine Gewohnheit.\", 700, 22);\n    items.push(new Stroke([[500 - tw \/ 2 - 16, 465], [500 + tw \/ 2 + 16, 461]], { w: 40, color: \"#f6d36b\", t0: 7.1, dur: 0.6 }));\n    items.push(new TextItem(\"Sicherheit ist kein Zustand, sondern eine Gewohnheit.\", 500, 471, 22, INK, 700, 7.4, 0.8, \"center\", 860));\n    items.push(wipeStroke(9.4));\n    scenes.push({ start: 40, dur: 10, items: items, idx: 7 });\n\n    \/* Zeitleiste unten *\/\n    var tl = [];\n    for (i = 0; i < 7; i++) {\n      tl.push(new Stroke([[tx(CUM[i]) + 3, 518], [tx(CUM[i + 1]) - 3, 517]],\n        { w: 10, color: STATIONS[i].c, t0: 5 + i * 5 + 0.3, dur: 3.6, wobble: 0.6 }));\n    }\n    return { scenes: scenes, timeline: tl };\n  }\n  function tx(m) { return 110 + 780 * m \/ 15; }\n\n  function makeTexture() {\n    var c = document.createElement(\"canvas\");\n    c.width = W; c.height = H;\n    var g = c.getContext(\"2d\"), r = rng(4242), i, x, y, a, l;\n    for (i = 0; i < 7000; i++) {\n      g.fillStyle = r() < 0.5 ? \"rgba(90,70,40,0.05)\" : \"rgba(255,255,255,0.35)\";\n      g.fillRect(r() * W, r() * H, 1 + r() * 1.4, 1 + r() * 1.4);\n    }\n    g.lineWidth = 0.6;\n    for (i = 0; i < 160; i++) {\n      x = r() * W; y = r() * H; a = r() * 6.28; l = 6 + r() * 18;\n      g.strokeStyle = \"rgba(120,100,70,0.06)\";\n      g.beginPath(); g.moveTo(x, y);\n      g.quadraticCurveTo(x + Math.cos(a + 0.6) * l * 0.5, y + Math.sin(a + 0.6) * l * 0.5, x + Math.cos(a) * l, y + Math.sin(a) * l);\n      g.stroke();\n    }\n    var grad = g.createRadialGradient(W \/ 2, H \/ 2, H * 0.35, W \/ 2, H \/ 2, H * 0.95);\n    grad.addColorStop(0, \"rgba(120,95,60,0)\");\n    grad.addColorStop(1, \"rgba(120,95,60,0.10)\");\n    g.fillStyle = grad; g.fillRect(0, 0, W, H);\n    return c;\n  }\n\n  function init(wrap) {\n    if (wrap.getAttribute(\"data-wsc15-init\") === \"1\") return;\n    wrap.setAttribute(\"data-wsc15-init\", \"1\");\n    var canvas = wrap.querySelector(\"canvas\");\n    if (!canvas) return;\n    var ctx = canvas.getContext(\"2d\");\n    if (!ctx) return;\n    var data = build(ctx), tex = makeTexture();\n    var T = 0, last = null, visible = true, paused = false, sx = 1, sy = 1;\n\n    function resize() {\n      var r = canvas.getBoundingClientRect();\n      var dpr = Math.min(window.devicePixelRatio || 1, 2);\n      var cw = Math.max(1, Math.round(r.width * dpr)), ch = Math.max(1, Math.round(r.height * dpr));\n      if (canvas.width !== cw) canvas.width = cw;\n      if (canvas.height !== ch) canvas.height = ch;\n      sx = cw \/ W; sy = ch \/ H;\n    }\n\n    function drawTimeline(t, sc) {\n      var a = prog(t, 4.4, 0.6), i, m, cur;\n      if (a <= 0) return;\n      ctx.save();\n      ctx.globalAlpha = a * 0.35;\n      ctx.strokeStyle = INK2; ctx.lineWidth = 1.2;\n      if (ctx.setLineDash) ctx.setLineDash([4, 5]);\n      ctx.beginPath(); ctx.moveTo(tx(0), 518); ctx.lineTo(tx(15), 518); ctx.stroke();\n      ctx.restore();\n      for (i = 0; i < data.timeline.length; i++) data.timeline[i].draw(ctx, t);\n      cur = sc.idx;\n      ctx.save();\n      ctx.globalAlpha = a;\n      for (i = 0; i <= 7; i++) {\n        ctx.beginPath(); ctx.arc(tx(CUM[i]), 518, 4.5, 0, Math.PI * 2);\n        ctx.fillStyle = t >= 5 + i * 5 ? INK : PAPER; ctx.fill();\n        ctx.lineWidth = 1.5; ctx.strokeStyle = INK2; ctx.stroke();\n      }\n      ctx.textBaseline = \"alphabetic\";\n      for (i = 0; i < 7; i++) {\n        m = (tx(CUM[i]) + tx(CUM[i + 1])) \/ 2;\n        ctx.textAlign = \"center\";\n        if (i === cur) { ctx.font = \"700 14px \" + FONT; ctx.fillStyle = STATIONS[i].c; }\n        else { ctx.font = \"400 13px \" + FONT; ctx.fillStyle = INK2; }\n        ctx.fillText(String(i + 1), m, 545);\n      }\n      ctx.font = \"400 13px \" + FONT; ctx.fillStyle = INK2;\n      ctx.textAlign = \"right\"; ctx.fillText(\"0 Min.\", tx(0) - 12, 523);\n      ctx.textAlign = \"left\"; ctx.fillText(\"15 Min.\", tx(15) + 12, 523);\n      ctx.restore();\n    }\n\n    function drawHeader(t, sc) {\n      var p = prog(t, 5, 0.6), label, col, m;\n      if (p <= 0) return;\n      drawText(ctx, \"15-Minuten-Sicherheitscheck f\u00fcr Websites\", 40, 40, 15, INK2, 600, p, \"left\");\n      if (sc.idx === 7) { label = \"15 Minuten geschafft\"; col = GRN; }\n      else {\n        m = CUM[sc.idx] + (CUM[sc.idx + 1] - CUM[sc.idx]) * ease(prog(t - sc.start, 0.3, 3.6));\n        label = \"Minute \" + Math.round(m) + \" von 15\";\n        col = STATIONS[sc.idx].c;\n      }\n      drawText(ctx, label, 960, 40, 15, col, 700, p, \"right\");\n    }\n\n    function drawPause() {\n      var x = 330, y = 250, w = 340, h = 46, r = 23;\n      ctx.save();\n      ctx.globalAlpha = 0.85; ctx.fillStyle = INK;\n      ctx.beginPath();\n      ctx.moveTo(x + r, y); ctx.lineTo(x + w - r, y);\n      ctx.arc(x + w - r, y + r, r, -Math.PI \/ 2, Math.PI \/ 2);\n      ctx.lineTo(x + r, y + h);\n      ctx.arc(x + r, y + r, r, Math.PI \/ 2, Math.PI * 1.5);\n      ctx.fill();\n      ctx.globalAlpha = 1; ctx.fillStyle = \"#ffffff\";\n      ctx.font = \"600 17px \" + FONT; ctx.textAlign = \"center\"; ctx.textBaseline = \"middle\";\n      ctx.fillText(\"Pausiert: zum Fortsetzen klicken\", x + w \/ 2, y + h \/ 2 + 1);\n      ctx.restore();\n    }\n\n    function render() {\n      var i, sc = data.scenes[0], lt;\n      for (i = 0; i < data.scenes.length; i++) {\n        if (T >= data.scenes[i].start) sc = data.scenes[i];\n      }\n      lt = T - sc.start;\n      ctx.setTransform(sx, 0, 0, sy, 0, 0);\n      ctx.globalAlpha = 1;\n      ctx.fillStyle = PAPER;\n      ctx.fillRect(0, 0, W, H);\n      for (i = 0; i < sc.items.length; i++) sc.items[i].draw(ctx, lt);\n      drawTimeline(T, sc);\n      drawHeader(T, sc);\n      ctx.drawImage(tex, 0, 0, W, H);\n      if (paused) drawPause();\n    }\n\n    function frame(now) {\n      if (last === null) last = now;\n      var dt = Math.min(0.1, (now - last) \/ 1000);\n      last = now;\n      if (visible) {\n        if (!document.hidden) {\n          if (!paused) T = (T + dt) % TOTAL;\n          render();\n        }\n      }\n      window.requestAnimationFrame(frame);\n    }\n\n    function toggle() { paused = !paused; render(); }\n    canvas.addEventListener(\"click\", toggle);\n    canvas.addEventListener(\"keydown\", function (e) {\n      if (e.key === \" \" || e.key === \"Enter\") { e.preventDefault(); toggle(); }\n    });\n\n    resize();\n    if (window.ResizeObserver) { new ResizeObserver(resize).observe(wrap); }\n    else { window.addEventListener(\"resize\", resize); }\n\n    if (window.IntersectionObserver) {\n      visible = false;\n      new IntersectionObserver(function (entries) {\n        visible = entries[0].isIntersecting;\n        last = null;\n      }, { threshold: 0.15 }).observe(wrap);\n    }\n    window.requestAnimationFrame(frame);\n  }\n\n  function start() {\n    var list = document.querySelectorAll(\"[data-wsc15]\"), i;\n    for (i = 0; i < list.length; i++) init(list[i]);\n  }\n  if (document.readyState === \"loading\") { document.addEventListener(\"DOMContentLoaded\", start); }\n  else { start(); }\n})();\n<\/script>\n<!-- \/wp:html -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Das Wichtigste vorab<\/h2>\n<!-- \/wp:heading -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Schritt<\/th><th>Thema<\/th><th>Dauer<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>Verschl\u00fcsselung (HTTPS) und Zertifikat<\/td><td>2 Min.<\/td><\/tr><tr><td>2<\/td><td>Updates f\u00fcr CMS, Plugins und PHP<\/td><td>3 Min.<\/td><\/tr><tr><td>3<\/td><td>Zug\u00e4nge, Passw\u00f6rter und Zwei-Faktor-Anmeldung<\/td><td>2 Min.<\/td><\/tr><tr><td>4<\/td><td>Backups<\/td><td>2 Min.<\/td><\/tr><tr><td>5<\/td><td>Konfiguration und Sicherheits-Header<\/td><td>2 Min.<\/td><\/tr><tr><td>6<\/td><td>Bekannte Schwachstellen und automatisierter Scan<\/td><td>2 Min.<\/td><\/tr><tr><td>7<\/td><td>Notfallplan und Pflichten<\/td><td>2 Min.<\/td><\/tr><\/tbody><\/table><\/figure>\n<!-- \/wp:table -->\n\n<!-- wp:paragraph -->\n<p>Jeder Schritt endet mit einer Ampel: <strong>gr\u00fcn<\/strong> (in Ordnung), <strong>gelb<\/strong> (sollte bald verbessert werden) oder <strong>rot<\/strong> (zeitnah beheben). Die Auswertung am Ende hilft Ihnen, aus den Ergebnissen eine Aufgabenliste zu machen.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:image {\"id\":5556,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/wwwschutz.de\/blog\/wp-content\/uploads\/zeitplan_15_minuten_sieben_stationen-1024x511.png\" alt=\"Zeitplan des 15-Minuten-Sicherheitschecks: sieben Stationen mit Minutenangaben von HTTPS bis Notfallplan\" class=\"wp-image-5556\"\/><figcaption class=\"wp-element-caption\">Website-Check: Sieben Stationen in 15 Minuten<\/figcaption><\/figure>\n<!-- \/wp:image -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Vorbereitung: Das brauchen Sie<\/h2>\n<!-- \/wp:heading -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>einen Browser und Ihre Website-Adresse<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Zugang zum Verwaltungsbereich Ihres Systems (bei WordPress das Dashboard)<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Zugang zum Konto bei Ihrem Hosting-Anbieter, falls vorhanden<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>einen Zettel oder eine Notiz-Datei f\u00fcr die Ergebnisse<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>eine Uhr, damit es bei 15 Minuten bleibt<\/li>\n<!-- \/wp:list-item --><\/ul>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>Wichtig:<\/strong> F\u00fchren Sie diese Pr\u00fcfung nur an Websites durch, f\u00fcr die Sie verantwortlich sind. Das Testen fremder Seiten ohne Erlaubnis ist nicht zul\u00e4ssig.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Schritt 1: Verschl\u00fcsselung und Zertifikat (2 Minuten)<\/h2>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>Warum das wichtig ist:<\/strong> HTTPS sch\u00fctzt Daten auf dem Weg zwischen Besucher und Server, etwa Eingaben in Formularen und Logins. Browser warnen bei unverschl\u00fcsselten Seiten, und Besucher springen dann h\u00e4ufig ab.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>So pr\u00fcfen Sie:<\/strong><\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Rufen Sie Ihre Seite mit <code>http:\/\/<\/code> (ohne \u201es\u201c) auf. Sie sollten automatisch auf <code>https:\/\/<\/code> weitergeleitet werden.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Klicken Sie in der Adresszeile auf das Schloss-Symbol und \u00f6ffnen Sie die Zertifikatsdetails. Notieren Sie das Ablaufdatum.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Achten Sie auf Warnhinweise des Browsers. \u201eGemischte Inhalte\u201c bedeuten, dass einzelne Bilder oder Skripte noch unverschl\u00fcsselt geladen werden.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Optional: Starten Sie den kostenlosen Server-Test von Qualys SSL Labs (ssllabs.com) f\u00fcr Ihre Domain. Er l\u00e4uft einige Minuten im Hintergrund, das Ergebnis sehen Sie sp\u00e4ter.<\/li>\n<!-- \/wp:list-item --><\/ol>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>Gut zu wissen:<\/strong> Zertifikate \u00f6ffentlicher Zertifizierungsstellen werden nach einem Beschluss des CA\/Browser Forums schrittweise k\u00fcrzer g\u00fcltig. Der aktuelle Fahrplan sieht h\u00f6chstens 200 Tage vor, ab M\u00e4rz 2027 nur noch 100 Tage und ab 2029 47 Tage. Wer Zertifikate noch von Hand erneuert, sollte auf automatische Erneuerung umstellen. Viele Hosting-Anbieter bieten das an, h\u00e4ufig \u00fcber Let's Encrypt.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Ampel<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td>Gr\u00fcn<\/td><td>Weiterleitung funktioniert, Zertifikat g\u00fcltig, Erneuerung automatisch<\/td><\/tr><tr><td>Gelb<\/td><td>Zertifikat g\u00fcltig, aber Erneuerung manuell oder Ablauf in weniger als 30 Tagen<\/td><\/tr><tr><td>Rot<\/td><td>Browser-Warnung, abgelaufenes Zertifikat, kein HTTPS oder keine Weiterleitung<\/td><\/tr><\/tbody><\/table><\/figure>\n<!-- \/wp:table -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Schritt 2: Updates (3 Minuten)<\/h2>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>Warum das wichtig ist:<\/strong> Viele Angriffe nutzen bekannte L\u00fccken in veralteter Software, f\u00fcr die l\u00e4ngst Updates existieren. Das betrifft das Content-Management-System selbst, aber auch Plugins, Themes und die PHP-Version auf dem Server.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>So pr\u00fcfen Sie (am Beispiel WordPress):<\/strong><\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>\u00d6ffnen Sie im Dashboard den Bereich <strong>Aktualisierungen<\/strong>. Stehen dort Updates an, notieren Sie diese.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Gehen Sie die Liste der <strong>Plugins<\/strong> durch. Pr\u00fcfen Sie f\u00fcr jedes Plugin, ob es noch gepflegt wird. Im Plugin-Verzeichnis sehen Sie, wann es zuletzt aktualisiert wurde. Plugins, die seit langer Zeit keine Updates mehr bekommen, sind ein Risiko.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>L\u00f6schen Sie <strong>inaktive Plugins und Themes<\/strong>, die Sie nicht brauchen. Auch deaktivierte Erweiterungen k\u00f6nnen Schwachstellen enthalten, solange ihre Dateien auf dem Server liegen.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Pr\u00fcfen Sie die <strong>PHP-Version<\/strong> unter <em>Werkzeuge \u2192 Website-Zustand \u2192 Info \u2192 Server<\/em>. Vergleichen Sie sie mit der \u00dcbersicht der unterst\u00fctzten Versionen auf php.net\/supported-versions.php. Eine Version, die keine Sicherheitsupdates mehr erh\u00e4lt, sollte zeitnah ersetzt werden.<\/li>\n<!-- \/wp:list-item --><\/ol>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph -->\n<p>Bei anderen Systemen wie Joomla, TYPO3, Shopware oder Typo ist das Vorgehen \u00e4hnlich: Version des Systems, der Erweiterungen und der Serversoftware pr\u00fcfen.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>Tipp:<\/strong> Legen Sie vor gr\u00f6\u00dferen Updates ein Backup an. F\u00fcr kleine Sicherheitsupdates lassen sich automatische Aktualisierungen aktivieren.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Ampel<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td>Gr\u00fcn<\/td><td>Alles aktuell, keine \u00fcberfl\u00fcssigen Plugins, PHP wird unterst\u00fctzt<\/td><\/tr><tr><td>Gelb<\/td><td>Einzelne Updates stehen aus oder es gibt inaktive Plugins<\/td><\/tr><tr><td>Rot<\/td><td>Updates seit Wochen offen, ungepflegte Plugins oder nicht mehr unterst\u00fctzte PHP-Version<\/td><\/tr><\/tbody><\/table><\/figure>\n<!-- \/wp:table -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Schritt 3: Zug\u00e4nge und Passw\u00f6rter (2 Minuten)<\/h2>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>Warum das wichtig ist:<\/strong> Gestohlene oder erratene Passw\u00f6rter sind einer der h\u00e4ufigsten Wege in eine Website. Jeder zus\u00e4tzliche, vergessene Zugang vergr\u00f6\u00dfert die Angriffsfl\u00e4che.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>So pr\u00fcfen Sie:<\/strong><\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>\u00d6ffnen Sie die <strong>Benutzerliste<\/strong> Ihres Systems. Kennen Sie jede Person? L\u00f6schen oder sperren Sie Konten ehemaliger Mitarbeiter, Praktikanten und Agenturen.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Pr\u00fcfen Sie die <strong>Rollen<\/strong>. Nicht jeder braucht Administratorrechte. Redakteure kommen mit weniger aus.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Vermeiden Sie den Benutzernamen \u201eadmin\u201c und verwenden Sie f\u00fcr jedes Konto ein <strong>eigenes, langes Passwort<\/strong> aus einem Passwortmanager.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Ist f\u00fcr Administratorkonten die <strong>Zwei-Faktor-Anmeldung<\/strong> oder ein <strong>Passkey<\/strong> aktiviert? Das ist die wirksamste Einzelma\u00dfnahme gegen Konto\u00fcbernahmen.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Denken Sie auch an Zug\u00e4nge au\u00dferhalb des CMS: Hosting-Konto, Datenbank, FTP oder SFTP. Bevorzugen Sie SFTP statt FTP, weil FTP Zugangsdaten unverschl\u00fcsselt \u00fcbertr\u00e4gt.<\/li>\n<!-- \/wp:list-item --><\/ol>\n<!-- \/wp:list -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Ampel<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td>Gr\u00fcn<\/td><td>Nur bekannte Konten, starke Passw\u00f6rter, Zwei-Faktor f\u00fcr Administratoren<\/td><\/tr><tr><td>Gelb<\/td><td>Zwei-Faktor fehlt oder einzelne Konten haben zu viele Rechte<\/td><\/tr><tr><td>Rot<\/td><td>Alte oder unbekannte Konten, Standardbenutzer \u201eadmin\u201c mit schwachem Passwort, gemeinsame Zug\u00e4nge<\/td><\/tr><\/tbody><\/table><\/figure>\n<!-- \/wp:table -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Schritt 4: Backups (2 Minuten)<\/h2>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>Warum das wichtig ist:<\/strong> Wenn alles andere versagt, ist das Backup Ihre Lebensversicherung, ob nach einem Angriff, einem fehlerhaften Update oder einem Serverausfall. Entscheidend ist nicht, dass ein Backup existiert, sondern dass es sich auch wiederherstellen l\u00e4sst.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>Beantworten Sie vier Fragen:<\/strong><\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Gibt es ein Backup von <strong>Dateien und Datenbank<\/strong>?<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Wie <strong>aktuell<\/strong> ist das letzte Backup? Bei Websites mit t\u00e4glichen \u00c4nderungen sollte es h\u00f6chstens einen Tag alt sein.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Liegt eine Kopie <strong>au\u00dferhalb<\/strong> des Servers, auf dem die Website l\u00e4uft? Ein Backup nur auf demselben Server geht mit diesem verloren.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Haben Sie eine <strong>Wiederherstellung schon einmal getestet<\/strong>?<\/li>\n<!-- \/wp:list-item --><\/ol>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>Die 3-2-1-Regel als Richtschnur:<\/strong> drei Kopien, auf zwei verschiedenen Medien, davon eine an einem anderen Ort.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Ampel<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td>Gr\u00fcn<\/td><td>Aktuelles Backup, externe Kopie, Wiederherstellung getestet<\/td><\/tr><tr><td>Gelb<\/td><td>Backup vorhanden, aber nur auf dem Server oder nie getestet<\/td><\/tr><tr><td>Rot<\/td><td>Kein Backup, oder niemand wei\u00df, wo es liegt<\/td><\/tr><\/tbody><\/table><\/figure>\n<!-- \/wp:table -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Schritt 5: Konfiguration und Sicherheits-Header (2 Minuten)<\/h2>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>Warum das wichtig ist:<\/strong> Browser und Server tauschen vor jeder Seite Zusatzinformationen aus, die sogenannten HTTP-Header. Sicherheits-Header sagen dem Browser, wie er Ihre Seite sicher behandeln soll. Sie sind kein Ersatz f\u00fcr Updates, aber ein g\u00fcnstiger zus\u00e4tzlicher Schutz.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>So pr\u00fcfen Sie:<\/strong><\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Geben Sie Ihre Adresse bei einem Header-Test ein, zum Beispiel securityheaders.com oder dem MDN HTTP Observatory von Mozilla. Das Ergebnis erscheint nach wenigen Sekunden.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Achten Sie auf diese Header:<\/li>\n<!-- \/wp:list-item --><\/ol>\n<!-- \/wp:list -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Header<\/th><th>Wof\u00fcr er gut ist<\/th><\/tr><\/thead><tbody><tr><td>Strict-Transport-Security (HSTS)<\/td><td>Erzwingt dauerhaft verschl\u00fcsselte Verbindungen<\/td><\/tr><tr><td>X-Content-Type-Options<\/td><td>Verhindert, dass der Browser Dateitypen \u201eerr\u00e4t\u201c<\/td><\/tr><tr><td>Referrer-Policy<\/td><td>Begrenzt, welche Seitenadresse an andere Anbieter weitergegeben wird<\/td><\/tr><tr><td>Content-Security-Policy<\/td><td>Legt fest, woher Skripte und Inhalte geladen werden d\u00fcrfen, auch gegen Einbettung in fremde Seiten<\/td><\/tr><tr><td>Permissions-Policy<\/td><td>Schr\u00e4nkt Browserfunktionen wie Kamera oder Standort ein<\/td><\/tr><\/tbody><\/table><\/figure>\n<!-- \/wp:table -->\n\n<!-- wp:list {\"ordered\":true,\"start\":3} -->\n<ol start=\"3\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Rufen Sie <strong>nur auf Ihrer eigenen Seite<\/strong> testweise einen Ordner wie <code>\/wp-content\/uploads\/<\/code> auf. Es darf keine Dateiliste erscheinen.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Pr\u00fcfen Sie, dass keine <strong>Sicherungs- oder Testdateien<\/strong> \u00f6ffentlich erreichbar sind, etwa Archive, Datenbank-Dumps oder Konfigurationsdateien. Im Zweifel fragen Sie Ihren Hoster oder Ihre Agentur.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Fehlermeldungen von PHP oder dem System geh\u00f6ren nicht in den sichtbaren Bereich f\u00fcr Besucher.<\/li>\n<!-- \/wp:list-item --><\/ol>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>F\u00fcr Fortgeschrittene:<\/strong> Mit einem Befehl in der Eingabeaufforderung sehen Sie die Header Ihrer eigenen Seite direkt:<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>curl -I https:\/\/www.ihre-domain.de<\/code><\/pre>\n<!-- \/wp:code -->\n\n<!-- wp:paragraph -->\n<p><strong>Vorsicht bei HSTS:<\/strong> Aktivieren Sie diesen Header erst, wenn die gesamte Seite zuverl\u00e4ssig \u00fcber HTTPS l\u00e4uft. Eine Fehlkonfiguration kann Besucher aussperren.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Ampel<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td>Gr\u00fcn<\/td><td>Wichtige Header gesetzt, keine Dateilisten, keine sichtbaren Fehlermeldungen<\/td><\/tr><tr><td>Gelb<\/td><td>Einzelne Header fehlen<\/td><\/tr><tr><td>Rot<\/td><td>Dateilisten, \u00f6ffentlich erreichbare Backups oder Konfigurationsdateien, sichtbare Fehlermeldungen<\/td><\/tr><\/tbody><\/table><\/figure>\n<!-- \/wp:table -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Schritt 6: Bekannte Schwachstellen und automatisierter Scan (2 Minuten)<\/h2>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>Warum das wichtig ist:<\/strong> Sicherheitsl\u00fccken in Software werden \u00f6ffentlich als <strong>CVE<\/strong> (Common Vulnerabilities and Exposures) mit einer eindeutigen Kennung gelistet. Dazu geh\u00f6rt meist eine Bewertung des Schweregrads, der CVSS-Wert. Angreifer durchsuchen das Netz automatisiert nach Seiten, die betroffene Versionen einsetzen. Lesen Sie dazu auch den Beitrag <a href=\"https:\/\/wwwschutz.de\/blog\/angreifer-brauchen-sekunden-ihre-website-braucht-einen-plan\/\">Angreifer brauchen Sekunden \u2013 Ihre Website braucht einen Plan<\/a>.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>So pr\u00fcfen Sie:<\/strong><\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Notieren Sie Namen und Version Ihres Systems sowie Ihrer wichtigsten Plugins und Themes.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Suchen Sie diese in einer Schwachstellendatenbank, etwa in der National Vulnerability Database (nvd.nist.gov) oder in speziellen WordPress-Datenbanken wie denen von Patchstack oder WPScan.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Lassen Sie einen automatisierten Scan laufen, der das f\u00fcr Sie \u00fcbernimmt. Der <a href=\"https:\/\/wwwschutz.de\/security-checks.html\">Website Security Check<\/a> pr\u00fcft zum Beispiel neben bekannten Schwachstellen auch DNS- und Hosting-Einstellungen, JavaScript, CMS und Plugins sowie Kontaktformulare. Das Ergebnis ist ein Bericht, der Befunde nach Dringlichkeit sortiert, sodass Sie wissen, womit Sie anfangen.<\/li>\n<!-- \/wp:list-item --><\/ol>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>Wichtig:<\/strong> Ein automatisierter Scan ist ein schneller erster Blick, ersetzt aber keinen Penetrationstest durch Fachleute. Er findet bekannte Probleme zuverl\u00e4ssig, aber keine individuellen Fehler in selbst entwickelten Funktionen.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Ampel<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td>Gr\u00fcn<\/td><td>Keine bekannten Schwachstellen in eingesetzter Software<\/td><\/tr><tr><td>Gelb<\/td><td>Schwachstellen mit niedrigem oder mittlerem Schweregrad<\/td><\/tr><tr><td>Rot<\/td><td>Hohe oder kritische Schwachstellen, besonders wenn sie bereits aktiv ausgenutzt werden<\/td><\/tr><\/tbody><\/table><\/figure>\n<!-- \/wp:table -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Schritt 7: Notfallplan und Pflichten (2 Minuten)<\/h2>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>Warum das wichtig ist:<\/strong> Wenn eine Website kompromittiert wird, entscheiden die ersten Stunden \u00fcber den Schaden. Wer dann erst nach Zust\u00e4ndigkeiten und Zugangsdaten suchen muss, verliert wertvolle Zeit.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>Legen Sie jetzt einen Notfallzettel an mit:<\/strong><\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>dem Namen und der Telefonnummer der <strong>verantwortlichen Person<\/strong> und einer Vertretung<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>den Kontaktdaten Ihres <strong>Hosting-Anbieters<\/strong> und Ihrer <strong>Agentur<\/strong><\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>dem Ort, an dem <strong>Backups<\/strong> und <strong>Zugangsdaten<\/strong> sicher liegen<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li>einer kurzen Liste der <strong>ersten Schritte<\/strong>: Passw\u00f6rter \u00e4ndern, Seite in den Wartungsmodus setzen, Backup einspielen, Protokolle sichern, Hoster informieren<\/li>\n<!-- \/wp:list-item --><\/ul>\n<!-- \/wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>Datenschutz im Ernstfall:<\/strong> Wurden personenbezogene Daten kompromittiert, m\u00fcssen Sie die Datenschutzverletzung unter bestimmten Voraussetzungen innerhalb von 72 Stunden der Aufsichtsbeh\u00f6rde melden (Art. 33 DSGVO), sofern ein Risiko f\u00fcr die Betroffenen besteht. Ein vorbereiteter Ablauf hilft, diese Frist einzuhalten. Mehr zu Datenschutzthemen finden Sie im Beitrag <a href=\"https:\/\/dr-dsgvo.de\/webseiten-check\/\">Rechtssichere Webseiten mit dem DSGVO-Website-Check<\/a>.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>Auch kurz pr\u00fcfen:<\/strong> Sind Impressum und Datenschutzerkl\u00e4rung von jeder Seite aus erreichbar und aktuell?<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Ampel<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td>Gr\u00fcn<\/td><td>Notfallzettel vorhanden, Zust\u00e4ndigkeiten gekl\u00e4rt<\/td><\/tr><tr><td>Gelb<\/td><td>Teile bekannt, aber nichts schriftlich festgehalten<\/td><\/tr><tr><td>Rot<\/td><td>Niemand wei\u00df, was im Ernstfall zu tun ist<\/td><\/tr><\/tbody><\/table><\/figure>\n<!-- \/wp:table -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Ihre Auswertung: Aus Ampeln wird eine Aufgabenliste<\/h2>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Tragen Sie Ihre Ergebnisse ein und erg\u00e4nzen Sie, wer was bis wann erledigt:<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Schritt<\/th><th>Ergebnis (Gr\u00fcn, Gelb, Rot)<\/th><th>Aufgabe<\/th><th>Zust\u00e4ndig<\/th><th>Bis wann<\/th><\/tr><\/thead><tbody><tr><td>1 HTTPS und Zertifikat<\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>2 Updates<\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>3 Zug\u00e4nge<\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>4 Backups<\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>5 Konfiguration und Header<\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>6 Schwachstellen<\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><tr><td>7 Notfallplan<\/td><td><\/td><td><\/td><td><\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n<!-- \/wp:table -->\n\n<!-- wp:paragraph -->\n<p><em>So kann eine ausgef\u00fcllte Auswertung aussehen: Rote Punkte zuerst, gelbe danach.<\/em><\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">In welcher Reihenfolge Sie vorgehen sollten<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Wenn mehrere Punkte rot oder gelb sind, hilft diese Reihenfolge:<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>Backups:<\/strong> Ohne funktionierende Sicherung kann jedes andere Problem teuer werden.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Updates:<\/strong> Das schlie\u00dft die h\u00e4ufigsten Einfallstore.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Zug\u00e4nge und Zwei-Faktor:<\/strong> Das verhindert Konto\u00fcbernahmen.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>HTTPS und Sicherheits-Header:<\/strong> Das st\u00e4rkt die Grundkonfiguration.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Schwachstellen:<\/strong> Beheben Sie kritische Befunde nach Dringlichkeit.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Notfallplan:<\/strong> Schreiben Sie ihn auf, solange nichts passiert ist.<\/li>\n<!-- \/wp:list-item --><\/ol>\n<!-- \/wp:list -->\n\n<!-- wp:image {\"id\":5553,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https:\/\/wwwschutz.de\/blog\/wp-content\/uploads\/beispiel_ampel_auswertung_sicherheitscheck-1024x778.png\" alt=\"Beispiel einer Ampel-Auswertung mit sieben Zeilen f\u00fcr die Schritte des Sicherheitschecks\" class=\"wp-image-5553\"\/><figcaption class=\"wp-element-caption\">Beispiel einer Website-Auswertung.<\/figcaption><\/figure>\n<!-- \/wp:image -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">So bleiben Sie dran<\/h2>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Ein einmaliger Check ist besser als keiner, aber Sicherheit ist kein Zustand, sondern eine Gewohnheit:<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>Monatlich:<\/strong> Wiederholen Sie die 15 Minuten. Ein fester Kalendereintrag hilft.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Nach \u00c4nderungen:<\/strong> Pr\u00fcfen Sie erneut nach neuen Plugins, einem Relaunch, einem Wechsel des Hosters oder einer neuen Agentur.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Viertelj\u00e4hrlich:<\/strong> Nehmen Sie sich mehr Zeit, testen Sie eine Wiederherstellung und \u00fcberpr\u00fcfen Sie Zug\u00e4nge gr\u00fcndlich.<\/li>\n<!-- \/wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Bei Fristen:<\/strong> Zertifikatslaufzeiten und Support-Enden von PHP-Versionen sind feste Termine, die Sie sich notieren sollten.<\/li>\n<!-- \/wp:list-item --><\/ul>\n<!-- \/wp:list -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Grenzen dieses Checks<\/h2>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Der 15-Minuten-Check erfasst die wichtigsten Grundlagen, mehr nicht. Er ersetzt keinen Penetrationstest, keine Pr\u00fcfung selbst entwickelter Funktionen und keine rechtliche Bewertung. Betreiben Sie einen Online-Shop mit Zahlungsdaten oder verarbeiten Sie besonders sensible Daten, brauchen Sie zus\u00e4tzliche Ma\u00dfnahmen und fachkundige Begleitung.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">H\u00e4ufige Fragen<\/h2>\n<!-- \/wp:heading -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">Brauche ich daf\u00fcr IT-Kenntnisse?<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>F\u00fcr die meisten Schritte gen\u00fcgt Grundwissen im Umgang mit dem Verwaltungsbereich Ihrer Website. Bei Unsicherheit helfen Ihr Hosting-Anbieter oder Ihre Agentur.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">Wie oft sollte ich den Check wiederholen?<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Monatlich, sowie nach gr\u00f6\u00dferen \u00c4nderungen an der Website. Bei Shops und stark genutzten Seiten lohnt eine h\u00e4ufigere automatische Pr\u00fcfung.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">Was mache ich, wenn mehrere Punkte rot sind?<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Bleiben Sie ruhig und arbeiten Sie die Reihenfolge von oben nach unten ab. Beginnen Sie mit dem Backup. Wenn Sie nicht allein weiterkommen, holen Sie sich Unterst\u00fctzung durch Ihren Hoster oder einen Fachbetrieb.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">Reicht es, ein Sicherheits-Plugin zu installieren?<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Ein Plugin kann helfen, ersetzt aber nicht die Grundlagen: aktuelle Software, starke Zug\u00e4nge, Backups und ein Notfallplan. Ein Plugin, das selbst nicht aktuell gehalten wird, kann sogar zum Risiko werden.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">Geh\u00f6rt Barrierefreiheit auch zur Website-Qualit\u00e4t?<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Ja. Wer seine Website regelm\u00e4\u00dfig auf Sicherheit pr\u00fcft, sollte die Zug\u00e4nglichkeit gleich mitdenken. Mehr dazu im Beitrag <a href=\"https:\/\/wwwschutz.de\/blog\/barrierefreiheit-im-web-technische-pflicht-und-gesellschaftliche-verantwortung\/\">Barrierefreiheit im Web<\/a>.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Sicherheit beginnt nicht mit teuren Werkzeugen, sondern mit Aufmerksamkeit f\u00fcr die Grundlagen. In 15 Minuten wissen Sie, ob Ihre Verschl\u00fcsselung stimmt, Ihre Software aktuell ist, Ihre Zug\u00e4nge sauber sind, ein brauchbares Backup existiert und ob Sie im Ernstfall handlungsf\u00e4hig w\u00e4ren. Wer das monatlich wiederholt, beseitigt die meisten typischen Risiken, bevor jemand sie ausnutzt.<\/p>\n<!-- \/wp:paragraph -->","_links":{"self":[{"href":"https:\/\/wwwschutz.de\/blog\/wp-json\/wp\/v2\/posts\/5552","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wwwschutz.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wwwschutz.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wwwschutz.de\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/wwwschutz.de\/blog\/wp-json\/wp\/v2\/comments?post=5552"}],"version-history":[{"count":4,"href":"https:\/\/wwwschutz.de\/blog\/wp-json\/wp\/v2\/posts\/5552\/revisions"}],"predecessor-version":[{"id":5647,"href":"https:\/\/wwwschutz.de\/blog\/wp-json\/wp\/v2\/posts\/5552\/revisions\/5647"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wwwschutz.de\/blog\/wp-json\/wp\/v2\/media\/5555"}],"wp:attachment":[{"href":"https:\/\/wwwschutz.de\/blog\/wp-json\/wp\/v2\/media?parent=5552"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wwwschutz.de\/blog\/wp-json\/wp\/v2\/categories?post=5552"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wwwschutz.de\/blog\/wp-json\/wp\/v2\/tags?post=5552"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}