Massachusetts Institute of Technology. Vorlesung # 6.858. "Sicherheit von Computersystemen." Nikolai Zeldovich, James Mickens. 2014 Jahr
Computer Systems Security ist ein Kurs zur Entwicklung und Implementierung sicherer Computersysteme. Die Vorträge behandeln Bedrohungsmodelle, Angriffe, die die Sicherheit gefährden, und Sicherheitstechniken, die auf jüngsten wissenschaftlichen Arbeiten basieren. Zu den Themen gehören Betriebssystemsicherheit, Funktionen, Informationsflussmanagement, Sprachsicherheit, Netzwerkprotokolle, Hardwaresicherheit und Sicherheit von Webanwendungen.
Vorlesung 1: „Einführung: Bedrohungsmodelle“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 2: „Kontrolle von Hackerangriffen“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 3: „Pufferüberläufe: Exploits und Schutz“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 4: „Trennung von Privilegien“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 5: „Woher kommen Sicherheitssysteme?“
Teil 1 /
Teil 2Vorlesung 6: „Chancen“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 7: „Native Client Sandbox“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 8: „Netzwerksicherheitsmodell“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 9: „Sicherheit von Webanwendungen“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 10: „Symbolische Ausführung“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 11: „Ur / Web-Programmiersprache“
Teil 1 /
Teil 2 /
Teil 3 Wenig später werde ich Ihnen von gefälschten Cross-Site-Anfragen erzählen. Ich denke, die Vorlesungsunterlagen erklären, warum Crossite-Scripting in unserem Fall nicht funktioniert. Der Grund dafür ist, dass jedes Objekt, jeder Baum und verschiedene Teile dieses Baums nicht nur Zeichenfolgen sind, wenn Sie ein „Stück“ Syntax erstellen.

Sie können eine Benutzerzeichenfolge nicht versehentlich in einen Strukturbaum verwandeln. Dies geschieht nicht automatisch, da es schwierig ist, einen solchen Übersetzer zu schreiben. Sie können jedoch versuchen, einen Übersetzer für Ur / Web zu schreiben. In Kürze werde ich ein Beispiel geben, das dazu beitragen wird, Ihre Besorgnis darüber zu verringern. Ich möchte Ihnen zeigen, wie diese Syntax im Compiler tatsächlich funktioniert.
Es könnte den Anschein haben, als könnten wir einfach doppelte Anführungszeichen um den HTML-Code setzen, um dann zur normalen Welt zurückzukehren. Man könnte sich fragen, warum es so wichtig ist, doppelte Anführungszeichen zu überspringen und stattdessen XML zu platzieren?
Sie können mein Wort dafür nehmen, dass dies der äquivalente Code für das ist, was es tut. Hier ist ein Inline-Funktions-Tag, das den Baumknoten eines HTML-Dokuments erstellt. Als nächstes platziere ich die Argumente, die den CSS-Stil ausdrücken, in diesem Knoten. Hier passiert eigentlich nichts, daher gibt es viele verschiedene Möglichkeiten, „Keine“ zu sagen. Es sind keine Attribute erforderlich.
Als nächstes setze ich das Body-Tag, dies ist eine andere Sache aus der Standardbibliothek. Alle Standard-Tags sind erstklassige Funktionen in der Bibliothek.

Als nächstes müssen wir den Text "Hello World" in den Text einfügen, also rufen wir die cdata-Funktion auf, wobei cdata das XML-Wort für Zeichendaten oder nur eine Zeichenfolgenkonstante ist, und wir können den Text hier platzieren. Dies sollte uns das gleiche Ergebnis wie zuvor geben. Mal sehen, ob das funktioniert.
Jetzt werde ich zur Seite zurückkehren. Wir sehen dasselbe wie zuvor, also ist dies dasselbe wie die Funktion am Anfang.

Dies ist nicht nur Linienbau. Dies führt zu einer Reihe von Vorgängen, die so konzipiert sind, dass nur Sie gültiges HTML erstellen können, und sie können die Zeile niemals implizit als Code interpretieren, anstatt nur Inhalte auf der Seite zu platzieren, die dort sein sollte.

Jetzt werde ich versuchen, etwas weniger Kompliziertes zu tun, was möglicherweise Anlass zur Sorge geben könnte. Lassen Sie uns entscheiden, dass wir wirklich glücklich sind, die Welt zu sehen, also heben wir das Wort "Hallo" fett hervor und kompilieren es erneut.

Sie sehen, was auf der Seite passiert ist - das Wort wurde nicht fett, da der Compiler zeigt, wie der Text anstelle von Markup interpretiert wird. Dies ist eine Darstellung der HTML-Syntax als eine Funktion, die die Syntax ohne die üblichen Codierungskonventionen erstellt. Diese Funktion interpretiert alles so, wie Sie schreiben wollten, ohne an etwas von sich selbst zu denken.
Daher führt die cdata-Implementierung das aus, was üblicherweise als Escape oder "Escape" bezeichnet wird. Der Programmierer muss jedoch nicht wissen, dass es so etwas wie Flucht gibt. Sie können sich das als eine Reihe praktischer Funktionen zum Erstellen eines Objektbaums vorstellen, der die Seite beschreibt.
Ich habe gehört, dass Sie den hier generierten HTML-Code sehen möchten. Okay, das wird nicht das Aufregendste sein. Ich werde versuchen, es auf dem Bildschirm zu vergrößern, aber dann passt es nicht in eine Zeile.
Student: Wenn Sie XHTML verwenden, können Sie den Pfad für cdata-Zeichendaten einfach verwenden, anstatt ihn manuell auszuführen?
Professor: Ich denke, aber das würde mehr XML von mir erfordern als die, die ich habe. Es gab noch eine gute Frage zu JavaScript-URLs. Wenn wir JavaScript-URLs zulassen, erstellen wir eine Hintertür, um Zeichenfolgen zur Laufzeit automatisch als Programme zu interpretieren. Und das verursacht alle möglichen Probleme.
Versuchen wir es zu vermeiden. Ich werde zunächst auf die verkürzte Version zurückgreifen und ein paar Zeilen im Körper machen. Und lassen Sie uns einen Link einfügen, der versucht, etwas Angemessenes zu tun. Hier lassen wir Raum für Fehlermeldungen.

Führen Sie als Nächstes den Compiler aus und sehen Sie, wie es funktioniert.

Ungültige URL, dann JavaScript-Eintrag und die Phrase "an Segen übergeben" oder "Segen übergeben". Bless ist in die Funktion integriert, bei der es sich um den Gatekeeper handelt, der die URL auflöst. Standardmäßig sind URLs nicht zulässig, daher ist diese Option natürlich nicht zulässig. Im Allgemeinen ist es eine schlechte Idee, eine eigene URL-Richtlinie zu schreiben, damit Sie Werte erstellen können, die JavaScript-URLs darstellen. Denn dann sind alle Arten von Garantien erforderlich, da diese Adressen möglicherweise ungültig sind.
Um die Funktionsweise etwas klarer zu gestalten, möchte ich diesen Code in eine separate Funktion zerlegen, die den Linker aufruft, der die URL akzeptiert. Eine URL ist also ein Typ, keine Zeichenfolge. Dies ist der Typ, der die URL angibt, die von der Richtlinie Ihrer Anwendung ausdrücklich zugelassen wird.
Ich verwende geschweifte Klammern, wie in einigen gängigen HTML-Vorlagen-Frameworks, um das Einfügen von Code aus der Host-Sprache in das von uns erstellte HTML anzuzeigen. Und das alles so, dass der Typ statisch überprüft wird. Das System prüft also: "Ja, dies ist der Ort, zu dem die URL gehört, und es heißt, dass es sich wirklich um eine URL handelt, also ist alles in Ordnung."

Und dann kann ich den Segensaufruf explizit arrangieren, indem ich sage: "Rufen wir hier einfach die Linkerfunktion auf, basierend auf den Ergebnissen des" Segens "dieser URL." Danach sollten wir die gleiche Fehlermeldung wie zuvor erhalten.

Leider kann ich dies nicht für Sie ausführen und warten, bis es fehlschlägt, aber ich kann sagen, dass es definitiv fehlschlagen wird, da ich absichtlich einen Compilerfehler gemacht habe. Diese URL wird von der URL-Richtlinie nicht akzeptiert.
Wenn ich diesen Segensaufruf verpassen würde, wäre dies beim Kompilieren ein schwerwiegenderer Fehler, da Sie die Zeichenfolge und die richtige URL haben und diese vom unterschiedlichen Typ sind.

Machen wir es interessanter. Ich werde eine Konfigurationsdatei für diese Demo öffnen. Es ist ziemlich kurz, zumindest wenn Sie sich ein Java-Webanwendungsframework ansehen. Sie haben diese riesigen XML-Dateien zur Konfiguration, so dass bei uns alles viel besser ist.

Wir können eine Regel hinzufügen, die besagt, dass alles auf Wikipedia erlaubt ist, und dann die Wikipedia-URL in den Text einfügen.

Gehen Sie nun zur Seite und klicken Sie auf Bitte klicken.

Folgendes haben wir: Wikipedia-Adresse nicht gefunden.

Die Hauptidee besteht also darin, einen abstrakten URL-Typ zu haben, wie Sie einen abstrakten Hash-Tabellentyp haben könnten, der Variationen des Aussehens der Hash-Tabelle codiert und verhindert, dass Code in das Hash-Tabellen-Array gelangt. Wir können das gleiche für die URL tun. Mit dieser Segensfunktion stellt das System sicher, dass jeder Wert dieses Typs irgendwann eine entsprechende Prüfung besteht.
Mit dieser Richtlinie wissen wir beispielsweise, dass wir niemals eine JavaScript-URL haben werden, sodass Sie den Wert der URL sicher als Link verwenden können. Dies wird die grundlegenden Abstraktionen der Sprache nicht brechen.
Student: Ist es möglich, "reines" JavaScript zu verwenden, indem man es in die Body-Zeichenfolge einfügt?
Professor: ja und nein. Anstelle von JavaScript binden Sie Ur / Web-Code ein, der eine Aufgabe ausführt. Jetzt werde ich den Befehl eingeben:
return <xml><body onload = {alert “LOADED”}>
Und Sie werden sehen, was passiert ist - der Dolmetscher hat ein Fenster mit der Aufschrift „Geladen“ - „Geladen“ auf dem Bildschirm platziert.

Der Versuch, JavaScript-Code in Zeichenfolgenform als Programm zu interpretieren, wäre eine Katastrophe. Sie sehen, wir können Code in dieselbe Programmiersprache einfügen, mit der Sie arbeiten, die bereits durch diese geschweiften Klammern begrenzt ist. Und dann wird es automatisch in JavaScript kompiliert, um auf der Clientseite ausgeführt zu werden.
Ich stelle fest, dass neuere Versionen von Browsern Fehler bei der Zeicheninterpretation vermeiden können, aber einige ältere Browser können etwas verwirren. In jedem Fall werden alle Zeichenelemente als UTF-8 interpretiert, wenn sie in das Dokument eingegeben werden. Wenn es ein Problem mit einer anderen Codierung gibt, sollte diese Codierung hier nicht angewendet werden.
Student: Der Compiler prüft, ob die Zeichenfolge eine gültige URL enthält. Wenn Sie jedoch zur Laufzeit eine Zeichenfolge berechnen, prüft Bless zur Laufzeit, ob eine bestimmte Zeichenfolge gültig ist oder nicht?
Professor: Lassen Sie uns ein Formular erstellen, um diese Aussage zu testen, und es hier platzieren. Wir geben unsere URL in das URL-Textfeld ein und fügen dann die Schaltfläche "Senden senden" ein.

Wenn Sie darauf klicken, wird die Linkerfunktion aufgerufen, wobei für jedes Feld im Formular ein Wert geschrieben wird. In diesem Fall gibt es nur ein Feld mit dem Namen "URL", sodass der Linker den Eintrag mit der URL als Zeichenfolgentyp verarbeitet. Und dann versuchen wir, die Segen-Funktion darauf anzuwenden und zu sehen, ob es funktioniert.

Sie sehen ein Beispiel für Fehlermeldungen, wenn Sie den falschen URL-Typ eingeben. Dies ist eines der Dinge, die keinen Sinn ergeben, wenn Sie nicht mit Haskell vertraut sind. Ich habe vergessen, die Rückgabefunktion hier einzufügen. Zumindest ist es jetzt eher wie ein Java-Programm. Und ich habe auch vergessen zu sagen, dass es jetzt eine ganze Seite ist. Daher können wir das a-Tag erst verwenden, wenn wir uns innerhalb des body-Tags befinden.

Führen Sie nun den Compiler aus, gehen Sie zu unserer Seite, klicken Sie auf die Schaltfläche Bitte klicken, und geben Sie eine abstruse, nicht vorhandene Adresse ein.

Dann klicken wir auf Abfrage senden - "Anfrage senden" und wir erhalten eine Fehlermeldung - die Adresse dieses Typs wird nicht aufgelöst.

Wenn wir die richtige URL eingeben, wie im nächsten Bildschirm angezeigt, und dann auf Abfrage senden klicken, wird keine Fehlermeldung angezeigt.

Ich denke, die Antwort auf Ihre Frage war lang und nicht zu aufregend.
Student: Gibt es neben dem Verbot der Verwendung von JavaScript strengere Bedingungen für URLs?
Professor: Derzeit sind strengere Einschränkungen einfach Konstanten und Präfixe. Sie können aber auch eigene Verbotsregeln erstellen, die in der Reihenfolge funktionieren, in der Sie sie schreiben.
Student: Es stellt sich heraus, dass der Compiler dies interpretieren kann, wenn Sie sich an das Verbot von JavaScript halten, aber einen Zeilenumbruch in die Mitte des Wortes "JavaScript" setzen ...
Professor: Ja, das wäre schade. Deshalb ist es gut, sich an den Whitelist-Ansatz zu halten, anstatt den Blacklist-Ansatz zu verwenden. Sie möchten wahrscheinlich, dass alle Regeln mit einem bestimmten Protokoll beginnen, z. B. HTTP, und nur zulassen, was in Ihre genehmigte Protokollsuite passt. Ich empfehle genau das zu tun.
Student: Auf vielen Websites können Sie Benutzern den Austausch von Links erlauben. In diesem Fall müssen Sie Links überall zulassen.
Professor: Sie können Links zulassen, wenn Ihre Benutzer JavaScript-Links oder, ich weiß nicht, Flash-Links oder was auch immer dort zulässig ist, freigeben sollen. Sie sehen, Sie können eine „weiße Liste“ aller HTTP-, HTTPS- und URLs erstellen und so den sicheren Betrieb der meisten Websites gewährleisten. Dieser Ansatz ist nur geringfügig schwächer als nur bestimmte URLs zuzulassen. Zumindest können Sie jedoch die Möglichkeit der automatischen Ausführung eines Strings als Programm vollständig ausschließen.
Lassen Sie mich ein Beispiel für eine Zusammenfassung geben, die ein Beispiel für ein einfaches Chatroom-System ist, das in der Datenbank dargestellt wird. Der Benutzer kann auf den Link klicken, um in den Raum zu gelangen und eine Nachricht zu senden. Dies ist die erste von mehreren Optionen für das Schema.

Zunächst werde ich feststellen, dass ich dies neu kompilieren werde. Und dann werden auf magische Weise alle deklarierten Datenbanktabellen zur Datenbank hinzugefügt, und wir können die Anwendung verwenden. Aber zuerst müssen wir einige Chatrooms hinzufügen. Öffnen wir also unsere Schnittstelle zur Demo-Datenbank und fügen Sie die Werte "eins" und "zwei" in den Tabellenraum ein.

Jetzt sind sie hier erschienen.

Jetzt gehen wir in den ersten Chatraum und können uns den ganzen Tag unterhalten, indem wir Textzeilen senden, zum Beispiel eine solche erste Zeile. Es wird interessanter sein, HTML zu senden, und es wird sofort verarbeitet. Dies ist ein Beispiel für die Hauptfunktionalität des Programms.

Wir werden noch einmal schnell durchgehen, wie es funktioniert, also haben wir diese beiden SQL-Tabellen - Tabellenraum und Tabellennachricht, die einfach in dieser ersten Klasse innerhalb der Programmiersprache deklariert werden. Und wir geben ein Diagramm jeder Tabelle. Wenn wir dann versuchen, auf diese Tabellen zuzugreifen, stellt der Compiler sicher, dass auf sie gemäß einem vielversprechenden Typisierungsschema zugegriffen wird.

Wir haben also eine Tabelle mit Räumen, in der jeder Raum ein Datensatz ist, der aus einer Bezeichner-ID, die eine Ganzzahl ist, und einem Titel, der eine Zeichenfolge ist, besteht. Dies ist die Art von Ansicht, in der wir einfach Datensätze erstellt haben. Ich habe gerade einige Räume in der SQL-Konsole erstellt. Wir haben auch eine Benachrichtigung, dass jede Nachricht zu einem bestimmten Raum gehört, die Zeit, zu der sie erstellt wurde, und den Text, der den Inhalt der Nachricht darstellt.
Lassen Sie mich jetzt schnell zur Hauptfunktion springen.

Wir führen eine SQL-Abfrage aus. Sie sehen ein Beispiel für die in Ur / Web integrierte SQL-Syntax. Ich möchte nicht über diese Erweiterung aus der Standardbibliothek auf Funktionsaufrufe eingehen. Es wird ziemlich ausführlich sein, es reicht aus, um meine Worte darüber zu erinnern, dass die Standardbibliothek Methoden zum Aufrufen von Funktionen enthält, die gültige Methoden zum Erstellen einer SQL-Abfrage sind.
Und diese Funktionen haben Typen, die sie dazu bringen, Anforderungen für Sie zu drucken, und nicht nur garantieren, dass die Syntax gültig ist. Dieser Code durchläuft einfach alle Zeilen, die aus dieser Abfrage hervorgegangen sind, und generiert für jede Zeile Teile des HTML-Codes.
Insbesondere werden wir das Abfrageergebnis in das Feld Titel einfügen und es in HTML mit einer Notation konvertieren, die geschweifte Klammern enthält. Die eckigen Klammern zeigen zusätzlich an, dass dies noch kein echtes Stück HTML ist, aber bitte konvertieren Sie es für mich auf eine Standardweise. Wir können also mit Zeichenfolgen und Ganzzahlen und allen Daten anderer Typen arbeiten.
Student: Wenn es bösartiges HTML oder etwas anderes enthalten würde, würde es herausgefiltert werden?
Professor: Ja, das würde es. In Ur / Web können Sie sich das als Erstellen eines Baums vorstellen. Dies ist ein Knoten, der für Text steht. Offensichtlich kann der Text nichts tun.
Student: Wenn dieser Header unter der Kontrolle des Benutzers wäre und jemand mit der Überschrift "Warnung" chatten würde, wäre es dann nicht JavaScript?
Professor: Es wird nicht automatisch als JavaScript, HTML oder irgendetwas anderes interpretiert. Es wird vom Programm als Klartext wahrgenommen.
Also zurück zu unserem Bildschirmbild. Wir haben diesen Titel Titel, lassen Sie uns ihn mit Tags einrahmen. Und anstelle von href, der üblichen Art, in HTML zu verlinken, verwenden wir das Link-Attribut, eine Art Ur / Web-Pseudoattribut, das nicht die URL, sondern hauptsächlich Ur / Web-Ausdrücke als Argument verwendet. Der Punkt ist, dass wenn Sie auf diesen Link klicken, dieser Ausdruck gestartet wird, um eine neue Seite zu erstellen, die angezeigt werden soll.
In diesem Fall rufen wir die Chat-Funktion auf, die hier auf dem nächsten Bildschirm definiert ist.

Ich werde nicht auf Details eingehen. Wir haben jedoch noch einige weitere SQL-Abfragen, die verschiedene Standardbibliotheksfunktionen verwenden, um die angeforderten Ergebnisse auf verschiedene Weise zu verwenden.
Wir generieren diese HTML-Seite und sagen, dass Sie sich in einem Chat mit einem solchen Titel befinden. Wir haben ein Formular, in das der Benutzer Text eingeben kann. Dies ist das Formular, mit dem ich vor einigen Minuten demonstriert habe, wie das Programm funktioniert. Die Schaltfläche zum Senden von Formularen enthält das Attribut Hinzufügen, das say enthält. Dies ist der Name der Ur / Web-Funktion. Wenn wir das Formular senden, rufen wir diese Funktion daher auf.
Wenn Sie ein paar weitere SQL-Anweisungen ausführen, werden neue Zeilen in die Tabelle eingefügt. Wir springen automatisch von der Chatroom-ID zu den Textfeldern, die aus dem Formular hierher gekommen sind, und sie werden bei Bedarf automatisch ausgeblendet. Andererseits müssen Sie in Ur / Web nicht daran denken, der Funktion auf diese Weise zu entkommen. Weil es nur die Syntax zum Erstellen eines Baums ist, nicht für eine Zeichenfolge. Es gibt also keine Möglichkeit, dass beim Parsen seltsame Dinge passieren, die Sie von der gewählten Art der Interpretation der Syntax nicht erwarten.
Aufgrund der Tatsache, dass wir in diesem Formular ein Widget in Form einer grafischen Benutzeroberfläche haben und dies ein Textfeld ist, kommt der Compiler zu dem Schluss, dass der Datensatz, der sich aus dem Ausfüllen des Textfeldformulars ergibt, ein Element namens "Text" vom Typ "Zeichenfolge" enthalten muss . Diese Codierung des Formulars und die Regeln für die Eingabe sind nicht in die Sprache integriert, sondern stammen aus der Ur-Express-Bibliothek, die diese Formulare tatsächlich steuert und die Arten gültiger Funktionen bestimmt.
Wenn Sie keine weiteren Fragen zu diesem Teil des Programms haben, gehe ich zum nächsten Schritt über. Ich werde eine Möglichkeit verwenden, um die Kapselung verschiedener Teile einer Anwendung zu erzwingen, die Ur / Web unterstützt und die selten andere Sprachen unterstützt. Ich werde dieses Zimmer nehmen. Ich werde einige Definitionen nehmen und sie in ein Modul einfügen, das einige davon als privat kapselt. Insbesondere sind die Datenbanktabellen privat, sodass niemand direkt darauf zugreifen kann.
Sie können nur mit den von uns bereitgestellten Methoden darauf zugreifen. Eine Methode wird innerhalb einer Transaktion ausgeführt und erstellt eine Liste von Datensätzen mit ID- und Titelfeldern für verfügbare Chatrooms.
Als nächstes erweitern wir einfach diesen Chat-Vorgang. Und das einzige, was ich hier getan habe, war, einen Namen für die Konzept-ID einzugeben - Typ-ID. Ich sage also nicht nur, dass die ID eine Ganzzahl ist, ich sage, dass dies ein neuer Typ ist.

Die Außenwelt kann den Chat nur kontaktieren, indem sie eine Liste aller Räume abruft. Die Außenwelt kann ihn nur verwenden, indem sie die Chat-Funktion darin aufruft. Angenommen, dies ist eine abstrakte Art von Hash-Tabelle innerhalb der Hash-Tabellenklasse, in der Details gespeichert werden, die erklären, was IDs sind und wie sie intern erstellt werden, für dieses Modul privat sind und der Client-Code, der dieses Modul aufruft, sie nicht verwenden sollte.
Jetzt werde ich all diese Syntax nach unten übertragen und im Modul platzieren, damit sie standardmäßig nicht dem Rest des Codes ausgesetzt ist. Als nächstes implementiere ich diese Methode der Räume. Wir haben bereits die Möglichkeit, einen Chat zu organisieren. Wir können die Räume jedoch einfacher implementieren, indem wir eine andere Standardbibliotheksfunktion verwenden, um die Anforderung in der aktuellen Form zu interpretieren.
Lassen Sie uns einfach alles aus der Liste der Räume auswählen, sortiert nach Namen. Wie üblich ist diese Abfrage ein validierter Datentyp für uns. Und das System stellt fest: "OK, dieser Ausdruck generiert eine Liste von Datensätzen, die dem in der Signatur dieses Moduls deklarierten Typ entsprechen." Außerhalb dieses Moduls kann kein anderer Code einen Raumtisch oder eine Nachrichtentabelle erwähnen.

Zumindest aus Sicht dieser Anwendung können wir daher die erforderliche Invarianz daraus anwenden. Wir können sogar Geheimnisse im Modul verbergen, damit es keine Sicherheitsprobleme gibt, wenn ein anderer Teil des Codes sie bekommen kann.
Student: Könnte ein anderer Code diese Raummethode ebenfalls implementieren?
Professor: Das wäre ein ganz anderer Tisch. Tatsächlich können wir dies tun, indem wir ein solches Fragment von 4 Zeilen in ein anderes Modul einfügen.

Dann können wir mit dieser Tabelle machen, was wir wollen. Ich werde es kompilieren, vielleicht in 30 Sekunden, und wir werden sehen, was passiert. Tatsächlich handelt es sich jedoch um eine andere Tabelle, als hätten Sie denselben privaten Namen, jedoch für zwei verschiedene Java-Klassen.
Sie nehmen also an, dass es in diesem Modul einen abstrakten Typ namens Raum gibt, der die ID-ID und den Titel des Titels enthält. Das ist nicht richtig. Chat akzeptiert Raumparameter als Eingabe. Wenn wir die Chat-Funktion aufrufen, wird sie über die URL aufgerufen. Die ID und der Titel werden außerhalb der Darstellung der URL übergeben, die die Funktion aufruft. Wir brauchen nur die ID, um diese Funktion zu implementieren. Wenn wir also die Funktion aufrufen, rufen wir tatsächlich die URL auf.
Es wäre verschwenderisch in Bezug auf die Speicherplatznutzung und würde für den Benutzer unhöflich aussehen, wenn der Header als zusätzliches Argument beim Aufrufen des Chats über die URL übergeben würde. Macht das Sinn? Schauen wir uns die URL-Leiste auf dieser Folie an.

Die Kennung des Kanals, dem wir folgen, wird automatisch in die URL am Ende der Zeile serialisiert. Und wenn wir einen Datensatz übertragen würden, der die ID und den Titel Titel enthält, würde dieser Titel auch serialisiert, was zumindest ein wenig unlogisch ist.
54:10
MIT-Kurs "Computer Systems Security". Vorlesung 11: Ur / Web-Programmiersprache, Teil 3Die Vollversion des Kurses finden Sie
hier .
Vielen Dank für Ihren Aufenthalt bei uns. Gefällt dir unser Artikel? Möchten Sie weitere interessante Materialien sehen? Unterstützen Sie uns, indem Sie eine Bestellung
aufgeben oder Ihren Freunden empfehlen, einen
Rabatt von 30% für Habr-Benutzer auf ein einzigartiges Analogon von Einstiegsservern, das wir für Sie erfunden haben: Die ganze Wahrheit über VPS (KVM) E5-2650 v4 (6 Kerne) 10 GB DDR4 240 GB SSD 1 Gbit / s von $ 20 oder wie teilt man den Server? (Optionen sind mit RAID1 und RAID10, bis zu 24 Kernen und bis zu 40 GB DDR4 verfügbar).
VPS (KVM) E5-2650 v4 (6 Kerne) 10 GB DDR4 240 GB SSD 1 Gbit / s bis Dezember kostenlos, wenn Sie für einen Zeitraum von sechs Monaten bezahlen, können Sie
hier bestellen.
Dell R730xd 2 mal günstiger? Nur wir haben
2 x Intel Dodeca-Core Xeon E5-2650v4 128 GB DDR4 6 x 480 GB SSD 1 Gbit / s 100 TV von 249 US-Dollar in den Niederlanden und den USA! Lesen Sie mehr über
den Aufbau eines Infrastrukturgebäudes. Klasse mit Dell R730xd E5-2650 v4 Servern für 9.000 Euro für einen Cent?