{"id":64732,"date":"2025-06-30T13:51:02","date_gmt":"2025-06-30T11:51:02","guid":{"rendered":"https:\/\/qualityminds.com\/?p=64732"},"modified":"2025-06-30T13:56:37","modified_gmt":"2025-06-30T11:56:37","slug":"angular-security-teil-4-nonces-in-inline-styles","status":"publish","type":"post","link":"https:\/\/qualityminds.com\/de\/angular-security-teil-4-nonces-in-inline-styles\/","title":{"rendered":"Angular Security Teil 4 &#8211; Wenn die Wolke ruft und Styles rebellieren \u2013 Nonce rettet deine Angular-App!"},"content":{"rendered":"\n<section id=\"block-66794739c40b0\"  class=\"hero-section template11\">\n\t<div class=\"bg\">\n\t\t\t<\/div>\n\t<div class=\"container\">\n\t\t<div class=\"hero-section__wrapper flex flex-wrap justify-between\">\n\t\t\t<div class=\"hero-section__description\">\n\t\t\t\t<div class=\"text-element-wrapper\">\n\t\t\t\t\t<div class=\"text-element\">\n\n<h1 class=\"wp-block-heading has-text-align-left\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-theme-secondary-color\">Angular Security Teil 4 &#8211;<\/mark> <\/strong><br><strong>Wenn die Wolke ruft und <\/strong><br><strong>Styles rebellieren \u2013 Nonce <\/strong><br><strong>rettet deine Angular-App!<\/strong><\/h1>\n\n<\/div>\n\t\t\t\t<\/div>\n\n\t\t\t\t\t\t\t<\/div>\n\n\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class=\"hero-section__img\">\n\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"1216\" height=\"832\" src=\"https:\/\/qualityminds.com\/wp-content\/uploads\/2025\/06\/green-padlock-inside-a-red.jpeg\" class=\"attachment-full size-full\" alt=\"\" loading=\"eager\" srcset=\"https:\/\/qualityminds.com\/wp-content\/uploads\/2025\/06\/green-padlock-inside-a-red.jpeg 1216w, https:\/\/qualityminds.com\/wp-content\/uploads\/2025\/06\/green-padlock-inside-a-red-300x205.jpeg 300w, https:\/\/qualityminds.com\/wp-content\/uploads\/2025\/06\/green-padlock-inside-a-red-1024x701.jpeg 1024w, https:\/\/qualityminds.com\/wp-content\/uploads\/2025\/06\/green-padlock-inside-a-red-768x525.jpeg 768w\" sizes=\"(max-width: 1216px) 100vw, 1216px\" \/>\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\n\t\t\t\n\t\t\t\t\t<\/div>\n\t<\/div>\n\n\t<div class=\"social\">\n\t\t<div class=\"container\">\n\t\t\t<div class=\"social-wrapper flex items-center\">\n\t\t\t\tFolge uns\t\t\t\t\t<ul class=\"no-list no-margin social-list\">\n\t\t\t\t\t<li>\n\t\t\t\t<a href=\"https:\/\/www.linkedin.com\/company\/qualityminds-gmbh\/\" target=\"_blank\" aria-label=\"share on social media\" rel=\"noopener\">\n\t\t\t\t\t<img decoding=\"async\" width=\"29\" height=\"29\" src=\"https:\/\/qualityminds.com\/wp-content\/uploads\/2024\/06\/linkedin.svg\" class=\"attachment-full size-full\" alt=\"\" loading=\"lazy\" \/>\t\t\t\t<\/a>\n\t\t\t<\/li>\n\t\t\t\t\t<li>\n\t\t\t\t<a href=\"https:\/\/www.facebook.com\/QualityMindsGmbH\" target=\"_blank\" aria-label=\"share on social media\" rel=\"noopener\">\n\t\t\t\t\t<img decoding=\"async\" width=\"29\" height=\"29\" src=\"https:\/\/qualityminds.com\/wp-content\/uploads\/2024\/06\/facebook.svg\" class=\"attachment-full size-full\" alt=\"\" loading=\"lazy\" \/>\t\t\t\t<\/a>\n\t\t\t<\/li>\n\t\t\t\t\t<li>\n\t\t\t\t<a href=\"https:\/\/www.xing.com\/pages\/qualitymindsgmbh\" target=\"_blank\" aria-label=\"share on social media\" rel=\"noopener\">\n\t\t\t\t\t<img decoding=\"async\" width=\"29\" height=\"29\" src=\"https:\/\/qualityminds.com\/wp-content\/uploads\/2024\/09\/xing_icon.svg\" class=\"attachment-full size-full\" alt=\"\" loading=\"lazy\" \/>\t\t\t\t<\/a>\n\t\t\t<\/li>\n\t\t\t<\/ul>\n\t\t\t<\/div>\n\t\t<\/div>\n\t<\/div>\n<\/section>\n\n\n\t<section id=\"block-667949a958bf7\"  class=\"single-post-section\">\n\t\t<div class=\"container\">\n\t\t\t<div class=\"content\">\n\t\t\t\t<div class=\"single-post-main\">\n\t\t\t\t\t<div class=\"text-element\">\n\n<p>Du bist Entwickler:in: Deine Freude \u00fcber die erfolgreich abgewehrten XSS-Angriffe war gro\u00df. Die <a href=\"https:\/\/qualityminds.com\/de\/angular-security-iframe-sandbox\/\" target=\"_blank\" rel=\"noreferrer noopener\"><code>iframe<\/code>-Sandbox<\/a> und die im <a href=\"https:\/\/qualityminds.com\/de\/angular-security-teil-3-proaktiver-xss-schutz-mit-csp\/\" target=\"_blank\" rel=\"noreferrer noopener\">letzten Beitrag<\/a> vorgestellten <strong>Content Security Policies (CSPs)<\/strong> haben hervorragende Arbeit geleistet. <br>Doch die Digitalisierungsstrategie deines Lieblings-Online-Shops schreitet voran: Um Ladezeiten weiter zu optimieren und die Hosting-Kosten zu senken, wird beschlossen, alle statischen Assets \u2013 darunter auch die kompilierten JavaScript-Bundles und CSS-Dateien deiner Angular-Anwendung \u2013 auf einen externen Cloud-Provider auszulagern.<\/p>\n\n\n\n<p>Das klingt nach einer guten Idee, bis du merkst, dass dies deine bestehende CSP ins Wanken bringt. <strong>Deine bisherige CSP limitiert die Quellen von Inhalten, sodass der<\/strong> <strong>Browser nur Inhalte von vordefinierten Quellen oder Domains ausf\u00fchrt.<\/strong> Standardm\u00e4\u00dfig blockiert eine CSP auch alle <em>Inline-Skripte und -Styles<\/em>. <br><br>Und genau hier liegt der Haken bei Angular-Anwendungen: Hast du dich jemals gefragt, wie die gekapselten Komponenten-Styles eigentlich funktionieren? <strong>Angular injiziert diese Styles zur Laufzeit als <\/strong><code>&lt;style><\/code><strong>-Tags direkt in den <\/strong><code>&lt;head><\/code><strong> deines HTML-Dokuments.<\/strong> Das Laden der Styles wird durch deine bisherigen Konfiguration auf einmal verhindert und die Webseite schaut nicht so aus, wie sie aussehen soll. <strong>Eine &#8222;Quick Fix&#8220;-L\u00f6sung rettent den Tag:<\/strong> <code>style-src: 'unsafe-inline'<\/code> in deiner CSP zu erlauben.<\/p>\n\n\n\n<p>Als Angreifer:in: Dir ist dieser Umzug der Assets nicht verborgen geblieben. Du reibst dir die H\u00e4nde. Du wei\u00dft genau, dass Angular f\u00fcr seine Styles auf Inline-<code>&lt;style><\/code>-Tags angewiesen ist und viele Entwickler daf\u00fcr <code>unsafe-inline<\/code> in der CSP erlauben m\u00fcssen. Das erm\u00f6glicht zwar Angular, seine Styles zu injizieren, aber es erlaubt gleichzeitig <em>jedem<\/em> (also auch einem Angreifer), Inline-Styles zu platzieren. <strong>Die <code>style-src<\/code>-Regel wirkt dann nicht mehr nur f\u00fcr Angular, sondern f\u00fcr alle Quellen.<\/strong> Jetzt, wo die Assets von einem externen Dienst kommen und die URLs noch unberechenbarer werden, ist das die perfekte Schwachstelle. Du wetzt die Klingen, bereit, \u00fcber manipulierte Style-Eigenschaften oder CSS-Expressions Nutzerdaten abzugreifen oder die Darstellung der Seite zu verzerren \u2013 denn das <code>unsafe-inline<\/code> gibt dir die Freiheit dazu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Die Rettung: CSP mit Style-Nonces in Angular 16!<\/strong><\/h3>\n\n\n\n<p>Du bist Entwickler:in: Zum Gl\u00fcck hast du geh\u00f6rt, dass Angular 16 eine lang ersehnte Funktion mitbringt: <strong>Unterst\u00fctzung f\u00fcr Nonces in Inline-Styles!<\/strong> Das ist die L\u00f6sung, auf die du gewartet hast. <strong>Du kannst <code>unsafe-inline<\/code> endlich aus deiner CSP verbannen und trotzdem die Funktionalit\u00e4t deiner Angular-Styles beibehalten.<\/strong><\/p>\n\n\n\n<p>Eine <strong>Nonce<\/strong> (Number used once) ist ein zuf\u00e4lliger Wert, der <strong>bei jeder Anfrage vom Server generiert<\/strong> wird. Dieser Wert wird sowohl im HTTP-Header der CSP (oder im <code>&lt;meta><\/code>-Tag) als auch im jeweiligen <code>&lt;style><\/code>-Tag mitgeliefert. Das Prinzip ist simpel, aber genial: <strong>Nur <\/strong><code><strong>&lt;style><\/strong><\/code><strong>-Tags, deren <\/strong><code><strong>nonce<\/strong><\/code><strong>-Attribut mit dem im CSP-Header gesendeten Wert \u00fcbereinstimmt, d\u00fcrfen vom Browser angewendet werden.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wie funktioniert das f\u00fcr deine Client-Side Angular-App?<\/strong><\/h3>\n\n\n\n<p>Da Angular eine Single-Page-Application (SPA) ist, wird initial eine <code>index.html<\/code>-Datei vom Server ausgeliefert. <strong>Diese <code>index.html<\/code> ist der zentrale Punkt f\u00fcr die Nonce-Implementierung,<\/strong> da dein Webserver hier den Nonce-Wert dynamisch einf\u00fcgen muss.<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>\u00c4nderungen in der <\/strong><code>index.html<\/code><strong> <\/strong>deiner Angular-Anwendung:<br><strong>Du musst zwei Dinge in deiner <code>index.html<\/code> anpassen.<\/strong> Denk daran, dass diese Anpassungen <strong>Platzhalter<\/strong> enthalten, die <strong>sp\u00e4ter von deinem Webserver ersetzt werden<\/strong>:<\/li>\n<\/ol>\n\n\n\n<p><code>&lt;!doctype html> <\/code><br><code>&lt;html lang=\"en\"> <\/code><br><code>&lt;head> <\/code><br><code>&lt;title>Online Shop&lt;\/title> <\/code><br><code>&lt;base href=\"\/\"> <\/code><br><code>&lt;meta charset=\"utf-8\"> <\/code><br><code>&lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"> <\/code><br><code>&lt;meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'self'; style-src 'self' 'nonce-random_nonce_value'; script-src 'self' 'unsafe-eval';\"> <\/code><br><code>&lt;link rel=\"icon\" type=\"image\/x-icon\" href=\"favicon.ico\"> <\/code><br><code>&lt;\/head> <\/code><br><code>&lt;body> <\/code><br><code>&lt;app-root ngCspNonce=\"random_nonce_value\">&lt;\/app-root> <\/code><br><code>&lt;\/body> <\/code><br><code>&lt;\/html><\/code><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CSP-Definition:<\/strong> Die CSP selbst wird hier weiterhin im <code>&lt;meta><\/code>-Tag definiert. Beachte, dass wir <code>style-src<\/code> von <code>'unsafe-inline'<\/code> auf <code>'self' 'nonce-random_nonce_value'<\/code> \u00e4ndern. Der String <code>random_nonce_value<\/code> ist hier ein <strong>Platzhalter<\/strong>.<\/li>\n\n\n\n<li><code>ngCspNonce<\/code><strong> Attribut:<\/strong> Du f\u00fcgst dem Root-Element deiner Angular-Anwendung (<code>&lt;app-root><\/code>) das neue Attribut <code>ngCspNonce<\/code> hinzu und gibst ihm den <strong>gleichen Platzhalterwert<\/strong> wie in der CSP. Angular 16 nutzt dieses Attribut, um zu wissen, welchen Nonce-Wert es in die dynamisch erzeugten <code>&lt;style><\/code>-Tags einf\u00fcgen soll.<\/li>\n<\/ul>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u00c4nderungen in der Nginx-Konfiguration <\/strong>(Dein Webserver):<br><br>Dein Nginx-Webserver muss nun bei jeder Anfrage der <code>index.html<\/code> zwei Dinge tun:<br><br>a. Einen neuen, eindeutigen Nonce-Wert generieren. <br>b. Diesen Nonce-Wert sowohl in den <code>Content-Security-Policy<\/code>-Header als auch an den Stellen, wo der Platzhalter <code>random_nonce_value<\/code> in der <code>index.html<\/code> steht, einf\u00fcgen.<br><br>Daf\u00fcr nutzen wir das <code>sub_filter<\/code>-Modul von Nginx. Dies ist der serverseitige Anteil, der notwendig ist, um die Nonce-Werte dynamisch zu handhaben.<\/li>\n<\/ol>\n\n\n\n<p><code>server { <\/code><br><code>listen 80; <\/code><br><code>server_name your-angular-shop.com; <\/code><br><br><code># Erm\u00f6glicht das Ersetzen von mehreren Vorkommen des Platzhalters sub_filter_once off; <\/code><br><code># Ersetzt 'random_nonce_value' durch den Nginx $request_id (ein eindeutiger Wert pro Anfrage) sub_filter random_nonce_value $request_id; <\/code><br><code># Setzt den CSP-Header und nutzt den $request_id als Nonce-Wert add_header Content-Security-Policy \"default-src 'self'; style-src 'self' 'nonce-$request_id'; script-src 'self' 'unsafe-eval';\"; <\/code><br><br><code>location \/ { <\/code><br><code>root \/path\/to\/your\/angular\/dist; # Pfad zu deinen Angular-Build-Dateien <\/code><br><code>index index.html; <\/code><br><code>try_files $uri $uri\/ \/index.html; <\/code><br><br><code># WICHTIG: Die Filterung muss hier aktiviert werden, <\/code><br><code># damit die Ersetzung in der index.html stattfindet. sub_filter_types text\/html; <\/code><br><br><code>} <\/code><br><code>}<\/code><\/p>\n\n\n\n<p><strong>Was passiert hier?<\/strong><\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><code>sub_filter_once off;<\/code>: Stellt sicher, dass Nginx alle Vorkommen des Platzhalters (hier <code>random_nonce_value<\/code>) in der <code>index.html<\/code> ersetzt und nicht nur das erste.<\/li>\n\n\n\n<li><code>sub_filter random_nonce_value $request_id;<\/code>: Dies ist das Herzst\u00fcck. Nginx ersetzt den Platzhalter <code>random_nonce_value<\/code> durch den internen <code>$request_id<\/code>. Dieser <code>$request_id<\/code> ist ein Wert, der von Nginx <strong>pro Anfrage<\/strong> generiert wird und somit eindeutig ist.<\/li>\n\n\n\n<li><code>add_header Content-Security-Policy \"...\"<\/code>: Nginx f\u00fcgt diesen Header zur HTTP-Antwort hinzu. Beachte, dass auch hier der <code>$request_id<\/code> als Nonce-Wert im <code>style-src<\/code> verwendet wird.<\/li>\n\n\n\n<li><code>sub_filter_types text\/html;<\/code>: Stellt sicher, dass das <code>sub_filter<\/code>-Modul nur auf HTML-Dateien angewendet wird.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Warum rettet uns das den Tag?<\/strong><\/h3>\n\n\n\n<p>Dein Angular 16 Frontend profitiert nun von einer deutlich strengeren CSP:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Kein <\/strong><code>unsafe-inline<\/code><strong> mehr f\u00fcr Styles:<\/strong> Da Angular jetzt den dynamisch generierten Nonce-Wert in seine <code>&lt;style><\/code>-Tags einf\u00fcgt, kannst du <code>unsafe-inline<\/code> aus deiner <code>style-src<\/code>-Direktive entfernen. Das schlie\u00dft eine gro\u00dfe Angriffsfl\u00e4che! Der Umzug der statischen Assets zum Cloud-Provider erfordert keine weitreichenden Ausnahmen in deiner CSP mehr, da die Validierung nun \u00fcber die Nonce erfolgt, anstatt \u00fcber feste Domain-Listen.<\/li>\n\n\n\n<li><strong>Schutz vor Injections:<\/strong> Die Angreifer k\u00f6nnen den zuf\u00e4lligen <code>$request_id<\/code> (dein Nonce-Wert) nicht vorhersagen. Selbst wenn es ihnen gelingt, b\u00f6sartigen CSS-Code oder <code>&lt;style><\/code>-Tags in die Webseite einzuschleusen, wird dieser nicht angewendet, es sei denn, er tr\u00e4gt den korrekten, aktuellen Nonce-Wert. Da der Angreifer diesen Wert nicht kennt und ihn nicht vorhersagen kann, scheitert der Angriff.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wichtige Hinweise und Einschr\u00e4nkungen:<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>$request_id<\/code><strong> ist nicht kryptografisch sicher:<\/strong> W\u00e4hrend <code>$request_id<\/code> eindeutig pro Anfrage ist, ist er <strong>nicht<\/strong> als kryptografisch sicherer Nonce-Wert konzipiert. F\u00fcr sehr hohe Sicherheitsanforderungen k\u00f6nnte ein st\u00e4rkerer, zuf\u00e4lliger Wert, generiert von einem Backend-Dienst, der dann \u00fcber Nginx in die <code>index.html<\/code> injiziert wird, besser sein. F\u00fcr viele Anwendungsf\u00e4lle ist <code>$request_id<\/code> jedoch eine praktische und effektive Verbesserung.<\/li>\n\n\n\n<li><strong>Andere dynamische <\/strong><code>&lt;style><\/code><strong>-Tags:<\/strong> Diese L\u00f6sung deckt die von Angular selbst erzeugten <code>&lt;style><\/code>-Tags ab. Wenn du andere Bibliotheken oder Frameworks verwendest, die ebenfalls dynamisch <code>&lt;style><\/code>-Tags hinzuf\u00fcgen, musst du pr\u00fcfen, ob diese ebenfalls ein <code>nonce<\/code>-Attribut unterst\u00fctzen oder ob du andere Ma\u00dfnahmen ergreifen musst.<\/li>\n\n\n\n<li><strong>Langlebige Sessions:<\/strong> Wenn Nutzer deine Angular-Anwendung \u00fcber sehr lange Zeitr\u00e4ume ge\u00f6ffnet haben (ohne Neuladen der <code>index.html<\/code>), bleibt der einmal gesetzte Nonce-Wert aktiv. Dies ist typischerweise kein gro\u00dfes Problem, da XSS-Angriffe meist darauf abzielen, bei der initialen Ladezeit oder bei Navigation eine Schwachstelle auszunutzen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Stay tuned!<\/strong><\/h3>\n\n\n\n<p><strong>Dein Online-Shop ist wieder ein St\u00fcck sicherer!<\/strong> Die Angreifer haben es nun noch schwerer, b\u00f6sartigen Code einzuschleusen, selbst wenn Assets von externen Cloud-Providern geladen werden. Mit <strong>Angular 16<\/strong> und einer cleveren Nginx-Konfiguration bist du bestens ger\u00fcstet f\u00fcr die Herausforderungen der modernen Web-Sicherheit. Die n\u00e4chste Herausforderung kommt bestimmt!<\/p>\n\n<\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"single-post-aside\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"post-author-wr\">\n\t\t\t\t\t\t\t<div class=\"author-img\">\n\t\t\t\t\t\t\t\t<img alt='' src='https:\/\/secure.gravatar.com\/avatar\/352c34b9ad9057f909b73077ffed49959a9c5a1ab228e936d9c91f430425c46e?s=96&#038;d=mm&#038;r=g' srcset='https:\/\/secure.gravatar.com\/avatar\/352c34b9ad9057f909b73077ffed49959a9c5a1ab228e936d9c91f430425c46e?s=192&#038;d=mm&#038;r=g 2x' class='avatar avatar-96 photo' height='96' width='96' \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"author-info text-element\">\n\t\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t\tGeschrieben von:\t\t\t\t\t\t\t\t\t<\/p>\n\t\t\t\t\t\t\t\t\t<p class=\"author-name\">\n\t\t\t\t\t\t\t\t\t\tVergil Iliev\t\t\t\t\t\t\t\t\t<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"aside-cta\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"icon-wr\">\n\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"76\" height=\"76\" src=\"https:\/\/qualityminds.com\/wp-content\/uploads\/2024\/05\/Capa_1.svg\" class=\"attachment-full size-full\" alt=\"send icon\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"text-element\">\n\t\t\t\t\t\t\t\t\t<p>Schreib uns eine Mail \u2013 wir freuen uns auf deine Nachricht! <a class=\"cc-1rn59kg\" title=\"mailto:podcast@qualityminds.de\" href=\"mailto:hello@qualityminds.de\" data-testid=\"link-with-safety\" data-renderer-mark=\"true\">hello@qualityminds.de <\/a>oder auf <a class=\"cc-1rn59kg\" title=\"https:\/\/www.linkedin.com\/company\/qualityminds-gmbh\/posts\/?feedView=all\" href=\"https:\/\/www.linkedin.com\/company\/qualityminds-gmbh\/posts\/?feedView=all\" data-testid=\"link-with-safety\" data-renderer-mark=\"true\" target=\"_blank\" rel=\"noopener\">LinkedIn<\/a><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"similar-posts\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"heading\">\n\t\t\t\t\t\t\t\t\tWeiterf\u00fchrende Links\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ul class=\"no-list no-margin\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/qualityminds.com\/de\/iwc-s4f5-vom-seminar-zur-lernenden-organisation-wie-man-lernen-in-den-arbeitsalltag-integriert\/\">IWC (S4F5) Vom Seminar zur lernenden Organisation: Wie man Lernen in den Arbeitsalltag integriert\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/qualityminds.com\/de\/forschungszulage-explainable-ai\/\">Forschungszulage &#8222;Explainable AI&#8220;\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/qualityminds.com\/de\/learning-guides-wenn-agile-lehre-teil-eines-lernoekosystems-wird\/\">Learning Guides \u2013 Wenn agile Lehre Teil eines Lern\u00f6kosystems wird\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t<\/div>\n\n\t\t\t\t\t\t\t<div class=\"social-sharing\">\n\t\t\t\t\t<p class=\"no-margin\"> teilen\t\t\t\t\t<\/p>\n\t\t\t\t\t\n<ul class=\"no-list no-margin\">\n\t<li>\n\t\t<a href=\"https:\/\/www.linkedin.com\/feed\/?shareActive=true&#038;text=https:\/\/qualityminds.com\/de\/learning-guides-wenn-agile-lehre-teil-eines-lernoekosystems-wird\/\" class=\"linkedin\" target=\"_blank\" aria-label=\"auf LinkedIn teilen\"><\/a>\n\t<\/li>\n\t<li>\n\t\t<a href=\"https:\/\/www.facebook.com\/sharer\/sharer.php?u=https:\/\/qualityminds.com\/de\/learning-guides-wenn-agile-lehre-teil-eines-lernoekosystems-wird\/\" class=\"facebook\" target=\"_blank\" aria-label=\"auf Facebook teilen\"><\/a>\n\t<\/li>\n\t<li>\n\t\t<a href=\"https:\/\/www.xing.com\/spi\/shares\/new?url=https:\/\/qualityminds.com\/de\/learning-guides-wenn-agile-lehre-teil-eines-lernoekosystems-wird\/\" class=\"xing\" target=\"_blank\" aria-label=\"auf Xing teilen\"><\/a>\n\t<\/li>\n<\/ul>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t<\/section>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":65,"featured_media":64761,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[1,483],"tags":[504,503],"class_list":["post-64732","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-de","category-software-dev-de","tag-blog","tag-software-engineering"],"acf":[],"jetpack_featured_media_url":"https:\/\/qualityminds.com\/wp-content\/uploads\/2025\/06\/green-padlock-inside-a-red.jpeg","_links":{"self":[{"href":"https:\/\/qualityminds.com\/de\/wp-json\/wp\/v2\/posts\/64732","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/qualityminds.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/qualityminds.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/qualityminds.com\/de\/wp-json\/wp\/v2\/users\/65"}],"replies":[{"embeddable":true,"href":"https:\/\/qualityminds.com\/de\/wp-json\/wp\/v2\/comments?post=64732"}],"version-history":[{"count":26,"href":"https:\/\/qualityminds.com\/de\/wp-json\/wp\/v2\/posts\/64732\/revisions"}],"predecessor-version":[{"id":64772,"href":"https:\/\/qualityminds.com\/de\/wp-json\/wp\/v2\/posts\/64732\/revisions\/64772"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/qualityminds.com\/de\/wp-json\/wp\/v2\/media\/64761"}],"wp:attachment":[{"href":"https:\/\/qualityminds.com\/de\/wp-json\/wp\/v2\/media?parent=64732"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/qualityminds.com\/de\/wp-json\/wp\/v2\/categories?post=64732"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/qualityminds.com\/de\/wp-json\/wp\/v2\/tags?post=64732"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}