Gemeinsame Gateway -Schnittstelle

Im Computer, Gemeinsame Gateway -Schnittstelle (CGI) ist eine Schnittstellenspezifikation, die ermöglicht Webserver Um ein externes Programm auszuführen, normalerweise um Benutzeranfragen zu verarbeiten.[1]

Solche Programme werden oft in einem geschrieben Skriptsprache und werden allgemein als als bezeichnet als CGI -Skripte, aber sie können beinhalten zusammengestellt Programme.[2]

Ein typischer Anwendungsfall tritt auf, wenn ein Webbenutzer a einreicht Web-Formular Auf einer Webseite, die CGI verwendet. Die Daten des Formulars werden in einem an den Webserver gesendet HTTP -Anfrage mit einer URL Bezeichnung eines CGI -Skripts. Der Webserver startet dann das CGI -Skript in einem neuen ComputerprozessÜbergabe der Formdaten an sie. Die Ausgabe des CGI -Skripts, normalerweise in Form von Html, wird vom Skript an den Webserver zurückgegeben, und der Server gibt es als IT an den Browser weiter Antwort auf die Anfrage des Browsers.[3]

CGI wurde Anfang der neunziger Jahre entwickelt und war die früheste verfügbare Methode, mit der eine Webseite interaktiv sein konnte.

Geschichte

Das offizielle CGI -Logo aus der Spec -Ankündigung

1993 die Nationales Zentrum für Supercomputing -Anwendungen (NCSA) Team schrieb die Spezifikation für den Aufruf von Befehlszeilen ausführbare Ausführungsfähigkeiten auf der Mailingliste www-talk.[4][5][6] Die anderen Webserverentwickler haben es übernommen und seitdem ein Standard für Webserver. Eine Arbeitsgruppe unter dem Vorsitz von Ken Coar Begonnen im November 1997, um die NCSA -Definition von CGI formeller zu definieren.[7] Diese Arbeit führte zu RFC 3875, in dem die CGI -Version 1.1 angegeben war. Speziell im RFC erwähnt sind die folgenden Mitwirkenden:[3]

Historisch gesehen wurden CGI -Programme häufig mit der C -Sprache geschrieben. RFC 3875 "Die gemeinsame Gateway -Grenzfläche (CGI)" definiert CGI teilweise mit C,[3] Bei der Aussage, dass Umgebungsvariablen "von der C -Bibliotheksroutine getenv () oder variabler Umgebung zugegriffen werden".

Der Name CGI stammt aus den frühen Tagen des Webs, wo Web Masters Wollte ältere Informationssysteme wie Datenbanken mit ihren Webservern verbinden. Das CGI -Programm wurde vom Server ausgeführt, das ein gemeinsames "Gateway" zwischen dem Webserver und dem Legacy Information System bereitstellte.

Zweck der CGI -Spezifikation

Jeder Webserver läuft Http Serversoftware, die auf Anfragen von reagiert von Internetbrowser. Im Allgemeinen hat der HTTP -Server a Verzeichnis (Ordner), die als Dokumentsammlung bezeichnet wird - Dateien, die an Webbrowser gesendet werden können, die mit diesem Server verbunden sind.[8] Zum Beispiel, wenn der Webserver den Domänennamen hat Beispiel.comund seine Dokumentsammlung wird bei gespeichert /usr/local/apache/htdocs/ Im lokalen Dateisystem antwortet der Webserver auf eine Anfrage für http://example.com/index.html Durch Senden an den Browser die (vorgeschriebene) Datei /usr/local/apache/htdocs/index.html.

Bei Seiten, die im Fliegen konstruiert sind, kann die Serversoftware Anforderungen auf die Trennung von Programmen und die Weitergabe der Ergebnisse an den anfordernden Client aufschieben (normalerweise ein Webbrowser, der die Seite dem Endbenutzer anzeigt). In den frühen Tagen des Webs waren solche Programme normalerweise klein und in einer Skriptsprache geschrieben. Daher waren sie als bekannt als Skripte.

Solche Programme erfordern normalerweise einige zusätzliche Informationen, die mit der Anfrage angegeben werden sollen. Wenn beispielsweise Wikipedia als Skript implementiert würde, müsste das Skript wissen, ob der Benutzer angemeldet ist und wenn sie angemeldet sind, unter welchem ​​Namen. Der Inhalt oben auf einer Wikipedia -Seite hängt von diesen Informationen ab.

HTTP bietet Browsern Möglichkeiten, solche Informationen an den Webserver zu übergeben, z. als Teil der URL. Die Serversoftware muss diese Informationen dann irgendwie an das Skript übergeben.

Umgekehrt muss das Skript bei der Rückgabe alle von HTTP erforderlichen Informationen für eine Antwort auf die Anforderung bereitstellen: den HTTP -Status der Anforderung, den Dokumentinhalt (falls verfügbar), der Dokumenttyp (z. B. HTML, PDF oder Klartext) , und so weiter.

Anfänglich würde verschiedene Serversoftware unterschiedliche Möglichkeiten verwenden, um diese Informationen mit Skripten auszutauschen. Infolgedessen war es nicht möglich, Skripte zu schreiben, die für verschiedene Serversoftware unmodifiziert funktionieren, obwohl die ausgetauschten Informationen gleich waren. Daher wurde beschlossen, einen Weg zum Austausch dieser Informationen anzugeben: CGI (die Gemeinsame Gateway -Schnittstelle, wie es eine gemeinsame Möglichkeit für die Serversoftware definiert, mit Skripten zu fördern). Webseite Generierungsprogramme, die von der Server -Software aufgerufen werden, die gemäß der CGI -Spezifikation funktionieren CGI -Skripte.

Diese Spezifikation wurde schnell übernommen und wird immer noch von allen bekannten Serversoftware unterstützt, wie z. Apache, Iisund (mit einer Erweiterung) node.js-basierte Server.

Eine frühzeitige Verwendung von CGI -Skripten bestand darin, Formulare zu verarbeiten. Zu Beginn von HTML hatten HTML -Formulare in der Regel ein "Aktion" -attribut und eine Schaltfläche, die als "Senden" -Taste bezeichnet wurde. Wenn die Taste der Subjekte gedrückt wird, wird das in dem Attribut "Aktion" angegebene URI mit den Daten aus dem als gesendeten Formular an den Server gesendet Abfragezeichenfolge. Wenn die "Aktion" ein CGI -Skript angibt, wird das CGI -Skript ausgeführt und erstellt dann eine HTML -Seite.

Verwenden von CGI -Skripten

Ein Webserver ermöglicht es seinem Eigentümer, zu konfigurieren, welche URLs mit welchen CGI -Skripten behandelt werden sollen.

Dies geschieht normalerweise, indem ein neues Verzeichnis innerhalb der Dokumentensammlung als CGI -Skripte markiert wird - der Name ist häufig CGI-bin. Zum Beispiel, /usr/local/apache/htdocs/cgi-bin könnte als CGI -Verzeichnis auf dem Webserver ausgewiesen werden. Wenn ein Webbrowser eine URL anfordert, die auf eine Datei innerhalb des CGI -Verzeichnisses verweist (z. B.,,,, http://example.com/cgi-ner/prinlenv.pl/with/additional/path?and=A&query=string) dann, anstatt einfach diese Datei zu senden (/usr/local/apache/htdocs/cgi-bin/printenv.pl) Zum Webbrowser führt der HTTP -Server das angegebene Skript aus und übergibt die Ausgabe des Skripts an den Webbrowser. Das heißt alles, was das Skript sendet Standardausgabe wird an den Web-Client übergeben, anstatt in einem Terminalfenster auf dem Bildschirm angezeigt zu werden.

Wie oben erwähnt, definiert die CGI -Spezifikation, wie zusätzliche Informationen, die mit der Anforderung übergeben werden, an das Skript übergeben werden. Zum Beispiel, wenn ein Schrägstrich und zusätzliche Verzeichnisnamen unmittelbar nach dem Namen des Skripts an die URL angehängt werden (in diesem Beispiel, /mit/zusätzlich/Pfad), dann wird dieser Weg in der gespeichert Path_info Umgebungsvariable Bevor das Skript aufgerufen wird. Wenn Parameter über ein an das Skript gesendet werden Http bekommen Anfrage (eine an die URL angehängte Fragezeichen, gefolgt von Param = Wertpaaren; im Beispiel, ? und = a & query = String), dann werden diese Parameter in der gespeichert Query_string Umgebungsvariable bevor das Skript aufgerufen wird. Wenn Parameter über ein an das Skript gesendet werden HTTP -Post Anfrage, sie werden an das Skript übergeben Standardeingabe. Das Skript kann dann diese Umgebungsvariablen oder Daten aus Standardeingaben lesen und sich an die Anforderung des Webbrowsers anpassen.[9]

Beispiel

Folgende Perl Das Programm zeigt alle vom Webserver übergebenen Umgebungsvariablen:

#!/usr/bin/env Perl = Head1 Beschreibung PRINGENV - Ein CGI -Programm, das nur seine Umgebung druckt = Schnitt drucken "Inhaltstyp: Text/Plain \ n \ n"; zum mein $ var ( Sortieren Schlüssel %Env ) {  printf "%s = \"%s \ "\ n", $ var, $ Env{$ var}; } 

Wenn ein Webbrowser eine Anfrage für die Umgebungsvariablen ausgibt http://example.com/cgi-ner/prinlenv.pl/foo/bar?var1=Value1&var2=With%20percent%20Coding, ein 64-Bit Windows 7 Webserver ausgeführt Cygwin Gibt die folgenden Informationen zurück:

Comspec ="C: \ Windows \ System32 \ cmd.exe" Document_root ="C:/Programmdateien (x86)/Apache Software Foundation/Apache2.4/HTDOCS" Gateway_interface ="CGI/1.1" Home ="/Home/System" Http_accept ="text/html, application/xhtml+xml, application/xml; q = 0,9,*/*; q = 0,8" Http_accept_charset ="ISO-8859-1, UTF-8; Q = 0,7,*; Q = 0,7" Http_accept_encoding ="Gzip, Deflate, Br" Http_accept_glanguage ="en-us, en; q = 0,5" Http_connection ="bleib am Leben" Http_host ="Beispiel.com" Http_user_agent ="Mozilla/5.0 (Windows NT 6.1; WOW64; RV: 67,0) Gecko/20100101 Firefox/67,0" WEG="/home/system/bin:/bin:/cygDrive/c/progra ~ 2/php:/cygDrive/c/Windows/System32: ..." Patext =".Com; .exe; .bat; Path_info ="/foo/bar" " Path_translated ="C: \ Programme (x86) \ Apache Software Foundation \ Apache2.4 \ htdocs \ foo \ bar" Query_string ="var1 = value1 & var2 = mit%20 Prozent%20codieren " Remote_addr ="127.0.0.1" Remote_port ="63555" Request_method ="ERHALTEN" Request_uri ="/cgi --in/printenv.pl/foo/bar?var1=Value1&var2=with%20 Prozent%20codieren " Script_filename ="C:/Programmdateien (x86)/Apache Software Foundation/Apache2.4/CGI-bin/prinzip.pl" Script_name ="/cgi ---Bin/printenv.pl" Server_addr ="127.0.0.1" Server_admin ="(E -Mail -Adresse des Serveradministrators)" Server_name ="127.0.0.1" Server_port ="80" Server_protocol ="Http/1.1" Server_signature ="" " Server_software ="Apache/2.4.39 (Win32) PHP/7.3.7" Systemroot ="C: \ Windows" Begriff ="Cygwin" Windir ="C: \ Windows" 

Einige, aber nicht alle dieser Variablen werden durch den CGI -Standard definiert. Einige, wie z. Path_info, Query_stringund diejenigen, die mit beginnen Http_Geben Sie Informationen aus der HTTP -Anfrage weiter.

Aus der Umgebung ist ersichtlich, dass der Webbrowser ist Feuerfuchs auf A laufen Windows 7 PC, der Webserver ist Apache Laufen auf einem System, das emuliert Unixund das CGI -Skript wird benannt cgi-bin/printelnv.pl.

Das Programm könnte dann Inhalte generieren, das an schreiben StandardausgabeUnd der Webserver überträgt es an den Browser.

Die Folgenden sind Umgebungsvariablen übergeben an CGI -Programme:

  • Serverspezifische Variablen:
    • Server_software: Name/Ausführung von HTTP -Server.
    • SERVERNAME: Hostname des Servers kann sein Dot-Dezimal IP Adresse.
    • Gateway_interface: Cgi/Ausführung.
  • Fordern Sie spezifische Variablen an:
    • Server_protocol: Http/Ausführung.
    • SERVER PORT: TCP -Port (Dezimal).
    • Request_method: Name der HTTP -Methode (siehe oben).
    • Path_info: Pfad -Suffix, falls nach dem Programmnamen und einem Schrägstrich an URL angehängt.
    • Path_translated: dazugehörigen vollständigen Pfad Wie vom Server angenommen, wenn Path_info ist anwesend.
    • Script_name: relativer Weg zum Programm wie /cgi ---Bin/Script.cgi.
    • Query_string: Der Teil der URL danach ? Charakter. Das Abfragezeichenfolge Kann aus * zusammengesetzt seinName=Wert Paare getrennt mit Verstärker (wie zum Beispiel var1=Val1&var2=Val2...) Wenn es verwendet wird, sich einzureichen bilden Daten, die per GET -Methode übertragen werden, wie von HTML definiert Anwendung/X-WWW-Form-Urlencoded.
    • REMOTE-HOST: Hostname des Clients, nicht festgelegt, wenn der Server eine solche Suche nicht durchgeführt hat.
    • Remote_Addr: IP Adresse des Clients (dot-dezimal).
    • AUTHENTIFIZIERUNGSTYP: Identifikationstyp, falls zutreffend.
    • Remote_User mit Sicherheit verwendet AUTHENTIFIZIERUNGSTYPs.
    • Remote_ident: sehen IdentitätNur, wenn der Server eine solche Suche durchführte.
    • INHALTSTYP: Internet -Medientyp von Eingabedaten, wenn Put- oder Post -Methode verwendet wird, wie über den HTTP -Header bereitgestellt.
    • INHALTSLÄNGE: In ähnlicher Weise die Größe der Eingabedaten (Dezimales, in Oktetten) wenn über HTTP -Header bereitgestellt.
    • Variablen, die vom Benutzeragenten übergeben wurden (Http_accept, Http_accept_klanguage, Http_user_agent, Http_cookie und möglicherweise andere) enthalten Werte von entsprechend HTTP -Header und haben daher den gleichen Sinn.

Das Programm gibt das Ergebnis in Form einer Standardausgabe an den Webserver zurück, beginnend mit einem Header und a Leerzeile.

Der Header ist genauso codiert wie eine HTTP -Header und muss das einschließen Mime Typ des Dokuments zurückgegeben.[10] Die vom Webserver ergänzten Header werden im Allgemeinen mit der Antwort an den Benutzer weitergeleitet.

Hier ist ein einfaches CGI -Programm, das in Python 3 zusammen mit dem HTML geschrieben wurde, das ein einfaches Additionsproblem behandelt.[11]

add.html:

 <html>  <Karosserie>  <bilden Aktion="add.cgi" Methode="POST">  <Fieldset>  <Legende>Geben Sie zwei Zahlen ein, um hinzuzufügenLegende>  <Etikett>Erste Nummer: <Eingang Typ="Nummer" Name="Num1"> </Etikett> <Br/>  <Etikett>Zweite Nummer: <Eingang Typ="Nummer" Name="Num2"> </Etikett> <Br/>  Fieldset>  <Taste>HinzufügenTaste>  bilden>  Karosserie> html> 

add.cgi:

#!/usr/bin/env python3 importieren CGI, cgitb cgitb.ermöglichen() Eingabedaten = CGI.Fieldstorage() drucken('Inhaltstyp: text/html') # HTML folgt drucken('' ')  # Hinterlasse eine leere Linie drucken('<h1> Additionsergebnisse </h1>') Versuchen:  Num1 = int(Eingabedaten["Num1"].Wert)  Num2 = int(Eingabedaten["Num2"].Wert) außer:  drucken('<ausgabe> Entschuldigung, das Skript kann Ihre Eingaben nicht in Zahlen (Ganzzahlen) verwandeln. </output>')  heben Systemexit(1) drucken('<ausgabe>{0} + {1} = {2}'.Format(Num1, Num2, Num1 + Num2)) 

Dieses Python 3 CGI -Programm erhält die Eingaben von der HTML und fügt die beiden Zahlen zusammen.

Einsatz

Ein Webserver, der CGI unterstützt URL Dass es als Verweis auf ein CGI -Skript dient. Eine übliche Konvention ist eine cgi-bin/ Verzeichnis An der Basis des Verzeichnisbaums und behandeln Sie alle ausführbaren Dateien in diesem Verzeichnis (und keiner anderen für Sicherheit) als CGI -Skripte. Eine weitere beliebte Konvention ist die Verwendung Dateiname -Erweiterungen; Zum Beispiel, wenn CGI -Skripte konsequent die Erweiterung erhalten .cgiDer Webserver kann so konfiguriert werden, dass alle Dateien wie CGI -Skripte interpretiert werden. Obwohl es von vielen vorverpackten Skripten bequem ist, öffnet er den Server, um anzugreifen, wenn ein Remote -Benutzer ausführbare Dateicode mit der richtigen Erweiterung hochladen kann.

Im Falle des Http put oder postsDie vom Benutzer eingereichten Daten werden dem Programm über die zur Verfügung gestellt Standardeingabe. Der Webserver erstellt eine Teilmenge der Umgebungsvariablen An die HTTP -Umgebung weitergegeben und fügt Details hinzu.

Verwendet

CGI wird häufig verwendet, um Eingabeinformationen vom Benutzer zu verarbeiten und die entsprechende Ausgabe zu erzeugen. Ein Beispiel für ein CGI -Programm ist eines, das a implementiert wird Wiki. Wenn der Benutzeragent den Namen eines Eintrags anfordert, führt der Webserver das CGI -Programm aus. Das CGI -Programm ruft die Quelle der Seite dieses Eintrags (falls vorhanden) ab Htmlund druckt das Ergebnis. Der Webserver empfängt die Ausgabe aus dem CGI -Programm und überträgt sie an den Benutzeragenten. Wenn der Benutzeragent dann auf die Schaltfläche "Seite bearbeiten" klickt, wird das CGI -Programm ein HTML -Programm bevölkert Textbereich oder eine andere Bearbeitungssteuerung mit dem Inhalt der Seite. Wenn der Benutzeragent die Schaltfläche "Seite veröffentlichen" klickt, verwandelt das CGI -Programm die aktualisierte HTML in die Quelle der Seite dieses Eintrags und speichert sie.

Sicherheit

CGI -Programme werden standardmäßig im Sicherheitskontext des Webservers ausgeführt. Bei der ersten Einführung wurden eine Reihe von Beispiel -Skripten mit den Referenzverteilungen der NCSA-, Apache- und CERN -Webserver zur Verfügung gestellt, um zu zeigen, wie Shell -Skripte oder C -Programme codiert werden können, um das neue CGI zu verwenden. Ein solches Beispiel war ein CGI -Programm namens PHF, das ein einfaches Telefonbuch implementiert hat.

Gemeinsam mit einer Reihe anderer Skripte zu diesem Zeitpunkt verwendete dieses Skript eine Funktion: Escape_shell_cmd (). Die Funktion sollte ihr Argument, das aus der Benutzereingabe stammt, und dann die Eingabe an die UNIX -Shell übergeben, um im Sicherheitskontext des Webservers ausgeführt zu werden. Das Skript hat nicht alle Eingaben korrekt beruhigt und neue Zeilen an die Shell übergeben, wodurch mehrere Befehle ausgeführt werden konnten. Die Ergebnisse dieser Befehle wurden dann auf dem Webserver angezeigt. Wenn der Sicherheitskontext des Webservers dies zulässt, könnten böswillige Befehle von Angreifern ausgeführt werden.

Dies war das erste weit verbreitete Beispiel für a Neue Art von webbasiertem Angriff, wo unitanitierte Daten von Webnutzern zur Ausführung von Code auf einem Webserver führen können. Da der Beispielcode standardmäßig installiert wurde, waren die Angriffe weit verbreitet und führten Anfang 1996 zu einer Reihe von Sicherheitsberatungen.[12]

Alternativen

Für jede eingehende HTTP -Anforderung erstellt ein Webserver ein neues CGI Prozess Für den Umgang und zerstört den CGI -Prozess, nachdem die HTTP -Anfrage bearbeitet wurde. Das Erstellen und Zerstören eines Prozesses kann viel mehr CPU und Speicher verbrauchen als die tatsächliche Arbeit, die Ausgabe des Prozesses zu generieren, insbesondere wenn das CGI -Programm noch sein muss interpretiert von einer virtuellen Maschine. Für eine hohe Anzahl von HTTP -Anforderungen kann die resultierende Workload den Webserver schnell überwältigen.

Das Überkopf Die Erstellung und Zerstörung von CGI -Prozessen ist durch die folgenden Techniken reduziert werden:

  • CGI -Programme vorkompiliert zu Maschinensprache, z.B. vorkompiliert von C oder C ++ Programme anstelle von CGI -Programmen, die von einer virtuellen Maschine interpretiert werden, z. Perl, Php oder Python Programme.
  • Webserver -Erweiterungen wie z. Apache -Module (z.B. mod_perl, mod_php, mod_python), Nsapi Plugins und Isapi Plugins, mit denen langjährige Anwendungsprozesse mehr als eine Anforderung bearbeiten und auf dem Webserver gehostet werden können. Web 2.0 Ermöglicht die Übertragung von Daten vom Client auf den Server, ohne HTML -Formulare zu verwenden, und ohne den Benutzer.[13]
  • Fastcgi, Scgi, und AJP Dadurch werden langlebige Bewerbungsprozesse mehr als eine Anforderung bearbeitet, die extern auf dem Webserver gehostet wird. Jeder Bewerbungsprozess hört auf einem Socket zu. Der Webserver übernimmt eine HTTP -Anforderung und sendet sie über ein anderes Protokoll (FASTCGI, SCGI oder AJP) nur für dynamische Inhalte an den Socket, während statische Inhalte normalerweise direkt vom Webserver behandelt werden. Dieser Ansatz benötigt weniger Anwendungsprozesse, sodass weniger Speicher als der Ansatz der Webservererweiterung verbraucht. Im Gegensatz zum Konvertieren eines Anwendungsprogramms in eine Webservererweiterung bleiben FASTCGI-, SCGI- und AJP -Anwendungsprogramme unabhängig vom Webserver.
  • Jakarta ee läuft Jakarta Servlet Anwendungen in a Webcontainer Dynamische Inhalte und optional statischer Inhalte zu bedienen, der den Aufwand des Erstellens und Zerstörens von Prozessen durch den viel niedrigeren Aufwand des Erstellens und Zerstörens ersetzt Themen. Es wird auch den Programmierer der Bibliothek ausgesetzt, mit der er geliefert wird Java se auf die die Version von Jakarta EE verwendet wird.

Die optimale Konfiguration für jede Webanwendung hängt von anwendungsspezifischen Details, Verkehrsmenge und Komplexität der Transaktion ab. Diese Kompromisse müssen analysiert werden, um die beste Implementierung für eine bestimmte Aufgabe und ein bestimmtes Zeitbudget zu ermitteln. Webrahmen Bieten Sie eine Alternative zur Verwendung von CGI -Skripten zur Interaktion mit Benutzeragenten.

Siehe auch

Verweise

  1. ^ Robinson <[email protected]>, David. "Die Common Gateway Interface (CGI) Version 1.1". Tools.ietf.org. Abgerufen 16. Februar 2021.
  2. ^ Robinson <[email protected]>, David. "Die Common Gateway Interface (CGI) Version 1.1". Tools.ietf.org. Archiviert Aus dem Original am 11. Februar 2007. Abgerufen 16. Februar 2021.
  3. ^ a b c "RFC3875: Die Common Gateway Interface (CGI) Version 1.1".
  4. ^ McCool, Rob (14. November 1993). "Serverskripte". www-talk (Mailingliste). Abgerufen 2019-05-15.
  5. ^ "Die gemeinsame Gateway -Schnittstelle". Hoohoo NCSA HTTPD. NCSA. Archiviert von das Original am 27. Januar 2010.
  6. ^ "CGI: Common Gateway Interface". W3c. World Wide Web Konsortium. Abgerufen 2019-05-15.
  7. ^ "Common Gateway Interface RFC -Projektseite". Archiviert von das Original am 25. August 2013.
  8. ^ "Zuordnen von URLs zu Dateisystemorten Apache HTTP Server Version 2.2".
  9. ^ Nelson, Anne Fulcher und Nelson, William Harris Morehead. (2001). Bauen elektronischer Handel mit Webdatenbankkonstruktionen. Boston, MA: Addison Wesley.
  10. ^ "CGI Primer (Spiegel in CityCat.ru)".
  11. ^ "Abacles HTML Formen". www.abacles.com. Archiviert von das Original am 19. April 2016. Abgerufen 6. April 2016.
  12. ^ "Das PHF -CGI -Skript schützt sich nicht vor neuen Charakteren.". Zertifizierungszentrum für das Software Engineering Institute Certation. Abgerufen 21. November 2019.
  13. ^ Enrico Marino (11. September 2018). Informationsmanagement im verteilten Web (PDF) (PhD). Roma Tre University. Abgerufen 11. Februar 2019.

Externe Links