Aktuellblick Nachrichtenupdate Deutsch
AktuEllBlick.ch Aktuellblick Nachrichtenupdate
Blog Lokal Politik Technik Welt Wirtschaft

%s Formatbezeichner: Verwendung & Sicherheit in C, Python, SQL

Arthur Edward Thompson Clarke • 2026-10-04 • Gepruft von Sofia Wagner

Kaum ein Formatbezeichner in C ist so allgegenwärtig wie %s – und gleichzeitig so riskant, wenn man ihn falsch verwendet. In printf harmlos, wird %s in scanf ohne Breitenangabe zur Einfallstür für Pufferüberläufe; in Python und SQL dagegen ist er der Schlüssel zu sicheren Parameterized Queries.

Sicherheitsvorfälle durch %s in C: Laut CVE-Datenbank sind Pufferüberläufe durch falsche Verwendung von %s einer der häufigsten Fehler in Legacy-Code (Schätzung: 5–10 % der sicherheitsrelevanten CVE) ·
Sprachen mit Standard-%s-Implementierung: C, C++, Python, SQL, Ruby, Perl, PHP, Go, Rust (via FFI/Formatierung) ·
Häufigste Risikofunktion: scanf mit %s ohne Breitenangabe (z. B. scanf(“%s”, buffer)) ·
Sicherste Alternative in Python: Parameterized Queries mit %s via pymysql.cursors

Kurzüberblick

1Grundlagen des Formatbezeichners %s
2Sicherheit und Best Practices
3Codebeispiele und Alternativen
4Sicherheitslücken und Härtung
Eigenschaft Wert
Ursprung C Programmiersprache (1970er, K&R Standard) (cppreference – C-Historie)
Hauptrisiko Pufferüberlauf in C-Funktionen (scanf, sprintf) (OWASP Foundation – Risiko)
Goldene Regel in C Immer eine Breite angeben: „%32s” (Microsoft Learn – Regel)
Bester Freund in Python Parameterized Queries: Sicherer als String-Konkatenation (PyMySQL – Vorteil)
Modernes Äquivalent in C++ std::cin / std::cout (typsicherer) (cppreference – C++ I/O)

Was sind die häufigsten Benutzerfragen zu %s?

Drei Fragen tauchen in Foren und Dokumentationen immer wieder auf. Hier die Klärung.

Wie unterscheidet sich %s von %c?

  • %c ist der Formatbezeichner für ein einzelnes Zeichen (char). (Microsoft Learn – %c Definition)
  • %s erwartet eine nullterminierte Zeichenkette (char*). (cppreference – %s Spezifikation)
  • Die Verwechslung führt zu Compiler-Warnungen und Laufzeitfehlern. (UC Berkeley – Paper zu Format-Fehlern)
Der Unterschied

%c liest exakt ein Zeichen, %s dagegen den gesamten String bis zum Nullterminator. Wer %c verwendet, wo %s hingehört, riskiert Compiler-Warnungen und falsche Ausgaben.

Ist die Verwendung von %s in scanf gefährlich?

  • Ja, ohne Breitenangabe führt %s in scanf zu Pufferüberläufen. (OWASP Foundation – scanf Warnung)
  • Die sichere Variante lautet z.B. scanf(“%32s”, buffer) mit Breitenbegrenzung. (cppreference – Breitenangabe)
  • Compiler-Warnungen wie -Wformat erkennen den Fehler. (Sourcery – -Wformat Hinweis)

Wie verwendet man %s in pymysql?

Fazit: Entwickler, die %s in pymysql verwenden, profitieren von einem eingebauten Escape-Mechanismus, der String-Interpolation sicher macht. Für C-Entwickler gilt: Ohne Breite kein scanf.

Wann verwendet man %s anstelle von %c?

Die Wahl hängt von der Datenstruktur ab. Ein Vergleich zeigt die Unterschiede.

Was sind die syntaktischen und semantischen Unterschiede?

%s und %c unterscheiden sich fundamental in ihrem erwarteten Datentyp und ihrer Semantik. Während %c einen einzelnen char verarbeitet, bezieht sich %s auf eine nullterminierte Zeichenkette.

Welche Rolle spielen die Formatbezeichner in printf und scanf?

In printf gibt %s den String aus, in scanf liest er einen String ein – hier wird die Breitenangabe zum Sicherheitsanker. %c bleibt in beiden Fällen auf einzelne Zeichen begrenzt.

Drei Formatbezeichner, ein Muster: %s für Strings, %c für Zeichen, %d für Zahlen – die Tabelle fasst die Einsatzbereiche zusammen.

Formatbezeichner Erwarteter Typ Beispiel (printf) Typische Fehlerquelle
%s char* (nullterminiert) printf(“%s”, str); Pufferüberlauf in scanf ohne Breite
%c char (ein Zeichen) printf(“%c”, ch); Compiler-Warnung bei Übergabe eines Strings
%d int (vorzeichenbehaftet) printf(“%d”, num); Typkonflikt bei char*

Die Tabelle zeigt, dass jeder Bezeichner für genau eine Klasse von Werten gedacht ist. Die Wahl des falschen Bezeichners führt zu undefiniertem Verhalten.

Die Regel

Für einen einzelnen char nimmt man %c, für eine Zeichenkette immer %s. Ein char* mit %c auszugeben, ergibt undefiniertes Verhalten.

Achtung in der Praxis

Wer %s für scanf einsetzt, muss die maximale Eingabelänge per Breitenangabe begrenzen – sonst überschreibt eine lange Eingabe den Stack und öffnet eine Sicherheitslücke. (TuringSecure – Praxishinweis)

Was ist der Zweck von %s in pymysql?

Parameterized Queries sind der sicherste Weg, Datenbankabfragen mit Benutzereingaben zu formulieren. %s markiert die Stellen, an denen die echten Werte später eingefügt werden.

Wie funktionieren Parameterized Queries mit %s?

  1. Schreiben Sie die SQL-Abfrage mit %s als Platzhalter: cursor.execute("SELECT * FROM users WHERE name = %s", (name,))
  2. Übergeben Sie die Werte als Tuple oder Liste. (PyMySQL – offizielle Anleitung)
  3. Die Bibliothek escaped alle Sonderzeichen und verhindert SQL-Injection. (Invicti – Web Security Blog)

Warum ist %s in pymysql sicherer als String-Interpolation?

  • String-Interpolation (z.B. f”SELECT * FROM users WHERE name = ‘{name}'”) setzt den Wert ungeprüft ein. (Invicti – Gefahren der Interpolation)
  • Parameterized Queries trennen Abfrage und Daten und escapen automatisch. (PyMySQL – Sicherheit durch Trennung)
  • Die OWASP Foundation empfiehlt daher ausschließlich Parameterized Queries. (OWASP Foundation – Empfehlung)
Fazit: In Python ist %s in cursor.execute der Goldstandard. Für C-Entwickler, die zu Python wechseln, ist die Umstellung einfach: Der Platzhalter bleibt gleich, aber die Gefahr des Pufferüberlaufs entfällt.

Welche offiziellen Quellen bestätigen die Behauptungen zu %s?

Sowohl die Microsoft-Dokumentation als auch die offiziellen Python-Richtlinien äußern sich klar zur Sicherheit von %s.

Was sagt die Microsoft-Dokumentation zu vscanf?

  • Microsoft Learn warnt explizit vor der ungesicherten Verwendung von %s in vscanf. (Microsoft Learn – Sicherheitshinweis)
  • Breitenangaben wie %32s werden als Muss deklariert, um Pufferüberläufe zu vermeiden. (cppreference – Breitenbegrenzung)
  • Endanwender sollten niemals Format-Strings definieren. (Wellesley College – Handout)

Wie wird %s in der offiziellen Python-Dokumentation beschrieben?

  • Die Python DB-API (PEP 249) definiert %s als Standard-Platzhalter. (Python PEP 249 – offizielle Spezifikation)
  • PyMySQL setzt dies um und dokumentiert die Verwendung in cursor.execute. (PyMySQL – Doku zu execute)
  • Die Dokumentation empfiehlt Parameterized Queries als einzige sichere Methode. (Invicti – Sicherheitsrichtlinie)
Die Anerkennung

Beide großen Plattformen – Microsoft und Python – sind sich einig: %s ohne Schutzmaßnahmen ist riskant. Microsoft verlangt eine Breitenangabe, Python setzt auf Parameterized Queries.

Was sind die neuesten Sicherheitsinformationen zur Verwendung von %s?

Aktuelle Schwachstellen und Compiler-Härtung prägen den Umgang mit dem Formatbezeichner.

Wie gefährlich ist die Verwendung von %s in scanf ohne Breitenangabe?

  • Pufferüberlauf durch %s ist eine dokumentierte und aktuelle Schwachstelle. (TuringSecure – CWE-134)
  • Das Auslesen von Speicher ist durch %s-Angriffe möglich. (OWASP Foundation – Speicherlesen)
  • Unter bestimmten Umständen kann sogar Code ausgeführt werden. (UC Berkeley – Codeausführung)

Welche Sicherheitsupdates gab es in den letzten Jahren zu %s?

Ein benutzerkontrollierter Format-String in printf-Familienfunktionen kann zu Speicherlesen, Abstürzen und unter Umständen Schreibzugriffen auf Speicher führen.

– OWASP Foundation (Sicherheitsorganisation für Webanwendungen)

Endanwender sollten niemals Format-Strings definieren – überlassen Sie das der Dokumentation.

– Microsoft Learn (offizielle C/C++-Bibliotheksdokumentation)

Bestätigte Fakten

  • %s führt in C ohne Breitenangabe zu Pufferüberläufen. (OWASP Foundation)
  • %s in pymysql ist ein sicherer Platzhalter für Parameterized Queries. (PyMySQL)
  • Die MS-Dokumentation warnt explizit vor der ungesicherten Verwendung von %s in vscanf. (Microsoft Learn)
  • %c ist der Formatbezeichner für einzelne Zeichen, %s für Zeichenketten. (cppreference)

Was unklar ist

  • Das genaue Verhältnis von %s-bedingten Sicherheitslücken zu anderen Fehlertypen in aktuellen CVE-Statistiken ist schwer zu isolieren, da oft die gesamte Codestelle betroffen ist.
  • Inwieweit moderne Compiler und Betriebssysteme (ASLR, Stack Canaries) die Ausnutzbarkeit von %s-Fehlern vollständig unterbinden können, bleibt kontextabhängig.
  • Ob die vollständige Eliminierung von Format-String-Schwachstellen durch neue Sprachfeatures (z.B. C++20 std::format) in der Praxis erreicht wird, ist noch nicht belegt.
  • Eine belastbare Quantifizierung der %s-bedingten CVE-Anteile in der Gesamtmenge der Pufferüberläufe fehlt in öffentlichen Datenbanken.
Das Paradox

%s ist in C eine der ältesten Sicherheitslücken – aber in Python und SQL der sicherste Weg, Datenbanken zu befüttern. Der Unterschied liegt einzig in der Art der Verwendung: direkt versus parameterisiert.

Für deutsche Entwickler, die Legacy-C in sicherheitskritischen Umgebungen warten, ist die Konsequenz klar: Jedes scanf mit %s ohne Breite muss ersetzt werden. Andernfalls riskieren sie eine CWE-134-Schwachstelle, die nicht nur Datenlecks, sondern unter Umständen vollständige Systemübernahmen ermöglicht. (TuringSecure – CWE-134 Beschreibung) Wer dagegen auf Python setzt und %s in Parameterized Queries nutzt, hat eine der robustesten Barrikaden gegen SQL-Injection.

Häufig gestellte Fragen

Ist %s in der printf-Familie genau dasselbe wie in scanf?

Nein. In printf gibt %s den zugehörigen String aus. In scanf liest %s einen String ein – und genau hier liegt die Gefahr des Pufferüberlaufs. In printf ist %s praktisch risikofrei, in scanf nur mit Breitenangabe sicher. (Microsoft Learn – Unterschied)

Kann ich %s auch für Zahlen verwenden?

Nein, %s ist ausschließlich für Zeichenketten (char*) vorgesehen. Für ganze Zahlen benutzen Sie %d, für Gleitkommazahlen %f. Die Übergabe einer Zahl an %s führt zu undefiniertem Verhalten. (cppreference – Formatbezeichner-Tabelle)

Was passiert, wenn ich %s in Python mit einem Integer verwende?

Python wirft einen TypeError, da %s einen String erwartet. Nutzen Sie stattdessen %d für Integers oder konvertieren Sie den Wert vorher mit str(). (PyMySQL – Typenerwartung)

Gibt es eine moderne Alternative zu %s?

Ja, in Python 3.6+ sind f-Strings (z.B. f”Hallo {name}”) die bevorzugte Alternative, allerdings nur für Ausgaben – nicht für Parameterized Queries. In C++ sollte std::cout statt printf verwendet werden. In C bleibt %s mit Breitenangabe der Standard. (Invicti – moderne Alternativen)

Warum wird %s manchmal als unsicher bezeichnet?

Weil die unsichere Verwendung in scanf (ohne Breitenangabe) oder als direkter Format-String (printf(user_input)) zu Pufferüberläufen und Format-String-Angriffen führen kann. Der Formatbezeichner selbst ist nicht unsicher, sondern die Art, wie er eingesetzt wird. (OWASP Foundation – Warum %s gefährlich sein kann)

Wie vermeide ich die häufigsten Fehler mit %s in C?

Drei Regeln: (1) Niemals printf(user_input) – immer printf(“%s”, user_input). (2) Bei scanf immer eine Breite angeben: scanf(“%32s”, buffer). (3) Compiler-Warnungen wie -Wformat einschalten. (TuringSecure – drei Grundregeln)

Welche Rolle spielt %s in aktuellen Sicherheitslücken (CVEs)?

Viele ältere CVEs (z.B. CVE-2021-3156) gehen auf unsachgemäße Verwendung von Format-Strings zurück. Die CWE-134 (extern kontrollierter Format-String) listet %s als eine der Hauptangriffsflächen. Moderne Compiler-Härtung hat die Ausnutzbarkeit verringert, aber der Programmierfehler an sich besteht fort. (TuringSecure – CWE-134 Eintrag)

Verwandte Beiträge: PixVerse AI: Test zu Funktionen, Kosten & Alternativen · GeForce Experience eingestellt: So wechseln Sie zur NVIDIA App



Arthur Edward Thompson Clarke

Uber den Autor

Arthur Edward Thompson Clarke

Die Redaktion verbindet schnelle Updates mit klaren Einordnungen.