Nette Documentation Preview

syntax
Warum Templates verwenden?
**************************


Warum sollte ich in PHP ein Templating-System verwenden?
--------------------------------------------------------

Warum ein Templating-System in PHP verwenden, wenn PHP selbst eine Templating-Sprache ist?

Fassen wir zunächst kurz die Geschichte dieser Sprache zusammen, die voller interessanter Wendungen steckt. Eine der ersten Programmiersprachen, die zum Erzeugen von HTML-Seiten verwendet wurde, war C. Bald zeigte sich jedoch, dass ihr Einsatz für diesen Zweck unpraktisch war. Rasmus Lerdorf schuf daher PHP, das die Erzeugung von dynamischem HTML mit C im Backend erleichterte. PHP war ursprünglich als Templating-Sprache konzipiert, erhielt mit der Zeit aber weitere Fähigkeiten und wurde zu einer vollwertigen Programmiersprache.

Dennoch funktioniert es weiterhin auch als Templating-Sprache. Eine PHP-Datei kann eine HTML-Seite enthalten, in der Variablen mit `<?= $foo ?>` usw. ausgegeben werden.

Früh in der Geschichte von PHP entstand das Templating-System Smarty, dessen Zweck es war, die Präsentation (HTML/CSS) strikt von der Anwendungslogik zu trennen. Es bot absichtlich eine eingeschränktere Sprache als PHP selbst, damit ein Entwickler zum Beispiel aus einem Template heraus keine Datenbankabfrage ausführen konnte. Andererseits bedeutete es eine zusätzliche Abhängigkeit in Projekten, erhöhte deren Komplexität und verlangte von den Programmierern, die neue Sprache Smarty zu lernen. Ein solcher Nutzen war fragwürdig, und für Templates wurde weiterhin reines PHP verwendet.

Mit der Zeit begannen Templating-Systeme, nützlich zu werden. Sie führten Konzepte wie [Vererbung|template-inheritance], den [Sandbox-Modus|sandbox] und eine Reihe weiterer Funktionen ein, die das Erstellen von Templates gegenüber reinem PHP erheblich vereinfachten. Das Thema Sicherheit, die Existenz von [Sicherheitslücken wie XSS|safety-first] und die Notwendigkeit des [Escapings |#Was ist Escaping?] rückten in den Vordergrund. Templating-Systeme führten automatisches Escaping ein, um das Risiko auszuschließen, dass ein Programmierer es vergisst und eine schwere Sicherheitslücke schafft (wir werden gleich sehen, dass das gewisse Tücken hat).

Heute überwiegt der Nutzen von Templating-Systemen die Kosten ihrer Einführung deutlich. Es ergibt daher Sinn, sie zu verwenden.


Warum ist Latte besser als Twig oder Blade?
-------------------------------------------

Dafür gibt es mehrere Gründe - manche sind angenehm, andere grundlegend nützlich. Latte ist eine Verbindung aus Annehmlichkeit und Nutzen.

*Zuerst das Angenehme:* Latte hat dieselbe [Syntax wie PHP |syntax#Latte versteht PHP]. Der einzige Unterschied liegt in der Schreibweise der Tags, wo statt `<?=` und `?>` die kürzeren `{` und `}` bevorzugt werden. Das bedeutet, dass Sie keine neue Sprache lernen müssen. Die Schulungskosten sind minimal. Vor allem müssen Sie während der Entwicklung nicht ständig zwischen der Sprache PHP und der Template-Sprache "umschalten", denn beide sind dieselbe. Anders ist es bei Twig-Templates, die eine Python-ähnliche Syntax verwenden und den Programmierer zwingen, zwischen zwei verschiedenen Sprachen zu wechseln.

*Nun der ungemein nützliche Grund:* Alle Templating-Systeme wie Twig, Blade oder Smarty haben sich dahin entwickelt, Schutz vor XSS in Form von automatischem [Escaping |#Was ist Escaping?] zu bieten. Genauer gesagt: den automatischen Aufruf der Funktion `htmlspecialchars()`. Die Schöpfer von Latte erkannten jedoch, dass das überhaupt nicht die richtige Lösung ist. Denn verschiedene Teile des Dokuments erfordern verschiedene Arten des Escapings. Naives automatisches Escaping ist eine gefährliche Funktion, weil es ein trügerisches Gefühl von Sicherheit erzeugt.

Damit automatisches Escaping funktionsfähig und verlässlich ist, muss es erkennen, an welcher Stelle des Dokuments die Daten ausgegeben werden (wir nennen diese Stellen Kontexte), und die Escaping-Funktion entsprechend wählen. Es muss also [kontextsensitiv |safety-first#Kontextsensitives Escaping] sein. Und genau das kann Latte. Es versteht HTML. Es nimmt das Template nicht bloß als String wahr, sondern versteht, was Tags, Attribute usw. sind. Deshalb escapt es im HTML-Text anders als innerhalb von HTML-Tags, innerhalb von JavaScript usw.

Latte ist das erste und einzige Templating-System für PHP mit kontextsensitivem Escaping. Es stellt das einzige wirklich sichere Templating-System dar.

*Und noch ein angenehmer Grund:* Weil Latte HTML versteht, bietet es weitere sehr angenehme Funktionen. Zum Beispiel [n:Attribute |syntax#n:Attribute]. Oder die Möglichkeit, [Links zu prüfen |safety-first#Prüfung von Links]. Und viele weitere.


Was ist Escaping?
-----------------

Escaping ist der Vorgang, beim Einfügen eines Strings in einen anderen Zeichen mit besonderer Bedeutung durch entsprechende Sequenzen zu ersetzen, um unerwünschte Wirkungen oder Fehler zu verhindern. Fügen wir zum Beispiel einen String in HTML-Text ein, wo das Zeichen `<` eine besondere Bedeutung hat (es kennzeichnet den Beginn eines Tags), ersetzen wir es durch die entsprechende Sequenz, die HTML-Entity `&lt;`. Dadurch kann der Browser das Symbol `<` korrekt anzeigen.

Ein einfaches Beispiel für Escaping direkt beim Schreiben von PHP-Code ist das Einfügen eines Anführungszeichens in einen String, indem man ihm einen Backslash voranstellt.

Ausführlicher behandeln wir Escaping im Kapitel [Wie man sich gegen XSS wehrt |safety-first#Wie wehrt man sich gegen XSS?].


Kann aus einem Latte-Template eine Datenbankabfrage ausgeführt werden?
----------------------------------------------------------------------

In Templates können Sie mit Objekten arbeiten, die der Programmierer ihnen übergibt. Wenn der Programmierer möchte, kann er dem Template ein Datenbankobjekt übergeben und darauf eine Abfrage ausführen. Ist das seine Absicht, gibt es keinen Grund, es zu verhindern.

Anders liegt der Fall, wenn Sie Kunden oder externen Codern die Möglichkeit geben wollen, Templates zu bearbeiten. Dann wollen Sie ganz sicher nicht, dass sie Zugriff auf die Datenbank haben. Natürlich übergeben Sie dem Template das Datenbankobjekt nicht - aber was, wenn es über ein anderes Objekt erreichbar ist? Die Lösung ist der [Sandbox-Modus|sandbox], mit dem Sie festlegen können, welche Methoden in Templates aufgerufen werden dürfen. Dadurch müssen Sie sich um Sicherheitslücken keine Sorgen machen.


Was sind die wichtigsten Unterschiede zwischen Templating-Systemen wie Latte, Twig und Blade?
---------------------------------------------------------------------------------------------

Die Unterschiede zwischen Templating-Systemen wie Latte, Twig und Blade liegen vor allem in ihrer Syntax, ihrer Sicherheit und ihrer Integration in Frameworks:

- **Latte**: Verwendet PHP-Syntax, was das Erlernen und Verwenden leicht macht. Bietet erstklassigen Schutz vor XSS-Angriffen durch kontextsensitives Escaping. Gut in das Nette Framework integriert, aber eigenständig verwendbar.
- **Twig**: Verwendet eine Python-ähnliche Syntax, die sich deutlich von PHP unterscheidet. Escapt ohne Unterscheidung des Kontexts (einfaches `htmlspecialchars`). Gut in das Framework Symfony integriert.
- **Blade**: Verwendet eine Mischung aus PHP und eigener Syntax. Escapt ohne Unterscheidung des Kontexts (einfaches `htmlspecialchars`). Eng mit den Funktionen und dem Ökosystem von Laravel verzahnt.


Lohnt sich der Einsatz eines Templating-Systems für Unternehmen?
----------------------------------------------------------------

Zunächst unterscheiden sich die Kosten für Schulung und Verwendung sowie der Gesamtnutzen je nach System erheblich. Das Templating-System Latte erleichtert dank seiner PHP-Syntax das Erlernen für Programmierer, die diese Sprache bereits kennen, ganz erheblich. Meist braucht ein Programmierer nur wenige Stunden, um sich hinreichend mit Latte vertraut zu machen, was die Schulungskosten senkt und die Einführung der Technologie und vor allem die Effizienz im täglichen Einsatz beschleunigt.

Darüber hinaus bietet Latte dank seiner einzigartigen Technik des kontextsensitiven Escapings ein hohes Maß an Schutz vor XSS-Sicherheitslücken. Dieser Schutz ist entscheidend für die Sicherheit von Webanwendungen und minimiert das Risiko von Angriffen, die Benutzer oder Unternehmensdaten gefährden könnten. Die Sicherheit von Webanwendungen ist auch für den Ruf eines Unternehmens wichtig. Sicherheitsprobleme können zum Verlust des Kundenvertrauens führen und dem Image des Unternehmens am Markt schaden.

Der Einsatz von Latte senkt außerdem die Gesamtkosten für Entwicklung und Wartung, weil er beides erleichtert. Der Einsatz eines Templating-Systems lohnt sich also auf jeden Fall.


Beeinflusst Latte die Leistung von Webanwendungen?
--------------------------------------------------

Obwohl Latte-Templates schnell verarbeitet werden, spielt dieser Aspekt in der Produktion kaum eine Rolle. Der Grund ist, dass Template-Dateien nur einmal beim ersten Anzeigen geparst werden. Anschließend werden sie in nativen PHP-Code kompiliert, auf der Festplatte abgelegt und bei jedem weiteren Request ausgeführt, ohne dass sie erneut kompiliert werden müssen.

So funktioniert es in der Produktionsumgebung. Während der Entwicklung werden Latte-Templates bei jeder Änderung ihres Inhalts neu kompiliert, damit der Entwickler stets die aktuelle Version sieht.

Warum Templates verwenden?

Warum sollte ich in PHP ein Templating-System verwenden?

Warum ein Templating-System in PHP verwenden, wenn PHP selbst eine Templating-Sprache ist?

Fassen wir zunächst kurz die Geschichte dieser Sprache zusammen, die voller interessanter Wendungen steckt. Eine der ersten Programmiersprachen, die zum Erzeugen von HTML-Seiten verwendet wurde, war C. Bald zeigte sich jedoch, dass ihr Einsatz für diesen Zweck unpraktisch war. Rasmus Lerdorf schuf daher PHP, das die Erzeugung von dynamischem HTML mit C im Backend erleichterte. PHP war ursprünglich als Templating-Sprache konzipiert, erhielt mit der Zeit aber weitere Fähigkeiten und wurde zu einer vollwertigen Programmiersprache.

Dennoch funktioniert es weiterhin auch als Templating-Sprache. Eine PHP-Datei kann eine HTML-Seite enthalten, in der Variablen mit <?= $foo ?> usw. ausgegeben werden.

Früh in der Geschichte von PHP entstand das Templating-System Smarty, dessen Zweck es war, die Präsentation (HTML/CSS) strikt von der Anwendungslogik zu trennen. Es bot absichtlich eine eingeschränktere Sprache als PHP selbst, damit ein Entwickler zum Beispiel aus einem Template heraus keine Datenbankabfrage ausführen konnte. Andererseits bedeutete es eine zusätzliche Abhängigkeit in Projekten, erhöhte deren Komplexität und verlangte von den Programmierern, die neue Sprache Smarty zu lernen. Ein solcher Nutzen war fragwürdig, und für Templates wurde weiterhin reines PHP verwendet.

Mit der Zeit begannen Templating-Systeme, nützlich zu werden. Sie führten Konzepte wie Vererbung, den Sandbox-Modus und eine Reihe weiterer Funktionen ein, die das Erstellen von Templates gegenüber reinem PHP erheblich vereinfachten. Das Thema Sicherheit, die Existenz von Sicherheitslücken wie XSS und die Notwendigkeit des Escapings rückten in den Vordergrund. Templating-Systeme führten automatisches Escaping ein, um das Risiko auszuschließen, dass ein Programmierer es vergisst und eine schwere Sicherheitslücke schafft (wir werden gleich sehen, dass das gewisse Tücken hat).

Heute überwiegt der Nutzen von Templating-Systemen die Kosten ihrer Einführung deutlich. Es ergibt daher Sinn, sie zu verwenden.

Warum ist Latte besser als Twig oder Blade?

Dafür gibt es mehrere Gründe – manche sind angenehm, andere grundlegend nützlich. Latte ist eine Verbindung aus Annehmlichkeit und Nutzen.

Zuerst das Angenehme: Latte hat dieselbe Syntax wie PHP. Der einzige Unterschied liegt in der Schreibweise der Tags, wo statt <?= und ?> die kürzeren { und } bevorzugt werden. Das bedeutet, dass Sie keine neue Sprache lernen müssen. Die Schulungskosten sind minimal. Vor allem müssen Sie während der Entwicklung nicht ständig zwischen der Sprache PHP und der Template-Sprache „umschalten“, denn beide sind dieselbe. Anders ist es bei Twig-Templates, die eine Python-ähnliche Syntax verwenden und den Programmierer zwingen, zwischen zwei verschiedenen Sprachen zu wechseln.

Nun der ungemein nützliche Grund: Alle Templating-Systeme wie Twig, Blade oder Smarty haben sich dahin entwickelt, Schutz vor XSS in Form von automatischem Escaping zu bieten. Genauer gesagt: den automatischen Aufruf der Funktion htmlspecialchars(). Die Schöpfer von Latte erkannten jedoch, dass das überhaupt nicht die richtige Lösung ist. Denn verschiedene Teile des Dokuments erfordern verschiedene Arten des Escapings. Naives automatisches Escaping ist eine gefährliche Funktion, weil es ein trügerisches Gefühl von Sicherheit erzeugt.

Damit automatisches Escaping funktionsfähig und verlässlich ist, muss es erkennen, an welcher Stelle des Dokuments die Daten ausgegeben werden (wir nennen diese Stellen Kontexte), und die Escaping-Funktion entsprechend wählen. Es muss also kontextsensitiv sein. Und genau das kann Latte. Es versteht HTML. Es nimmt das Template nicht bloß als String wahr, sondern versteht, was Tags, Attribute usw. sind. Deshalb escapt es im HTML-Text anders als innerhalb von HTML-Tags, innerhalb von JavaScript usw.

Latte ist das erste und einzige Templating-System für PHP mit kontextsensitivem Escaping. Es stellt das einzige wirklich sichere Templating-System dar.

Und noch ein angenehmer Grund: Weil Latte HTML versteht, bietet es weitere sehr angenehme Funktionen. Zum Beispiel n:Attribute. Oder die Möglichkeit, Links zu prüfen. Und viele weitere.

Was ist Escaping?

Escaping ist der Vorgang, beim Einfügen eines Strings in einen anderen Zeichen mit besonderer Bedeutung durch entsprechende Sequenzen zu ersetzen, um unerwünschte Wirkungen oder Fehler zu verhindern. Fügen wir zum Beispiel einen String in HTML-Text ein, wo das Zeichen < eine besondere Bedeutung hat (es kennzeichnet den Beginn eines Tags), ersetzen wir es durch die entsprechende Sequenz, die HTML-Entity &lt;. Dadurch kann der Browser das Symbol < korrekt anzeigen.

Ein einfaches Beispiel für Escaping direkt beim Schreiben von PHP-Code ist das Einfügen eines Anführungszeichens in einen String, indem man ihm einen Backslash voranstellt.

Ausführlicher behandeln wir Escaping im Kapitel Wie man sich gegen XSS wehrt.

Kann aus einem Latte-Template eine Datenbankabfrage ausgeführt werden?

In Templates können Sie mit Objekten arbeiten, die der Programmierer ihnen übergibt. Wenn der Programmierer möchte, kann er dem Template ein Datenbankobjekt übergeben und darauf eine Abfrage ausführen. Ist das seine Absicht, gibt es keinen Grund, es zu verhindern.

Anders liegt der Fall, wenn Sie Kunden oder externen Codern die Möglichkeit geben wollen, Templates zu bearbeiten. Dann wollen Sie ganz sicher nicht, dass sie Zugriff auf die Datenbank haben. Natürlich übergeben Sie dem Template das Datenbankobjekt nicht – aber was, wenn es über ein anderes Objekt erreichbar ist? Die Lösung ist der Sandbox-Modus, mit dem Sie festlegen können, welche Methoden in Templates aufgerufen werden dürfen. Dadurch müssen Sie sich um Sicherheitslücken keine Sorgen machen.

Was sind die wichtigsten Unterschiede zwischen Templating-Systemen wie Latte, Twig und Blade?

Die Unterschiede zwischen Templating-Systemen wie Latte, Twig und Blade liegen vor allem in ihrer Syntax, ihrer Sicherheit und ihrer Integration in Frameworks:

  • Latte: Verwendet PHP-Syntax, was das Erlernen und Verwenden leicht macht. Bietet erstklassigen Schutz vor XSS-Angriffen durch kontextsensitives Escaping. Gut in das Nette Framework integriert, aber eigenständig verwendbar.
  • Twig: Verwendet eine Python-ähnliche Syntax, die sich deutlich von PHP unterscheidet. Escapt ohne Unterscheidung des Kontexts (einfaches htmlspecialchars). Gut in das Framework Symfony integriert.
  • Blade: Verwendet eine Mischung aus PHP und eigener Syntax. Escapt ohne Unterscheidung des Kontexts (einfaches htmlspecialchars). Eng mit den Funktionen und dem Ökosystem von Laravel verzahnt.

Lohnt sich der Einsatz eines Templating-Systems für Unternehmen?

Zunächst unterscheiden sich die Kosten für Schulung und Verwendung sowie der Gesamtnutzen je nach System erheblich. Das Templating-System Latte erleichtert dank seiner PHP-Syntax das Erlernen für Programmierer, die diese Sprache bereits kennen, ganz erheblich. Meist braucht ein Programmierer nur wenige Stunden, um sich hinreichend mit Latte vertraut zu machen, was die Schulungskosten senkt und die Einführung der Technologie und vor allem die Effizienz im täglichen Einsatz beschleunigt.

Darüber hinaus bietet Latte dank seiner einzigartigen Technik des kontextsensitiven Escapings ein hohes Maß an Schutz vor XSS-Sicherheitslücken. Dieser Schutz ist entscheidend für die Sicherheit von Webanwendungen und minimiert das Risiko von Angriffen, die Benutzer oder Unternehmensdaten gefährden könnten. Die Sicherheit von Webanwendungen ist auch für den Ruf eines Unternehmens wichtig. Sicherheitsprobleme können zum Verlust des Kundenvertrauens führen und dem Image des Unternehmens am Markt schaden.

Der Einsatz von Latte senkt außerdem die Gesamtkosten für Entwicklung und Wartung, weil er beides erleichtert. Der Einsatz eines Templating-Systems lohnt sich also auf jeden Fall.

Beeinflusst Latte die Leistung von Webanwendungen?

Obwohl Latte-Templates schnell verarbeitet werden, spielt dieser Aspekt in der Produktion kaum eine Rolle. Der Grund ist, dass Template-Dateien nur einmal beim ersten Anzeigen geparst werden. Anschließend werden sie in nativen PHP-Code kompiliert, auf der Festplatte abgelegt und bei jedem weiteren Request ausgeführt, ohne dass sie erneut kompiliert werden müssen.

So funktioniert es in der Produktionsumgebung. Während der Entwicklung werden Latte-Templates bei jeder Änderung ihres Inhalts neu kompiliert, damit der Entwickler stets die aktuelle Version sieht.