Skip to main content

Wie sichern Sie eine REST-API?

Artikel von
blog feature snyk container custom base recommendations

27. Juni 2024

0 Min. Lesezeit
How to Secure a REST API

Als Entwicklerinnen und Entwickler arbeiten wir häufig mit REST-APIs, wenn wir Systeme von Drittanbietern integrieren oder im Arbeitsalltag Frontend- und Backend-Systeme miteinander verbinden. APIs und insbesondere REST-APIs sind ein wesentlicher Bestandteil moderner Webanwendungen. Sie ermöglichen es, Daten über HTTP zu erstellen, abzurufen, zu aktualisieren und zu löschen. Wie jede Technologie bringen sie jedoch auch eigene Sicherheitsherausforderungen mit sich. Sehen wir uns diese Herausforderungen genauer an und erfahren wir, wie Sie REST-API-Anwendungen absichern können.

Was ist eine REST-API?

REST-APIs (Representational State Transfer) sind eine Reihe von Konventionen für den Entwurf vernetzter Anwendungen. Sie nutzen HTTP-Protokolle zum Senden und Empfangen von Daten und lassen sich mit jeder Programmiersprache verwenden, die HTTP-Anfragen senden kann. Dadurch sind sie äußerst vielseitig und in der Webentwicklung weit verbreitet.

Diese Vielseitigkeit macht REST-APIs jedoch auch zu einem Ziel für Cyberbedrohungen. Deshalb sollten Sie bei der Entwicklung sicherer Software stets Prioritäten setzen, zum Beispiel durch die Umsetzung der proaktiven OWASP-Top-10-Maßnahmen. Ohne geeignete Sicherheitsvorkehrungen können REST-APIs vertrauliche Daten offenlegen oder Angreifern sogar einen Einstiegspunkt bieten, um Ihr System zu kompromittieren.

Häufige Sicherheitsbedrohungen für REST-APIs

Entwicklerinnen und Entwickler sollten sich mit mehreren häufigen Sicherheitsbedrohungen für REST-APIs vertraut machen:

  1. Injection-Angriffe: Dabei sendet ein Angreifer schädliche Daten als Teil eines Befehls oder einer Abfrage und bringt den Interpreter dazu, unbeabsichtigte Befehle auszuführen oder auf nicht autorisierte Daten zuzugreifen. Bei einer SQL-Injection kann beispielsweise die Datenbankabfrage Ihrer API manipuliert werden, was zu Datenlecks oder nicht autorisierten Änderungen an Daten führen kann.

  2. Fehlerhafte Authentifizierung: Sind die Authentifizierungsmechanismen Ihrer API nicht korrekt implementiert, können Angreifer andere Benutzer imitieren oder sich sogar Administratorrechte verschaffen. So geschah es beim Reddit-Datendiebstahl 2018, als Hacker die SMS-basierte Zwei-Faktor-Authentifizierung umgehen konnten.

  3. Offenlegung vertraulicher Daten: APIs verarbeiten häufig vertrauliche Daten wie Anmeldedaten oder persönliche Informationen. Werden diese Daten nicht angemessen geschützt, können sie abgefangen oder offengelegt werden – mit schwerwiegenden Verletzungen der Privatsphäre als Folge.

  4. Fehlende Ratenbegrenzung: Ohne Ratenbegrenzung ist Ihre API anfällig für Brute-Force-Angriffe, bei denen ein Angreifer wiederholt Anfragen stellt, um Anmeldedaten zu erraten oder Ihr System zu überlasten. Dies war ein wichtiger Faktor beim Dyn-Angriff 2016, durch den große Websites wie Twitter und Netflix ausfielen. Die Ratenbegrenzung wird häufig als Teil einer Middleware implementiert und gilt als Best Practice für die API-Gateway-Sicherheit.

  5. Unsichere Abhängigkeiten: Verwendet Ihre API Bibliotheken oder Frameworks von Drittanbietern mit bekannten Schwachstellen, können Angreifer diese ausnutzen. Das ist ein häufiges Problem bei Open-Source-Software, wie der Equifax-Datenschutzverletzung 2017 zeigte, bei der eine Schwachstelle in Apache Struts ausgenutzt wurde.

Diese Bedrohungen lassen sich durch Best Practices für die REST-API-Sicherheit eindämmen: Verwenden Sie sichere Programmiertechniken, implementieren Sie robuste Authentifizierungs- und Autorisierungsmechanismen, verschlüsseln Sie vertrauliche Daten und nutzen Sie Tools wie Snyk Code und Snyk Open Source, um Schwachstellen in Ihrem Code und Ihren Abhängigkeiten zu erkennen und zu beheben.

In den folgenden Kapiteln stellen wir diese Best Practices vor und zeigen Ihnen, wie Sie sie umsetzen können, um Ihre REST-API-Anwendungen abzusichern.

1. Robuste Authentifizierungs- und Autorisierungsmechanismen implementieren

Bei der Absicherung einer REST-API bilden robuste Authentifizierungs- und Autorisierungsmechanismen die erste Verteidigungslinie. So stellen Sie sicher, dass nur authentifizierte und autorisierte Benutzer auf die API-Endpunkte zugreifen können.

Sichere Authentifizierung ist das Verfahren, mit dem bestätigt wird, dass ein Benutzer tatsächlich die Person ist, für die er sich ausgibt. Bei der Frage, wie Sie eine REST-API absichern, ist es entscheidend, den Authentifizierungsprozess sicher zu gestalten, um unbefugten Zugriff zu verhindern. So wurden 2019 bei einer Datenschutzverletzung bei Facebook die persönlichen Daten von fast 50 Millionen Benutzern offengelegt. Ursache war ein Problem im Authentifizierungsmechanismus, das die Bedeutung sicherer Authentifizierung unterstreicht.

Snyk Code kann Ihnen dabei helfen, potenzielle Authentifizierungsschwachstellen in Ihrer Codebasis zu erkennen, etwa fest codierte Anmeldedaten oder fehlende Ratenbegrenzungen, die Brute-Force-Angriffe ermöglichen könnten.

OAuth 2.0 und JSON Web Tokens (JWT) verwenden

OAuth 2.0 ist ein Protokoll, mit dem ein Benutzer einer Website oder Anwendung eines Drittanbieters Zugriff auf seine Informationen gewähren kann, ohne seine Anmeldedaten weiterzugeben. Das Protokoll ist aufgrund seiner Skalierbarkeit und Einfachheit weit verbreitet.

Für die Authentifizierung sind JSON Web Tokens (JWT) ein beliebtes Verfahren zum sicheren Austausch von Informationen zwischen Parteien in Form eines JSON-Objekts. Die in einem JWT enthaltenen Informationen können überprüft werden und gelten als vertrauenswürdig, da sie digital signiert sind.

Hier sehen Sie ein Beispiel für die Verwendung von JWT zur Authentifizierung in einer Node.js-REST-API:

const jwt = require("jsonwebtoken");

// User login
app.post("/login", (req, res) => {
  // Authenticate user
  // ...

  // Generate JWT
  const token = jwt.sign({ userID: user.id }, "your-secret-key");

  // Return token
  res.json({ token });
});

// Secure endpoint
app.get("/secure", (req, res) => {
  // Get token from headers
  const token = req.headers["x-access-token"];

  // Verify token
  jwt.verify(token, "your-secret-key", (err, decoded) => {
    if (err) {
      return res.sendStatus(403);
    }

    // Access granted
    // ...
  });
});

Best Practices für die Verwaltung von Zugriffstokens

Zugriffstokens sind die Schlüssel zu Ihrer API und müssen sicher verwaltet werden. Hier sind einige Best Practices:

  • Ablaufzeit des Tokens: Zugriffstokens sollten nur kurze Zeit gültig sein. So begrenzen Sie die Auswirkungen, falls ein Token kompromittiert wird.

  • Speicherung von Tokens: Speichern Sie Zugriffstokens nicht im Local Storage. Wenn die Anwendung für Cross-Site-Scripting-Angriffe (XSS) anfällig ist, können Angreifer leicht darauf zugreifen. Verwenden Sie stattdessen sichere Speichermechanismen wie HTTP-only-Cookies mit aktivierten Sicherheitseigenschaften (SameSite, Secure-Flag und HTTPOnly).

  • Übertragung von Tokens: Übertragen Sie Tokens immer über sichere Kanäle. Verwenden Sie HTTPS statt HTTP, um Man-in-the-Middle-Angriffe zu verhindern.

Snyk Open Source kann Ihnen helfen, Schwachstellen in den Open-Source-Abhängigkeiten zu erkennen, die Sie für die Token-Verwaltung verwenden. So stellen Sie sicher, dass Ihre Zugriffstokens von einer Bibliothek verwaltet werden, für die keine Sicherheitslücken bekannt sind. Weitere Einblicke in die Anwendungssicherheit und Tipps, wie Sie Bedrohungen immer einen Schritt voraus sind, erhalten Sie, wenn Sie ein kostenloses Snyk-Konto erstellen.

2. Daten während der Übertragung und im Ruhezustand schützen

Der Schutz von Daten während der Übertragung und im Ruhezustand ist ein zentraler Bestandteil der Absicherung einer REST-API. In diesem Abschnitt finden Sie Best Practices zum Schutz von Daten in beiden Zuständen.

HTTPS (Hypertext Transfer Protocol Secure) ist eine unverzichtbare Sicherheitsmaßnahme für jede API. Es stellt sicher, dass die zwischen Client und Server übertragenen Daten verschlüsselt sind und nicht von Angreifern abgefangen werden können.

Die meisten Cloud-Anbieter und Hosting-Infrastrukturdienste stellen Ihnen ein kostenloses SSL-Zertifikat zur Verfügung, mit dem Sie HTTPS für Ihre REST-API aktivieren können. Falls Sie jedoch aus Gründen wie der internen Kommunikation zwischen Microservices eine SSL-Terminierung in Ihrem eigenen Anwendungscode durchführen müssen, sehen Sie hier ein Beispiel dafür, wie Sie HTTPS in einer Flask-Anwendung mit der Python-Erweiterung Flask-SSLify erzwingen:

from flask import Flask, request
from flask_sslify import SSLify

app = Flask(__name__)
sslify = SSLify(app)

@app.route('/')
def index():
    return "Hello, World!"

if __name__ == '__main__':
    app.run()

Im obigen Python-Codebeispiel verwenden wir die Erweiterung Flask-SSLify, um HTTPS in einer Flask-Anwendung zu erzwingen. Das ist eine Möglichkeit, Ihre REST-API mit HTTPS abzusichern.

Methoden zur Datenverschlüsselung

Datenverschlüsselung ist ein weiterer wichtiger Bestandteil der Absicherung einer REST-API. Selbst wenn es einem Angreifer gelingt, auf Ihre Daten zuzugreifen, kann er sie ohne den Entschlüsselungsschlüssel nicht lesen.

Eine verbreitete Methode zur Datenverschlüsselung ist AES (Advanced Encryption Standard). AES ist ein symmetrischer Verschlüsselungsalgorithmus, der aufgrund seiner Sicherheit und Effizienz häufig eingesetzt wird.

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

key = get_random_bytes(16)
cipher = AES.new(key, AES.MODE_GCM)
plaintext = b'This is a test.'
ciphertext = cipher.encrypt(plaintext)

print('Ciphertext:', ciphertext)

Im obigen Python-Codebeispiel verwenden wir die Bibliothek PyCryptoDome, um Daten mit AES, einem 128-Bit-Schlüssel und dem GCM-Modus (Galois/Counter Mode) zu verschlüsseln.

HTTP-Header für mehr Sicherheit nutzen

HTTP-Header können die Sicherheit Ihrer REST-API erhöhen. Header wie Content Security Policy (CSP) und X-Content-Type-Options helfen, häufige Web-Schwachstellen zu verhindern.

CSP ist ein Sicherheitsheader, der Cross-Site-Scripting-Angriffe (XSS) verhindern hilft, indem er festlegt, welche Ressourcen eine Webseite laden darf.

X-Content-Type-Options ist ein weiterer Sicherheitsheader. Er verhindert MIME-Type-Sniffing, eine Technik, mit der Angreifer den Browser dazu bringen, schädliche Skripte auszuführen.

@app.after_request
def apply_caching(response):
    response.headers["X-Content-Type-Options"] = "nosniff"
    response.headers["Content-Security-Policy"] = "default-src 'self'"
    return response

Im obigen Python-Codebeispiel setzen wir die Header X-Content-Type-Options und CSP in einer Flask-Anwendung.

Ich empfehle Ihnen dringend, sich damit zu beschäftigen, wie eine Content Security Policy XSS und andere Schwachstellen verhindern kann.

3. Eingabedaten validieren und bereinigen

Zu den wichtigsten Schritten bei der Absicherung einer REST-API gehört die Validierung und Bereinigung von Eingabedaten. Dieser Schritt ist entscheidend, um Angriffe wie SQL-Injection zu verhindern.

SQL-Injection ist eine häufige Sicherheitsbedrohung, bei der Schwachstellen in den Dateneingabefeldern einer Anwendung ausgenutzt werden. Dabei kann ein Angreifer SQL-Abfragen manipulieren, indem er über die Eingabefelder der Anwendung schädlichen SQL-Code einschleust. Das kann zu unbefugtem Zugriff auf Daten oder deren Manipulation führen. Ähnlich funktionieren NoSQL-Injection-Angriffe: Dabei manipuliert ein Angreifer eine NoSQL-Datenbankabfrage, indem er über die Eingabefelder der Anwendung schädlichen Code einschleust.

Das Snyk Security Research-Team hat zuvor Sicherheitsmeldungen veröffentlicht, in denen festgestellt wurde, dass die beliebte Sequelize-ORM-Bibliothek anfällig für SQL-Injection-Angriffe ist. Das unterstreicht, wie wichtig es ist, Eingabedaten zu validieren und zu bereinigen sowie Ihre Open-Source-Bibliotheken auf Schwachstellen zu überwachen. Dabei kann Ihnen Snyk Open Source kostenlos helfen.

Techniken zur Eingabevalidierung implementieren

Um diese Risiken zu mindern, sollten Sie unbedingt Techniken zur Eingabevalidierung implementieren. Dabei wird sichergestellt, dass nur korrekt formatierte Daten in Ihr System gelangen. Wird beispielsweise das Alter eines Benutzers als Zahl erwartet, sollte das System alle Eingaben zurückweisen, die keine Zahl sind.

Hier sehen Sie ein einfaches Beispiel für die Eingabevalidierung in JavaScript:

function validateAge(age) {
  if (isNaN(age)) {
    throw new Error("Invalid input: age must be a number");
  }
}

Noch besser ist es, eine Bibliothek wie Zod oder Joi zu verwenden, um Eingaben robuster und einfacher wartbar zu validieren. Diese Bibliotheken definieren ein erwartetes Schema für Ihre Eingabedaten und validieren die Daten anhand dieses Schemas. Sie sind schneller und zuverlässiger, als eine eigene Validierungslogik zu schreiben. Für TypeScript-Fans ist Zod eine gute Wahl, da die Bibliothek speziell für TypeScript entwickelt wurde.

Zusätzlich zur Eingabevalidierung sollten Sie Ihre Daten bereinigen, um schädliche Auswirkungen potenziell bösartiger Eingaben zu verhindern. Bei der Datenbereinigung werden Daten entfernt oder geändert, damit sie nicht auf schädliche Weise verwendet werden können.

Hier sehen Sie ein einfaches Beispiel für die Datenbereinigung in JavaScript:

function sanitizeString(str) {
  return str.replace(/<[^>]*>?/gm, "");
}

Übertreiben Sie es mit der Bereinigung durch reguläre Ausdrücke jedoch nicht. Sie ist kein Allheilmittel und kann von Angreifern umgangen werden. Verwenden Sie stattdessen Utility-Bibliotheken wie validator.js aus dem npm-Ökosystem. Sie bieten zahlreiche Validierungsmethoden für verschiedene Datentypen. Beim Schreiben eines regulären Ausdrucks übersieht man leicht Sonderfälle und kann dadurch eine Sicherheitslücke namens Regular Expression Denial of Service (ReDoS) einführen. Snyk hat zuvor einen ausführlichen Beitrag zur bekannten ReDoS-Schwachstelle in UAParser.js veröffentlicht.

Jedes Datenelement manuell zu validieren und zu bereinigen, kann mühsam sein. Zum Glück gibt es Tools, die diese Aufgaben automatisieren. Ein Beispiel ist Snyk Code. Snyk Code ist eine Lösung für statische Anwendungssicherheitstests (SAST), mit der Sie Schwachstellen in Ihrem Code erkennen und beheben können, auch solche im Zusammenhang mit der Eingabevalidierung und -bereinigung.

4. Sichere Abhängigkeiten verwenden

Wenn Sie sich mit der Absicherung einer REST-API beschäftigen, sollten Sie unbedingt die Abhängigkeiten berücksichtigen, auf die Ihre Anwendung angewiesen ist. In den vorherigen Abschnitten haben wir mehrere verbreitete Bibliotheken und Frameworks erwähnt, bei denen Sicherheitslücken festgestellt wurden.

In diesem Abschnitt beleuchten wir die möglichen Gefahren durch anfällige Bibliotheken, zeigen Ihnen, wie Sie mit Snyk Open Source solche Schwachstellen erkennen können, und stellen Strategien vor, mit denen Sie Ihre Abhängigkeiten auf dem neuesten Stand halten.

Die Gefahren durch anfällige Bibliotheken

Abhängigkeiten sind wie die Bausteine Ihrer Anwendung. Doch genau wie ein brüchiger Ziegel die Stabilität eines Gebäudes beeinträchtigen kann, kann eine verwundbare Bibliothek ein erhebliches Sicherheitsrisiko für Ihre REST-API darstellen.

So ging der berüchtigte Datenleck bei Equifax im Jahr 2017 auf eine Schwachstelle in Apache Struts zurück, einem Open-Source-Framework für die Entwicklung von Java-Webanwendungen. Dabei wurden die persönlichen Daten von 147 Millionen Menschen offengelegt. Das unterstreicht, wie wichtig sichere Abhängigkeiten sind.

// Example of a vulnerable Apache Struts configuration
<struts>
  <constant name="struts.devMode" value="true" />
</struts>

Im obigen Beispiel ist struts.devMode auf true gesetzt. Dadurch können vertrauliche Informationen offengelegt werden. Daher sollte diese Einstellung in einer Produktionsumgebung vermieden werden.

Der Entwicklungsmodus (devMode) in Apache Struts ist für Entwicklungs- und Debugging-Zwecke vorgesehen. Ist devMode aktiviert, bietet das Framework detailliertere Protokolle, Fehlermeldungen und Funktionen zum Neuladen der Konfiguration. Diese Funktionen sind während der Entwicklung hilfreich, können aber vertrauliche Informationen offenlegen und potenzielle Sicherheitslücken schaffen, wenn sie in einer Produktionsumgebung aktiviert sind.

Die Aktivierung von devMode kann beispielsweise folgende Folgen haben:

  • Detaillierte Fehlermeldungen werden Nutzern angezeigt und können Informationen über die Anwendungsstruktur, die zugrunde liegende Technologie oder sogar bestimmte Codezeilen und Pfade preisgeben, die sich ausnutzen lassen.

  • Konfigurationen werden automatisch neu geladen. Dies kann missbraucht werden, um das Verhalten der Anwendung zu ändern, ohne sie neu starten zu müssen.

  • Durch zusätzliche Protokollierung und Verarbeitung steigt der Ressourcenverbrauch, was Leistung und Stabilität beeinträchtigen kann.

Um diese Risiken zu minimieren, gilt es daher als bewährte Sicherheitspraxis, devMode in Produktionsumgebungen auf false zu setzen.

Verwundbare Abhängigkeiten mit Snyk Open Source erkennen

Um das Risiko durch verwundbare Bibliotheken zu minimieren, benötigen Sie ein robustes System, mit dem Sie diese Schwachstellen erkennen und verwalten können. Hier kommt Snyk Open Source ins Spiel.

Snyk Open Source hilft Ihnen, Schwachstellen in Ihren Open-Source-Abhängigkeiten zu erkennen und zu beheben. Das Tool bietet eine umfassende Datenbank bekannter Schwachstellen und überwacht Ihre Abhängigkeiten kontinuierlich, um Sie auf neue Risiken hinzuweisen.

# Example of using Snyk Open Source to scan your project for vulnerabilities
snyk test

Im obigen Beispiel durchsucht der Befehl snyk test Ihr Projekt nach Schwachstellen und gibt konkrete Empfehlungen zu deren Behebung. Die Scan-Ergebnisse werden in Ihrem Terminal angezeigt (oder im Snyk-Dashboard, wenn Sie die Snyk-Weboberfläche verwenden). Sie enthalten Details zu den Schwachstellen, ihrem Schweregrad und empfohlenen Korrekturen. Hier sehen Sie eine beispielhafte Ausgabe für eine Spring-Java-Anwendung, die eine verwundbare Version von Apache Struts verwendet:

Testing /path/to/your/project...

✗ High severity vulnerability found in org.apache.struts:struts2-core@2.3.20
  Description: Remote Code Execution
  Info: https://snyk.io/vuln/SNYK-JAVA-ORGAPACHESTRUTS-31560
  Introduced through: org.apache.struts:struts2-core@2.3.20
  From: org.apache.struts:struts2-core@2.3.20 > org.apache.struts:struts2-core@2.3.20
  Remediation:
    Upgrade direct dependency org.apache.struts:struts2-core@2.3.20 to org.apache.struts:struts2-core@2.3.24

Tested 123 dependencies for known vulnerabilities, found 1 vulnerabilities, 1 vulnerable paths.

Strategien für aktuelle Abhängigkeiten

Aktuelle Abhängigkeiten sind ein wichtiger Bestandteil der Absicherung Ihrer REST-API. Mit den folgenden Strategien können Sie Ihre Abhängigkeiten effektiv verwalten:

  1. Regelmäßig nach Updates suchen: Gewöhnen Sie sich an, regelmäßig nach Updates für Ihre Abhängigkeiten zu suchen. Das können Sie manuell erledigen oder mit Tools wie Snyk automatisieren.

  2. Eine Versionsstrategie nutzen: Wählen Sie eine Versionsstrategie, die den Bedarf an den neuesten Funktionen mit der Stabilität Ihrer Anwendung in Einklang bringt. Semantische Versionierung ist ein beliebter Ansatz, bei dem Versionsnummern Art und Umfang von Änderungen angeben.

  3. Updates nach Möglichkeit automatisieren: Automatisierte Updates für Abhängigkeiten sparen viel Zeit und senken das Risiko menschlicher Fehler. Sie können Snyk so konfigurieren, dass das Tool automatisch Pull Requests für sichere Upgrades und Patches erstellt.

# Example of using Snyk to automate dependency updates
snyk monitor

Im obigen Beispiel überwacht der Befehl snyk monitor Ihr Projekt kontinuierlich und erstellt automatisch Pull Requests für sichere Upgrades und Patches. Wenn Sie diese bewährten Vorgehensweisen befolgen, werden Ihre Abhängigkeiten nicht zum schwächsten Glied in der Sicherheit Ihrer REST-API. Denken Sie daran: Bei der Frage „Wie sichere ich eine REST-API?“ zählt jedes Detail – und sichere Abhängigkeiten sind ein entscheidender Teil der Lösung.

Denken Sie daran: Zur Absicherung Ihrer REST-API gehört mehr als nur die Validierung und Bereinigung von Eingabedaten. Sie ist ein kontinuierlicher Prozess, der regelmäßige Überwachung und Updates erfordert. Mit diesen bewährten Vorgehensweisen und Tools wie Snyk können Sie die Sicherheit Ihrer REST-API deutlich verbessern.

Möchten Sie mit der Absicherung Ihrer REST-API beginnen? Melden Sie sich noch heute bei Snyk an.

Weiterlesen

Blog

Frontier-Modelle fanden die Schwachstellen. Nur der Angreifer fand die Angriffsketten.

Die statische Analyse fand die Schwachstellen, doch erst Live-Angriffstests bewiesen, wie sie sich zu Angriffen verketten lassen. Ein Vergleich von Evo COS, Claude Security und Claude Code Security.

feature insights context
Blog

Autonome Angriffe sind bereits Realität. Die Verteidigung muss Schritt halten.

Autonome Angreifer verkürzen das Zeitfenster für die Verteidigung. Erfahren Sie, wie kontinuierliches Erkennen, Beheben, Validieren und Verhindern Sicherheitsteams helfen kann, Schritt zu halten.

Blog

Warum KI-Coding-Agenten immer wieder fehlerhafte Zugriffskontrollen schreiben

KI-Coding-Agenten können Autorisierungslogik erzeugen, die kompiliert und die Prüfung besteht, dabei aber die Daten eines Mandanten für einen anderen offenlegt. Erfahren Sie, warum fehlerhafte Zugriffskontrollen schwer zu erkennen sind und wie Sie sie verhindern.