Warum ich modernes Web nicht mag



Der allererste Schritt bei der Arbeit mit dem Web besteht darin, Daten an Ihre Serveranwendung zu senden. Und wenn das Analysieren eines Dutzend kleiner Zeilen dem Framework anvertraut werden kann, was ist dann mit dem Herunterladen von Dateien?

Nehmen wir als Beispiel PHP, obwohl das Beschriebene für 99% der anderen Sprachen und Technologien gilt. Angenommen, wir möchten dem Benutzer erlauben, Bilder auf die Site hochzuladen. Dazu erstellen wir ein Formular mit einem Feld vom Typ Datei und ... Äußerlich ist alles sehr einfach, nur wenige Bytes im Formular und im Code haben sich geändert, aber jetzt können Sie mit Dateien anstelle von Text aus den Formularen arbeiten! Aber nicht alles ist so einfach. Ihre Datei muss sich zuerst irgendwo in / tmp / befinden, bis die Anfrage vollständig eingeht. Ihr Skript erhält einfach keine Kontrolle und Sie können nichts dagegen tun. Beispielsweise hat der Benutzer anstelle eines Bildes eine Exe-Datei hochgeladen, die Sie jedoch erst nach Abschluss des Downloads erfahren. Auf diese Weise kann ein Angreifer für einige Zeit einen Kanal und die Zeit Ihres Festplattensubsystems hämmern und so tun, als würde er nützliche Dateien laden, und Sie wissen nicht einmal davon. Befindet sich der Caching-Server vor dem Anwendungsserver, ist die Situation noch schlimmer: Beispielsweise erstellt nginx temporäre Dateien, d. H. Zunächst wird die Anfrage des Benutzers auf der Festplatte abgelegt. Sobald sie abgeschlossen ist, wird die Datei erneut gelesen und schnell an den Anwendungsserver (in unserem Fall PHP) weitergeleitet, wo sie EINMAL WIEDER auf der Festplatte gespeichert wird. Vollständige dreifache Nutzung der Festplatte, auch wenn der Benutzer nur die Meldung "Sie haben vergessen, Captcha einzugeben" anzeigen muss.

Ich spreche nicht von der Tatsache, dass mehr lustige Dinge mit diesem Ansatz nicht gemacht werden können. Eine einfache Funktion wie die Fortschrittsanzeige für das Hochladen von Dateien ist nicht mehr verfügbar. Für komplexere Beispiele: Youtube zeigt Frames aus einem Film, der noch geladen, aber nicht vollständig geladen ist. Sie erhalten keine Kontrolle (und sogar keine Benachrichtigungen!), Bevor der gesamte Film (z. B. 2 Gigabyte) heruntergeladen wird. Sie wissen nicht einmal, dass jemand 1,5 Gigabyte Ihrer Festplatte gegessen hat, aber dann den Browser geschlossen oder auf die Schaltfläche "Aktualisieren" im Browser geklickt hat, ohne auf etwas zu warten.

Natürlich gibt es verschiedene Krücken mit unterschiedlichem Krümmungsgrad, mit denen Sie typische Aufgaben lösen können, z. B. das Empfangen von Anforderungsstatistiken über JSON, die als Module von Webservern implementiert sind. Sie müssen diese Dinge jedoch selbst tun und / oder sich an die Umgebung binden. Die Anwendung ist nicht mehr unabhängig und wird abhängig von bestimmten Anwendungen und deren Bibliotheken.

Cache


Caches sind wichtig. Mit der Caching-Technik können Sie die Reaktionsfähigkeit Ihrer Site beschleunigen und die Belastung reduzieren, sodass für viele Anforderungen nicht mehr dieselben Vorgänge ausgeführt werden müssen. Zum Beispiel, wie viele nicht 2 + 2 machen, wird es immer 4 geben, aber das Berechnen von 2 + 2 beansprucht Serverressourcen. Es ist viel rentabler, diesen Wert 1 Mal zu berechnen, wenn der erste Besucher ankommt, und dann irgendwo zu schreiben, um diesen anderen Benutzer herauszugeben Ergebnis.

Verwechseln Sie dieses Caching nicht mit http-Headern, sie wirken sich nur auf einen bestimmten Client aus (im Original auch auf Zwischenproxys), während das Caching auf dem Server so konzipiert ist, dass viele Benutzer denselben Inhalt erhalten.

Leider ist es nicht rentabel, einem Zwischenserver Caching zu geben. Im Falle der geringsten Aktualisierung einer Seite müssen Sie eine Seite von Grund auf neu erstellen. Angesichts der modernen Realität, wenn eine Seite viele dynamische Elemente enthält, ist tatsächlich jede Seite einzigartig und andererseits eine Anforderung des Formulars GET / somepage.html? someshit = 12345 durchbricht den Cache und es wird eine neue Seite erstellt, die diesen Parameter nicht einmal berücksichtigt, aber dennoch Kosten für ihre Erstellung verursacht, die wiederum von einem Angreifer verwendet werden können. Daher verwenden nur wenige Benutzer Zwischen-Cache-Server, und es ist bereits sehr schwierig, sich auf sie zu verlassen.

Es bleibt, alles in der Anwendung zwischenzuspeichern, fast jedes Framework bietet seine eigenen Krücken sowie vorgefertigte wie alle Arten von Memosheds und dergleichen. In der Regel schreiben unerfahrene Entwickler nur in kochendem Wasser, wenn sie feststellen, dass Sie beim Generieren einer Seite 500 Anfragen an den zwischengespeicherten Speicher stellen können und nichts dafür vorhanden ist (im Gegensatz zu jedermanns Lieblings-MySQL). Infolgedessen wird der gesamte Code mit Wrappern abgedeckt, die zuerst das Ergebnis der Anforderung im Memcache überprüfen und dann nach dem Ergebnis in MySQL klettern. Ich behaupte nicht, dass eine manuelle Steuerung des Caches erforderlich ist, aber eine vollständig manuelle Steuerung führt zu möglichen Fehlern, bei denen Sie einfach vergessen können, das Caching zu aktivieren, was nach dem Gesetz der Gemeinheit ein kritischer Ort sein wird.

Schnittstellen


Welche Schnittstelle sollte die Site haben? Sag einfach nicht so grün.

Bisher war die Darstellung der Website in der Regel einfach und unteilbar. Auf großen Portalen gab es jedoch Schaltflächen "Druckversion" oder sogar "WAP-Version", die später durch die "PDA-Version" ersetzt wurden - bereits einfaches HTML, nur einfacher. Obwohl je nachdem, wo, wenn Sie Twitter nehmen, ist dies die einzige lesbare Version davon. Die Zeit verging und es bestand die Notwendigkeit, Websites nicht nur für Drucker und Telefone, sondern auch für alle Arten von iPads und Kühlschränken mit HTML5-Unterstützung zu bearbeiten. Das alles verliebte sich natürlich in die Entwickler, da sie tatsächlich 10 Versionen von jeweils einer Site erstellen mussten und beschlossen, etwas Universelles zu tun. Eine Art API für die Site.

Was ist eine API - ich weiß es nicht. Ehrlich gesagt weiß ich es nicht. Normalerweise ist dies eine Art Scheiße, wenn Sie mit einem urlencodierten String auf einen Server spucken und im Gegenzug ein Stück json / xml / plain text erhalten, wie viel Glück es hat. Natürlich können keine Standards, auch keine primitiven Datentypen, irgendetwas sein, ein leeres Ergebnis kann auch irgendetwas sein, von null bis "" (leere Anführungszeichen), oder sogar als Ergebnis fehlen. Es ist gut, wenn die Autoren über ein Wort wie REST lesen und es schnell umsetzen, aber vor dem Hintergrund von allem anderen macht es keinen Sinn. Die Funktionalität ist auch nicht klar. Wenn wir durch Anfordern einer HTML-Seite alles auf einmal erhalten können (aktuelle Nachrichten, Kommentare, Likes usw.), wie viele Anfragen wir im Falle einer API stellen müssen - nur der Autor dieser API weiß, dass dies durchaus möglich ist dass Kommentare empfangen werden können, aber sie mögen - nein. Tatsächlich ist eine API eine Möglichkeit, die Client- und Serverentwicklung in völlig unterschiedliche Entwicklungsteams zu unterteilen, die schlecht miteinander interagieren. Über die Nützlichkeit dieser API kann nicht gesprochen werden.

Und es kommt häufig vor, dass für den Zugriff auf die API ein bestimmter Schlüssel erforderlich ist. Schlüssel sind oft kostenlos erhältlich. Warum nicht so einen Schlüssel bekommen? Das Problem ist, dass dies zu einer expliziten Abrechnung von Anforderungen und zu einer internen Abrechnung führt. Und wer weiß, wann der Autor das alles monetarisieren will? Es ist möglich, dass nach einiger Zeit kostenlose Schlüssel deaktiviert oder stark eingeschränkt werden und die Verwendung eines kostenpflichtigen Tarifs angeboten wird. Und manchmal wird im Allgemeinen die Ausgabe aller Schlüssel ausgesetzt, und der Dienst wird auch auf kommerzieller Basis gestoppt. Dies geschieht auch. Warum ist eine API? Es ist einfacher für mich, die Seite zu dehnen und mit Stammgästen zu analysieren, als eine solche Schande zu ertragen. Daher verwende ich diese Ihrer APIs fast nie, zumal ich mich nicht mit deren Funktionen befassen werde.

Source: https://habr.com/ru/post/de426297/


All Articles