heim - Windows
Amerika-Index-PHP-Benutzer. Aufbau eines unglaublich einfachen Registrierungssystems in PHP und MySQL

Heute werfen wir einen Blick auf die Ausnutzung einer kritischen 1-Tages-Sicherheitslücke im beliebten CMS Joomla, die Ende Oktober im Internet explodierte. Wir werden über Schwachstellen mit Zahlen sprechen CVE-2016-8869, CVE-2016-8870 Und CVE-2016-9081. Alle drei stammen aus einem einzigen Codestück, das fünf lange Jahre lang in den Tiefen des Frameworks schmachtete und in den Startlöchern wartete, nur um sich dann zu befreien und Chaos, gehackte Websites und die Tränen unschuldiger Benutzer dieses Joomla mit sich zu bringen. Nur die tapfersten und mutigsten Entwickler, deren Augen vom Licht der Monitore gerötet waren und deren Tastaturen mit Brotkrümeln übersät waren, konnten sich den wütenden bösen Geistern entgegenstellen und ihre Köpfe auf den Altar der Korrekturen legen.

WARNUNG

Alle Informationen dienen ausschließlich Informationszwecken. Weder die Herausgeber noch der Autor sind für mögliche Schäden verantwortlich, die durch die Materialien dieses Artikels verursacht werden.

Wo alles begann

Am 6. Oktober 2016 erstellte Demis Palma ein Thema auf Stack Exchange, in dem er fragte: Warum gibt es in Joomla Version 3.6 eigentlich zwei Methoden zur Registrierung von Benutzern mit demselben Namen register()? Der erste befindet sich im UsersControllerRegistration-Controller und der zweite im UsersControllerUser-Controller. Damis wollte wissen, ob die Methode UsersControllerUser::register() irgendwo verwendet wurde oder ob es sich nur um einen evolutionären Anachronismus handelte, der von der alten Logik übrig geblieben war. Seine Sorge war, dass diese Methode, selbst wenn sie von keiner Ansicht verwendet wird, von einer gestalteten Abfrage aufgerufen werden kann. Darauf erhielt ich eine Antwort von einem Entwickler unter dem Spitznamen itoctopus, der bestätigte: Das Problem besteht tatsächlich. Und schickte einen Bericht an die Joomla-Entwickler.

Dann entwickelten sich die Ereignisse am schnellsten. Am 18. Oktober akzeptierten die Joomla-Entwickler den Bericht von Damis, der zu diesem Zeitpunkt einen PoC entworfen hatte, der die Benutzerregistrierung ermöglichen würde. Er veröffentlichte auf seiner Website eine Notiz, in der er allgemein über das von ihm festgestellte Problem und seine Gedanken zu diesem Thema sprach. Am selben Tag wird eine neue Version von Joomla 3.6.3 veröffentlicht, die noch anfälligen Code enthält.

Danach spinnt Davide Tampellini den Fehler so weit, dass kein einfacher Benutzer, sondern ein Administrator registriert wird. Und bereits am 21. Oktober erreicht das Joomla-Sicherheitsteam einen neuen Fall. Es ist bereits von zunehmenden Privilegien die Rede. Am selben Tag erscheint auf der Joomla-Website die Ankündigung, dass am Dienstag, 25. Oktober, die nächste Version mit der Seriennummer 3.6.3 veröffentlicht wird, die eine kritische Schwachstelle im Systemkernel behebt.

25. Oktober Das Joomla Security Strike Team findet das neueste Problem, das durch den von Damis entdeckten Code verursacht wurde. Dann wird ein Commit vom 21. Oktober mit dem unauffälligen Namen Prepare 3.6.4 Stable Release in den Hauptzweig des offiziellen Joomla-Repositorys gepusht, der den unglücklichen Fehler behebt.

Nach der Veröffentlichung schließen sich zahlreiche Interessierte der Entwicklergemeinschaft an – sie beginnen, die Schwachstelle bekannt zu machen und Exploits vorzubereiten.

Am 27. Oktober lädt der Forscher Harry Roberts einen vorgefertigten Exploit in das Xiphos Research-Repository hoch, der eine PHP-Datei auf einen Server mit einem anfälligen CMS hochladen kann.

Einzelheiten

Nun, der Hintergrund ist vorbei, kommen wir zum interessantesten Teil – der Analyse der Schwachstelle. Ich habe Joomla 3.6.3 als Testversion installiert, daher sind alle Zeilennummern für diese Version relevant. Und alle Pfade zu den Dateien, die Sie unten sehen, werden relativ zum Stammverzeichnis des installierten CMS angegeben.

Dank der Entdeckung von Damis Palma wissen wir, dass es zwei Methoden gibt, die die Benutzerregistrierung im System durchführen. Die erste wird vom CMS verwendet und befindet sich in der Datei /components/com_users/controllers/registration.php:108. Der zweite (den wir aufrufen müssen) befindet sich in /components/com_users/controllers/user.php:293. Schauen wir es uns genauer an.

286: /** 287: * Methode zum Registrieren eines Benutzers. 288: * 289: * @return boolean 290: * 291: * @since 1.6 292: */ 293: öffentliche Funktion register() 294: ( 295: JSession::checkToken("post") oder jexit(JText::_ ("JINVALID_TOKEN")); ... 300: // Formulardaten abrufen. . 315: $return = $model->validate($form, $data); 316: 317: // Auf Fehler prüfen. 319: ( ... 345: / / 346: $return = $model->register($data);

Hier habe ich nur interessante Zeilen hinterlassen. Die Vollversion der anfälligen Methode kann im Joomla-Repository eingesehen werden.

Lassen Sie uns herausfinden, was bei der normalen Benutzerregistrierung passiert: Welche Daten werden gesendet und wie werden sie verarbeitet? Wenn die Benutzerregistrierung in den Einstellungen aktiviert ist, finden Sie das Formular unter http://joomla.local/index.php/component/users/?view=registration.


Eine legitime Benutzerregistrierungsanfrage sieht wie im folgenden Screenshot aus.


Die Komponente com_users ist für die Arbeit mit Benutzern verantwortlich. Achten Sie auf den Aufgabenparameter in der Anfrage. Es hat das Format $controller.$method . Schauen wir uns die Dateistruktur an.

Namen der Skripte im Ordner Controller entsprechen den Namen der aufgerufenen Controller. Da unsere Anfrage nun $controller = "registration" enthält, wird die Datei aufgerufen Registration.php und seine Methode register().

Achtung, Frage: Wie kann die Registrierungsverarbeitung an eine anfällige Stelle im Code übertragen werden? Sie haben es wahrscheinlich schon erraten. Die Namen der anfälligen und echten Methoden sind identisch (Register), wir müssen also nur den Namen des aufgerufenen Controllers ändern. Wo ist unser verwundbarer Controller? Genau, in der Akte user.php. Es stellt sich heraus $controller = "user" . Wenn wir alles zusammenfügen, erhalten wir task = user.register . Jetzt wird die Registrierungsanfrage mit der von uns benötigten Methode bearbeitet.


Als Zweites müssen wir die Daten im richtigen Format senden. Hier ist alles einfach. Legitimate register() erwartet von uns ein Array namens jform , in dem wir Registrierungsdaten übergeben – Name, Login, Passwort, E-Mail (siehe Screenshot mit der Anfrage).

  • /components/com_users/controllers/registration.php: 124: // Benutzerdaten abrufen. 125: $requestData = $this->input->post->get("jform", array(), "array");

Unser Kunde erhält diese Daten von einem Array namens user.

  • /components/com_users/controllers/user.php: 301: // Formulardaten abrufen. 302: $data = $this->input->post->get("user", array(), "array");

Daher ändern wir die Namen aller Parameter in der Anfrage von jfrom in user .

Unser dritter Schritt besteht darin, ein gültiges CSRF-Token zu finden, da ohne dieses keine Registrierung erfolgt.

  • /components/com_users/controllers/user.php: 296: JSession::checkToken("post") oder jexit(JText::_("JINVALID_TOKEN"));

Es sieht aus wie ein MD5-Hash und Sie können ihn beispielsweise dem Autorisierungsformular auf der Website /index.php/component/users/?view=login entnehmen.


Jetzt können Sie Benutzer mit der gewünschten Methode erstellen. Wenn alles geklappt hat, dann herzlichen Glückwunsch – Sie haben gerade eine Schwachstelle ausgenutzt CVE-2016-8870„Fehlende Berechtigungsprüfung für die Registrierung neuer Benutzer.“

So sieht es in der „funktionierenden“ register()-Methode des UsersControllerRegistration-Controllers aus:

  • /components/com_users/controllers/registration.php: 113: // Wenn die Registrierung deaktiviert ist – Weiterleitung zur Anmeldeseite. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view= login", false)); 117: 118: return false; 119: )

Und so in verwundbar:

  • /components/com_users/controllers/user.php:

Ja, auf keinen Fall.

Um das zweite, viel schwerwiegendere Problem zu verstehen, senden wir die von uns erstellte Anfrage und sehen, wie sie in verschiedenen Teilen des Codes ausgeführt wird. Hier ist der Teil, der für die Validierung der vom Benutzer übermittelten Daten in der Worker-Methode verantwortlich ist:

Die Fortsetzung steht nur Mitgliedern zur Verfügung

Option 1: Treten Sie der „Site“-Community bei, um alle Materialien auf der Site zu lesen

Durch die Mitgliedschaft in der Community innerhalb des angegebenen Zeitraums erhalten Sie Zugriff auf ALLE Hacker-Materialien, erhöhen Ihren persönlichen kumulativen Rabatt und können eine professionelle Xakep-Score-Bewertung erwerben!

In der letzten Lektion haben wir herausgefunden, aus welchen Blöcken die Reisevorlage bestehen wird, damit wir uns an die Arbeit machen können. Erstellen wir zunächst zwei Ordner:

Bilder – Dieser Ordner enthält alle Grafikdateien, die zum Entwerfen der Vorlage verwendet werden. Weil Wir haben noch keine Designentwicklungen, dann legen Sie eine beliebige Grafikdatei in diesem Ordner ab, sonst installiert Joomla die Vorlage nicht und gibt eine Fehlermeldung aus, wenn der Ordner leer ist.

ACHTUNG: Der Ordner mit den Vorlagenbildern enthält keine Inhaltsgrafiken!

css – dieser Ordner enthält Cascading Stylesheet-Dateien. Platzieren wir zunächst eine leere template.css-Datei darin, die verwendet wird, um den Site-Elementen unterschiedliche Designstile zuzuweisen.

Als Nächstes können Sie mit der Erstellung der Hauptdatei index.php beginnen, die die visuelle Anordnung der Site-Elemente bestimmt und dem Joomla CMS mitteilt, in welchem ​​Block verschiedene Komponenten und Module platziert werden sollen. Die Datei ist eine Kombination aus PHP und HTML.

Ich verwende beim Schreiben von Code immer nur Macromedia Dreamweaver. Ein ausgezeichnetes Programm, ich kann es Anfängern wärmstens empfehlen, weil... Wenn Sie bei der Arbeit am Code einen Fehler gemacht haben, wird das Programm Ihren Fehler auf jeden Fall hervorheben.

Auf der Seite finden Sie ein Tutorial für Macromedia Dreamweaver. Wenn Sie Websites entwickeln möchten, sollten Sie dieses Programm zumindest auf der Anfangsebene beherrschen, um Vorlagencodes fehlerfrei bearbeiten zu können.

Die Positionierung von Seitenelementen (Blöcken) erfolgt mithilfe von HTML-Code. Wir verwenden insbesondere DIV-Tags. Aber die Art und Weise, wie unsere Website auf der Joomla-Engine funktionieren wird, d. h. Es wird dynamisch sein, dann müssen Sie auch die PHP-Sprache verwenden. Mit seiner Hilfe bestimmen wir, in welchen Blöcken sich die Positionen für die Ausgabe von Modulen befinden, wie diese Positionen heißen und ob die Blöcke zusammengeklappt werden oder nicht. Wir verbinden Stylesheets aus externen Dateien, die Inhaltssprache, legen fest, wie sich die Site-Größe ändert usw.

index.php

Dateikopf

Der Dateikopf besteht aus mehreren Teilen. Der erste Teil des PHP-Header-Codes soll aus Sicherheitsgründen sicherstellen, dass nicht direkt auf die Datei zugegriffen wird.

< ?php
definiert ("_JEXEC" ) oder die ;
JHtml::_("behavior.framework" , true ) ;
$app = JFactory::getApplication() ;
?>
< ?php echo "< ?" ; ?> xml-Version="1.0" Kodierung=" < ?php echo $Das-> _charset ?> "?>

DOCTYPE ist ein sehr wichtiger Parameter, auf dessen Grundlage der Browser entscheidet, wie diese Seite gerendert und das CSS interpretiert wird.

< ! DOCTYPE html PUBLIC "- / / W3C/ / DTD XHTML 1.0 Strict/ / EN"„http: // www.w3.org/ TR/ xhtml1/ DTD/ xhtml1- strict.dtd">

Der folgende Codeausschnitt ruft die installierte Sprache aus der globalen Konfiguration ab.

< html xmlns= "http:// www.w3.org/ 1999/ xhtml" xml:lang= " < ?php echo $Das-> Sprache; ?> " lang= " < ?php echo $Das-> Sprache; ?> " dir = " < ?php echo $Das-> Richtung; ?> " >

Als nächstes folgt ein Codeabschnitt, der zusätzliche Header-Informationen enthält, die in der globalen Konfiguration festgelegt werden. Sie können diese Informationen sehen, indem Sie sich den Quellcode einer beliebigen Webseite ansehen. Dabei handelt es sich insbesondere um Meta-Tags, die Sie bereits kennen.

< head>
< jdoc:include type= "head" / >

Die folgenden Kopfzeilen enthalten Links zu den wichtigsten Joomla-CSS-Stilen.

< link rel= "stylesheet" href= "< ?php echo $Das-> baseurl ?> /templates/system/css/system.css" type="text /css" / >
< link rel= "stylesheet" href= "< ?php echo $Das-> baseurl ?> /templates/system/css/general.css" type="text /css" / >

Um Vorlagendesignstile zu verwenden, verlinken wir auf eine Datei mit Cascading Style Sheets template.css, die sich im CSS-Ordner befindet. Es spielt keine Rolle, dass diese Datei vorerst leer ist. Die Hauptsache ist, sie zu verbinden. Mit dem Design befassen wir uns später, wenn wir die Vorlage auf Joomla installieren. Dies erleichtert die Beobachtung des Ergebnisses.

< link rel= "stylesheet" href= "< ?php echo $Das-> Basis-URL ?> /templates/< ?php echo $Das-> Vorlage ?> /css/template.css" type="text /css" / >

Mit dem folgenden Codeausschnitt können wir die linke oder rechte Spalte ausblenden, wenn sich an der linken und rechten Position keine Module befinden. Sind beide Spalten zugeklappt, nimmt der Inhalt 100 % der Seitenbreite ein. Wenn nur eine Spalte enthalten ist, nimmt der Inhalt 80 % ein. Wenn zwei Spalten aktiviert sind, macht der Inhalt 60 % der Seitenbreite aus.

< ?php
wenn ($ Das-> countModules("left and right" ) = = 0) $contentwidth = "100" ;
wenn ($ Das-> countModules("left or right" ) = = 1) $contentwidth = "80" ;
wenn ($ Das-> countModules("left and right" ) = = 1) $contentwidth = "60" ;
?>

Der Header wird geschlossen

< / head>

< body>

Der „Seite“-Block enthält nur das Design der Site-Seite, die 950 Pixel breit sein wird.

< div id= "page" >

Der Block „top“ befindet sich ganz oben auf der Seite und enthält zwei Blöcke „logo“ und „user1“.

< div id= "top" >

Im „Logo“-Bokeh platzieren wir eine Grafikdatei des Logos; dies wird in den Stylesheets angegeben. Aber wir schreiben die automatische Anzeige des Site-Namens in die Datei index.php und platzieren den Namen im H1-Tag, was für die Suchmaschinenoptimierung sehr wichtig ist.

< div id= "logo" >
< h1> < ?php echo $app - >getCfg("sitename" ); ?>< / h1>
< / div>

Definieren wir die Position „user1“ im gleichnamigen Block, um das Site-Suchmodul anzuzeigen.

< div id= "user1" >
< jdoc:include type= "modules" name= "user1" style= "xhtml" / >
< / div>
< / div> < ! - - конец блока top - - >

Ausgabe des horizontalen Menümoduls im Block „user2“ an der Position „user2“. Der Block wird zusammenbrechen, wenn sich an dieser Position kein Modul befindet.

< ?php if ($Das-> countModules("user2" ) ): ?>
< div id= "user2 " >
< jdoc:include type= "modules" name= "user2" style= "xhtml" / >
< / div>
< ?php endif ; ?>

Als nächstes kommt der Site-Header-Block. Darin definieren wir die „Header“-Position für die Anzeige von Modulen. Der Block wird zusammenbrechen, wenn sich an dieser Position kein Modul befindet. Ich habe die Fähigkeiten dieses Blocks absichtlich erweitert, um darin nicht nur das Header-Bild, sondern auch Bildrotatoren platzieren zu können.

< ?php if ($Das-> countModules(" Header") ) : ?>
< div id= "Header">
< jdoc:include type= "modules" name= "Header" style="xhtml" / >
< / div>
< ?php endif ; ?>

Im Block „user3“ definieren wir die Position „user3“ für die Ausgabe von Modulen.

Der Block wird zusammenbrechen, wenn an dieser Position „user3“ kein Modulausgang vorhanden ist.

< ?php if ($Das-> countModules("user3" ) : ?>
< div id= "user3" >
< jdoc:include type= "modules" name= "user3" style= "xhtml" / >
< / div>
< ?php endif ; ?>

Es öffnet sich ein Block der linken Spalte, der zusammenfällt, wenn sich an der „linken“ Position keine Module befinden.

< ?php if ($Das-> countModules("left" ) : ?>
< div id= "left" >
< jdoc:include type= "modules" name= "left" style= "xhtml" / >
< / div>
< ?php endif ; ?>

Es öffnet sich der wichtigste Inhaltsblock, der je nach Anzahl der enthaltenen Spalten 100 %, 80 % und 60 % der Seitenbreite einnehmen kann.

< div id= "content< ?php echo $contentwidth ; ?> " >

Anzeigen von Nachrichten in Komponenten

< jdoc:include type= "message" / >

Inhaltsinhalt ausgeben.

< jdoc:include type= "component" style= "xhtml" / >
< / div> < ! - - конец блока контента- - >

Es öffnet sich ein Block der rechten Spalte, der zusammenfällt, wenn sich an der „richtigen“ Position keine Module befinden.

< ?php if ($Das-> countModules("right" ) ): ?>
< div id= "rigth" >
< jdoc:include type= "modules" name= "right" style= "xhtml" / >
< / div>
< ?php endif ; ?>

Ausgabe des „Footer“-Blocks, der das Modul „HTML-Code“ mit Copyright-Informationen anzeigen soll. Sie können hier auch ein horizontales Menü oder ein Inhaltspräsentationsmodul unten platzieren. Der Block wird ausgeblendet, wenn an dieser „Fußzeilen“-Position mehr als ein Modul angezeigt wird

< ?php if ($Das-> countModules("footer") ) : ?>
< div id= "footer" >
< jdoc:include type= "modules" name= "footer" style= "xhtml" / >
< / div>
< ?php endif ; ?>

Der Site-Seitenblock „Seite“, der Textkörper und der gesamte Code sind geschlossen.

< / div> < ! - - конец блока page- - >
< / body> < ! - - конец блока body - - >
< / html> < ! - - конец кода- - >

Wir haben eine vollständige index.php-Datei erstellt. Jetzt wissen Sie, welche Befehle verwendet werden und in welcher Reihenfolge die Vorlagenblöcke angezeigt werden.

ACHTUNG: Damit der Vorlagencode aus dem Joomla-Admin-Panel gelesen werden kann, muss die Datei index.php im AkelPad-Editor geöffnet und in UTF-8-Kodierung gespeichert werden, während das Kontrollkästchen BOM deaktiviert ist. Wenn Sie das Programm Macromedia Dreamweaver zum Arbeiten mit der Datei verwendet haben, müssen Sie im oberen Menü „Bearbeiten“ > „Seiteneigenschaften“ auswählen, die Dokumentkodierung Unicode (utf-8) auswählen und das Kontrollkästchen „Unicode-Signaturen aktivieren (BOM) deaktivieren )“. Ich rate Ihnen jedoch dringend davon ab, den Code über das Joomla-Admin-Panel zu bearbeiten, wenn Sie etwas vermasseln – es gibt kein Zurück, anders als beim Macromedia Dreamweaver-Programm, wo Sie die vorgenommenen Änderungen jederzeit rückgängig machen können.

Das Design der Blöcke selbst wird in template.css beschrieben. Aber wir werden Stylesheets konfigurieren, nachdem wir die Vorlage auf Joomla 3 (Joomla 2.5) installiert haben, und dafür müssen wir sie erstellen

Zunächst werden wir die Registrierungsseite verbessern, indem wir die Möglichkeit hinzufügen, einen Avatar hochzuladen. Das Quellbild muss im JPG-, GIF- oder PNG-Format vorliegen. Es sollte auch nicht mehr als 2 MB betragen. Keine Sorge, nach der Komprimierung durch das Skript beträgt die Avatar-Größe etwa 3 KB und das JPG-Format. Öffnen Sie die Seite reg.php und fügen Sie es in das Tag ein < bilden> Linie enctype="multipart/form-data", wie im Beispiel:


Anmeldung










Jetzt lasst uns sparen reg.php

2.Dann müssen Sie ein weiteres Feld in der Tabelle erstellen Benutzer. Lass uns gehen phpmyadmin, wählen Sie die gewünschte Datenbank und Tabelle aus.


Wir stellen alle Werte wie in der Abbildung ein:

Der Pfad zum Avatar wird in diesem Feld aufgezeichnet und in einem separaten Ordner gespeichert, nennen wir ihn „Avatare“. Der Ordner befindet sich im selben Verzeichnis wie die übrigen Skriptdateien.

3.Gehen Sie zur Datei speichern_ Benutzer. php und fügen Sie den folgenden Code hinzu, nachdem Sie Leerzeichen aus dem Benutzernamen und dem Passwort entfernt haben:

//zusätzliche Leerzeichen entfernen
$login = trim($login);

// neue hinzufügen ********************************************

//Prüfung der Länge von Login und Passwort hinzufügen
if (strlen($login)< 3 or strlen($login) > 15) {
exit("Login muss aus mindestens 3 und höchstens 15 Zeichen bestehen.");
}
if (strlen($password)< 3 or strlen($password) > 15) {
exit("Das Passwort muss mindestens 3 und darf nicht mehr als 15 Zeichen lang sein.");
}

if (!empty($_POST["fupload"])) //überprüfen, ob der Benutzer das Bild gesendet hat
{
$fupload=$_POST["fupload"]; $fupload = trim($fupload);
if ($fupload =="" or empty($fupload)) (
unset($fupload);// wenn die Variable $fupload leer ist, dann löschen Sie sie
}
}
if (!isset($fupload) oder empty($fupload) oder $fupload =="")
{
//Wenn die Variable nicht existiert (der Benutzer hat kein Bild gesendet), dann weisen Sie ihr ein vorbereitetes Bild mit der Aufschrift „kein Avatar“ zu.
$avatar = "avatars/net-avatara.jpg"; //Sie können net-avatara.jpg zeichnen oder von der Quelle übernehmen
}
anders
{
//sonst – das Bild des Benutzers laden
$path_to_90_directory = "avatars/";//Ordner, in den das ursprüngliche Bild und seine komprimierte Kopie geladen werden

If(preg_match("/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/",$_FILES["fupload"]["name"])) //Überprüfen des Quellbildformats
{
$filename = $_FILES["fupload"]["name"];
$source = $_FILES["fupload"]["tmp_name"];
$target = $path_to_90_directory . $Dateiname;
move_uploaded_file($source, $target);//Hochladen des Originals in den Ordner $path_to_90_directory
if(preg_match("/[.](GIF)|(gif)$/", $filename)) (
$im = imagecreatefromgif($path_to_90_directory.$filename) ; //Wenn das Original im GIF-Format war, dann erstelle ein Bild im gleichen Format. Notwendig für die anschließende Komprimierung
}
if(preg_match("/[.](PNG)|(png)$/", $filename)) (
$im = imagecreatefrompng($path_to_90_directory.$filename) ;//Wenn das Original im PNG-Format war, dann erstellen Sie das Bild im gleichen Format. Notwendig für die spätere Komprimierung
}

If(preg_match("/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/", $filename)) (
$im = imagecreatefromjpeg($path_to_90_directory.$filename); //Wenn das Original im JPG-Format war, dann erstelle ein Bild im gleichen Format. Notwendig für die spätere Komprimierung
}
// ERSTELLUNG EINES QUADRATISCHEN BILDES UND SEINE ANSCHLIEßENDE KOMPRIMIERUNG VON DER WEBSITE www.codenet.ru
// Erstelle ein 90x90-Quadrat
// dest – das resultierende Bild
// w - Bildbreite
// Verhältnis - Proportionalitätskoeffizient
$w = 90; // Quadrat 90x90. Auch in anderen Größen lieferbar.
// Erstellen Sie das Originalbild basierend auf
// Quelldatei und bestimmen Sie deren Größe
$w_src = imagesx($im); //Breite berechnen
$h_src = imagesy($im); // Berechne die Höhe des Bildes
// ein leeres quadratisches Bild erstellen
// Truecolor ist wichtig!, sonst erhalten wir ein 8-Bit-Ergebnis
$dest = imagecreatetruecolor($w,$w);
// Schneiden Sie die quadratische Mitte entlang x aus, wenn das Foto horizontal ist
if ($w_src>$h_src)
imagecopyresampled($dest, $im, 0, 0,
Round((max($w_src,$h_src)-min($w_src,$h_src))/2),
0, $w, $w, min($w_src,$h_src), min($w_src,$h_src));
// die quadratische Oberseite entlang der Y-Achse ausschneiden,
// wenn das Foto vertikal ist (obwohl Sie auch die Mitte verwenden können)
if ($w_src<$h_src)
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w,
min($w_src,$h_src), min($w_src,$h_src));
// Quadratisches Bild wird ohne Beschneidung skaliert
if ($w_src==$h_src)
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src);
$date=time(); //berechne die aktuelle Uhrzeit.
imagejpeg($dest, $path_to_90_directory.$date.".jpg");//Speichern Sie das Bild im JPG-Format im gewünschten Ordner, der Name ist die aktuelle Uhrzeit. Entwickelt, um zu verhindern, dass Avatare denselben Namen haben.
//Warum JPG? Es nimmt sehr wenig Platz ein + die Animation des GIF-Bildes, die den Benutzer ablenkt, wird zerstört. Es ist nicht sehr angenehm, seinen Kommentar zu lesen, wenn man aus dem Augenwinkel eine Bewegung bemerkt.
$avatar = $path_to_90_directory.$date.".jpg";//füge den Pfad zum Avatar in die Variable ein.
$delfull = $path_to_90_directory.$filename;
unlink ($delfull);//das ursprünglich hochgeladene Bild löschen, wir brauchen es nicht mehr. Die Aufgabe bestand darin, eine Miniatur zu bekommen.
}
anders
{
//Bei Nichtübereinstimmung des Formats eine entsprechende Meldung ausgeben
exit("Der Avatar muss im Format vorliegen JPG, GIF oder PNG");
}
//Ende des Ladevorgangs und Zuweisung der Adresse der geladenen Ava an die Variable $avatar
}



// neu hinzugefügt ********************************************** **
// Als nächstes kommt alles aus dem ersten Teil des Artikels, aber Sie müssen eine Änderung an der Datenbankabfrage hinzufügen.
//Mit der Datenbank verbinden
// Überprüfen Sie, ob ein Benutzer mit demselben Login vorhanden ist
$result = mysql_query("SELECT id FROM users WHERE login="$login"",$db);
if (!empty($myrow["id"])) (
exit("Leider ist das von Ihnen eingegebene Login bereits registriert. Bitte geben Sie ein anderes Login ein.");
}
// Wenn dies nicht der Fall ist, dann speichern Sie die Daten
$result2 = mysql_query("INSERT INTO Benutzer (Login,Passwort,Avatar) VALUES("$login","$password","$avatar")");
// Überprüfen Sie, ob Fehler vorliegen
if ($result2=="TRUE")
{
echo „Sie haben sich erfolgreich registriert! Jetzt können Sie die Seite betreten. Startseite“;
}
anders(
echo „Fehler! Sie sind nicht registriert.“;
}
?>

4. Sie müssen eine Tabelle zur gleichen Datenbank hinzufügen. Es werden IP-Adressen gespeichert, die beim Anmelden Fehler gemacht haben. Auf diese Weise können wir den Zugriff auf diejenigen beschränken, die mehr als dreimal hintereinander Fehler gemacht haben, und zwar für etwa 15 Minuten. Ich denke, Programme, die Passwörter auswählen, müssen lange basteln.
Gehen wir zu phpmyadmin und erstellen eine neue Tabelle mit 3 Feldern:


ip – IP-Adresse.
Datum – Datum der erfolglosen Anmeldung des Benutzers mit dieser IP in den letzten 15 Minuten. col – die Anzahl der Fehler in den letzten 15 Minuten für den Benutzer mit dieser IP.
Großartig! Fertig, jetzt ändern wir die Login- und Passwort-Verifizierungsdatei, denn jetzt ist unser Passwort verschlüsselt. Öffnen Sie testreg.php und löschen Sie alles außer dem Entfernen von Leerzeichen aus dem Benutzernamen und Passwort. Als nächstes fügen wir den folgenden Code hinzu:

//zusätzliche Leerzeichen entfernen
$login = trim($login);
$password = trim($password);

// durch ein neues ersetzen********************************************* *******
// Verbindung zur Datenbank herstellen
include("bd.php");// Die Datei bd.php muss sich im selben Ordner wie alle anderen befinden. Ist dies nicht der Fall, ändern Sie einfach den Pfad
// Mini-Check zur Passwortauswahl
$ip=getenv("HTTP_X_FORWARDED_FOR");
if (empty($ip) || $ip=="unknown") ( $ip=getenv("REMOTE_ADDR"); )//ip extrahieren
mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 900");//löschen Sie die IP-Adressen von Benutzern, die nach 15 Minuten einen Fehler beim Anmelden gemacht haben.
$result = mysql_query("SELECT col FROM oshibka WHERE ip="$ip"",$db); // die Anzahl der erfolglosen Anmeldeversuche in den letzten 15 für einen Benutzer mit einer bestimmten IP abrufen
$myrow = mysql_fetch_array($result);
if ($myrow["col"] > 2) (
//Wenn es mehr als zwei Fehler gibt, also drei, dann geben wir eine Meldung aus.
exit("Sie haben Ihren Benutzernamen oder Ihr Passwort dreimal falsch eingegeben. Bitte warten Sie 15 Minuten, bevor Sie es erneut versuchen.");
}
$password = md5($password);//das Passwort verschlüsseln
$password = strrev($password);// Aus Gründen der Zuverlässigkeit Reverse hinzufügen
$password = $password."b3p6f";
//Sie können nach Ihrem Geschmack einige eigene Zeichen hinzufügen, indem Sie beispielsweise „b3p6f“ eingeben. Wenn dieses Passwort auf demselben MD5-Server mit brutaler Gewalt gehackt wird, wird offensichtlich nichts Gutes dabei herauskommen. Aber ich rate Ihnen, andere Zeichen zu setzen, vielleicht am Anfang der Zeile oder in der Mitte.
//In diesem Fall ist es notwendig, die Länge des Passwortfeldes in der Datenbank zu erhöhen. Das verschlüsselte Passwort kann viel größer sein.

$result = mysql_query("SELECT * FROM users WHERE login="$login" AND password="$password"",$db); //Alle Daten über den Benutzer mit dem eingegebenen Benutzernamen und Passwort aus der Datenbank abrufen
$myrow = mysql_fetch_array($result);
if (empty($myrow["id"]))
{
//wenn der Benutzer mit dem eingegebenen Login und Passwort nicht existiert
//Wir machen einen Eintrag, dass sich diese IP nicht anmelden konnte.
$select = mysql_query("SELECT ip FROM oshibka WHERE ip="$ip"");
$tmp = mysql_fetch_row($select);
if ($ip == $tmp) (//Überprüfen Sie, ob der Benutzer in der Tabelle „oshibka“ enthalten ist
$result52 = mysql_query("SELECT col FROM oshibka WHERE ip="$ip"",$db);
$myrow52 = mysql_fetch_array($result52);
$col = $myrow52 + 1;//füge einen weiteren erfolglosen Anmeldeversuch hinzu
mysql_query("UPDATE-Fehler SET col=$col,date=NOW() WHERE ip="$ip"");
}
anders(
mysql_query("INSERT INTO oshibka (ip,date,col) VALUES ("$ip",NOW(),"1")");
//Wenn in den letzten 15 Minuten keine Fehler aufgetreten sind, fügen Sie einen neuen Eintrag in die Tabelle „oshibka“ ein
}

exit("Leider ist der von Ihnen eingegebene Benutzername oder das Passwort falsch.");
}
anders(
nbsp; //Wenn die Passwörter übereinstimmen, starten wir eine Sitzung für den Benutzer! Man kann ihm gratulieren, er ist reingekommen!
$_SESSION["password"]=$myrow["password"];
$_SESSION["login"]=$myrow["login"];
$_SESSION["id"]=$myrow["id"];//Diese Daten werden sehr oft verwendet, sodass der angemeldete Benutzer sie „bei sich trägt“

//Als nächstes speichern wir die Daten in Cookies für den späteren Login.
//AUFMERKSAMKEIT!!! TUN SIE DIES NACH IHREM ERMESSEN, DA DIE DATEN OHNE VERSCHLÜSSELUNG IN COOKIES GESPEICHERT WERDEN
if ($_POST["save"] == 1) (
//Wenn der Nutzer möchte, dass seine Daten für einen späteren Login gespeichert werden, speichern wir diese in seinen Browser-Cookies
setcookie("login", $_POST["login"], time()+9999999);
setcookie("password", $_POST["password"], time()+9999999);
}}
Echo“ ";//wir leiten den Benutzer zur Hauptseite weiter, wo wir ihn über die erfolgreiche Anmeldung informieren
?>

5. Wir werden die Hauptseite komplett ändern. Es ist notwendig, den Avatar des Benutzers darauf anzuzeigen, einen Link zum Abmelden vom Konto anzuzeigen und ein Kontrollkästchen hinzuzufügen, um sich das Passwort beim Anmelden zu merken.
Index.php

// Die gesamte Prozedur funktioniert in Sitzungen. Hier werden die Daten des Benutzers gespeichert, während er sich auf der Website aufhält. Es ist sehr wichtig, sie ganz am Anfang der Seite zu starten!!!
session_start();
include("bd.php");// Die Datei bd.php muss sich im selben Ordner wie alle anderen befinden. Ist dies nicht der Fall, ändern Sie einfach den Pfad
if (!empty($_SESSION["login"]) und !empty($_SESSION["password"]))
{
//Wenn in den Sitzungen ein Login und ein Passwort vorhanden sind, überprüfen Sie diese und rufen Sie den Avatar ab
$login = $_SESSION["login"];
$password = $_SESSION["password"];
$result = mysql_query("SELECT id,avatar FROM users WHERE login="$login" AND password="$password"",$db);
$myrow = mysql_fetch_array($result);
//Extrahieren Sie die erforderlichen Benutzerdaten
}
?>


Hauptseite


Hauptseite

if (!isset($myrow["avatar"]) or $myrow["avatar"]=="") (
//überprüfen, ob Benutzerdaten aus der Datenbank extrahiert wurden. Wenn nicht, ist er nicht angemeldet oder das Passwort in der Sitzung ist falsch. Wir zeigen ein Anmeldefenster an. Aber wir werden es denen, die reinkommen, nicht zeigen, sie brauchen es nicht mehr.
drucken<<


HIER;

If (isset($_COOKIE["login"])) //gibt es eine Variable mit login in COOKIE. Dies sollte der Fall sein, wenn der Benutzer bei der vorherigen Anmeldung auf das Kontrollkästchen „Angemeldet bleiben“ geklickt hat
{
//Wenn ja, dann fügen Sie seinen Wert in das Formular ein. In diesem Fall wird dem Benutzer angezeigt, dass sein Login bereits in der erforderlichen Spalte eingetragen ist
echo " value="".$_COOKIE["login"]."">";
}

drucken<<




HIER;

If (isset($_COOKIE["password"]))//ob es eine Variable mit einem Passwort im COOKIE gibt. Dies sollte der Fall sein, wenn der Benutzer bei der vorherigen Anmeldung auf das Kontrollkästchen „Angemeldet bleiben“ geklickt hat
{
//Wenn ja, dann fügen Sie seinen Wert in das Formular ein. In diesem Fall wird dem Benutzer angezeigt, dass sein Passwort bereits in der erforderlichen Spalte eingetragen ist
echo " value="".$_COOKIE["password"]."">";
}

Drucken<<



Erinnere dich an mich.






Registrieren



Sie sind als Gast angemeldet

HIER;
}
anders
{
//Wenn die Anmeldung erfolgreich ist, wird dem Benutzer alles unten zwischen den Sternchen angezeigt.

drucken<<
Sie sind auf der Site als $_SESSION (Beenden) angemeldet.


Dieser Link ist nur für registrierte Benutzer verfügbar

Dein Avatar:




HIER;

//************************************************************************************
//bei erfolgreicher Anmeldung erhält der Benutzer alles, was OBEN zwischen den Sternchen steht.
}
?>



6. Es ist erforderlich, dass sich angemeldete Benutzer abmelden können. Auf der Hauptseite gab es bereits einen Link zum Verlassen. Diese Datei existiert jedoch noch nicht. Erstellen wir also eine neue Datei Exit.php mit Code:

session_start();
if (empty($_SESSION["login"]) oder empty($_SESSION["password"]))
{
//Wenn es keine Sitzung mit Login und Passwort gibt, dann wurde auf diese Datei von einem nicht angemeldeten Benutzer zugegriffen. Er gehört nicht hierher. Wir geben eine Fehlermeldung aus und stoppen das Skript
Exit („Der Zugriff auf diese Seite ist nur registrierten Benutzern gestattet. Wenn Sie registriert sind, melden Sie sich mit Ihrem Benutzernamen und Passwort auf der Website an
Hauptseite");
}

unset($_SESSION["password"]);
unset($_SESSION["login"]);
unset($_SESSION["id"]);// Variablen in Sitzungen zerstören
Ausfahrt(" ");
// Den Benutzer zur Hauptseite weiterleiten.
?>

OK, jetzt ist alles vorbei! Genießen Sie es für Ihre Gesundheit! Viel Glück!

Ich habe beschlossen, diese Notiz zu schreiben, weil ich es satt habe, bei Fragen und Antworten 100.500 Mal auf dasselbe zu antworten.

Viele unerfahrene Webprogrammierer stehen früher oder später vor der Aufgabe, menschenlesbare Links (HUR) in ihre Website einzubauen. Vor der Implementierung von CNC sahen alle Links wie /myscript.php oder sogar /myfolder/myfolder2/myscript3.php aus, was schwer zu merken ist und noch schlimmer für SEO ist. Nach der Implementierung von CNC haben die Links die Form /statiya-o-php oder sogar in kyrillischer Sprache /article-o-php.

Apropos SEO. Für Menschen lesbare Links wurden WIRKLICH nicht zum einfachen Auswendiglernen erfunden, sondern hauptsächlich, um die Indexierbarkeit der Website zu erhöhen, da die Übereinstimmung der Suchanfrage und eines Teils der URL einen guten Vorteil im Suchranking verschafft.

Die Entwicklung eines unerfahrenen PHP-Programmierers kann in der folgenden Schrittfolge ausgedrückt werden:

  1. Platzieren Sie einfachen PHP-Code in separaten Dateien und greifen Sie über Links wie /myfolder/myscript.php auf diese Dateien zu
  2. Verstehen, dass alle Skripte einen wesentlichen Teil gemeinsam haben (z. B. Herstellen einer Verbindung zur Datenbank, Lesen der Konfiguration, Starten einer Sitzung usw.) und als Konsequenz daraus einen gemeinsamen Start-„Einstiegspunkt“ erstellen, ein Skript, das akzeptiert ALLE Anfragen und wählt dann aus, welches interne Skript verbunden wird. Normalerweise heißt dieses Skript index.php und liegt im Stammverzeichnis, wodurch alle Anfragen (auch URLs genannt) so aussehen: /index.php?com=myaction&com2=mysubaction
  3. Die Notwendigkeit, einen Router zu implementieren und der Übergang zu menschenlesbaren Links.

Ich stelle fest, dass die meisten Programmierer zwischen den Punkten 2 und 3 einen offensichtlichen Fehler machen. Ich würde mich nicht irren, wenn ich dies als den Wert von etwa 95 % der Programmierer bezeichnen würde. Selbst die meisten bekannten Frameworks enthalten diesen Fehler. Und es besteht im Folgenden.

Anstatt eine grundlegend neue Art der Verarbeitung von Links zu implementieren, wird fälschlicherweise das Konzept der „Patches und Weiterleitungen“ auf Basis von .htaccess gemacht, das darin besteht, viele Umleitungsregeln mithilfe von mod_rewrite zu erstellen. Diese Zeilen vergleichen die URL mit einem regulären Ausdruck und schieben bei einer Übereinstimmung die aus der URL extrahierten Werte in GET-Variablen und rufen anschließend dieselbe index.php auf.

#Falsche CNC-Methode RewriteEngine On RewriteRule ^\/users\/(.+)$ index.php?module=users&id=$1 #....Viele weitere ähnliche Regeln...

Dieses Konzept hat viele Nachteile. Einer davon ist die Schwierigkeit, Regeln zu erstellen. Ein großer Prozentsatz menschlicher Fehler beim Hinzufügen von Regeln ist schwer zu erkennen, führt jedoch zu einem 500-Server-Fehler.

Ein weiterer Nachteil besteht darin, dass es häufig auf der Grundlage der Serverkonfiguration bearbeitet wird, was an sich schon Unsinn ist. Und wenn in Apache die Konfiguration mit .htaccess „gepatcht“ werden kann, gibt es im beliebten Nginx keine solche Option, alles befindet sich in einer gemeinsamen Konfigurationsdatei in der Systemzone.

Und ein weiterer, wahrscheinlich wichtigster Nachteil besteht darin, dass es bei diesem Ansatz nicht möglich ist, den Router dynamisch zu konfigurieren, also „on the fly“, die Regeln für die Auswahl des gewünschten Skripts algorithmisch zu ändern und zu erweitern.

Die unten vorgeschlagene Methode beseitigt alle diese Nachteile. Es wird bereits in einer Vielzahl moderner Frameworks verwendet.

Die Quintessenz ist, dass die anfängliche Anfrage immer in der Variablen $_SERVER[‘REQUEST_URI’] gespeichert wird, d. h. sie kann in index.php gelesen und mit PHP als String mit aller Fehlerbehandlung, dynamischen Weiterleitungen usw. geparst werden.

In diesem Fall können Sie in der Konfigurationsdatei nur eine statische Regel erstellen, die alle Anfragen an nicht vorhandene Dateien oder Ordner an index.php umleitet.

RewriteEngine On RewriteCond %(REQUEST_FILENAME) !-f #Wenn die Datei nicht existiert RewriteCond %(REQUEST_FILENAME) !-d #Und wenn der Ordner nicht existiert RewriteRule ^.*$ index.php

Darüber hinaus kann diese Regel sowohl in .htaccess als auch in der Hauptkonfigurationsdatei von Apache platziert werden.

Für Nginx sieht die entsprechende Regel folgendermaßen aus:

Standort / ( if (!-e $request_filename) ( rewrite ^/(.*)$ /index.php last; ) )

Es ist einfach.

Schauen wir uns nun einen Teil des PHP-Codes in index.php an, der Links analysiert und entscheidet, welches Skript ausgeführt werden soll.

/Teil1/Teil2/Teil3

Das erste, was mir in den Sinn kommt, ist, es mit „explosive(‘/‘, $uri) aufzuteilen und einen komplexen Router basierend auf Switch/Case zu erstellen, der jeden Teil der Anfrage analysiert. TU das nicht! Das ist kompliziert und führt dazu, dass der Code furchtbar unverständlich und nicht konfigurierbar aussieht!

Ich schlage einen prägnanteren Weg vor. Es ist besser, es nicht mit Worten zu beschreiben, sondern den Code sofort zu zeigen.

"page404.php", // Seite 404"/" => "mainpage.php", // Hauptseite "/news" => "newspage.php", // News - Seite ohne Parameter "/stories(/+)?" => „storypage.php“, // Mit einem numerischen Parameter // Weitere Regeln); // Router-Code-Klasse uSitemap ( public $title = ""; public $params = null; public $classname = ""; public $data = null; public $request_uri = ""; public $url_info = array(); public $ Found = false; function __construct() ( $this->mapClassName(); ) function mapClassName() ( $this->classname = ""; $this->title = ""; $this->params = null; $ map = &$GLOBALS["sitemap"]; $this->request_uri = parse_url($_SERVER["REQUEST_URI"], PHP_URL_info = parse_url($this->request_uri); ["path"]); $data = false; foreach ($map as $term => $dd) ( $match = array(); $i = preg_match("@^".$term. "$@Uu" , $uri, $match); if ($i > 0) ( // Klassennamen und Haupttitelteil abrufen $m = explosion(",", $dd); $data = array("classname " => isset( $m)?strtolower(trim($m)):"", "title" => isset($m)?trim($m):"", "params" => $match,) ) ) if ($data === false) ( // 404 if (isset($map["_404"])) ( // Standard 404 Seite $dd = $map["_404"]; $m = explosion(", ", $dd); $this->classname = strtolower(trim($m)); $this->title = trim($m); $this->params = array(); ) $this->found = false; ) else ( // Gefunden! $this->classname = $data["classname"]; $this->title = $data["title"]; $this->params = $data["params"]; $ this->found = true; ) return $this->classname; ) ) $sm = new uSitemap(); $routed_file = $sm->classname; // Den Namen der zu verbindenden Datei über require() abrufen require("app/".$routed_file); // Datei verbinden // P.S. In der enthaltenen Datei können Sie Anforderungsparameter // verwenden, die in der Eigenschaft $sm->params gespeichert sind

Auch wenn der Code ziemlich lang ist, ist er logisch einfach. Ich möchte es nicht erklären, ich halte jeden PHP-Code für selbsterklärend, wenn er richtig geschrieben ist. Lernen Sie, Code zu lesen.

Diejenigen, die mehr oder weniger ernsthaft studiert haben PHP wissen, dass es ein sehr nützliches globales Array gibt PHP Was heisst $_SERVER. Und in diesem Artikel möchte ich die gängigsten Schlüssel und ihre Werte in diesem Array analysieren, da deren Kenntnis selbst für einen Anfänger einfach Pflicht ist PHP-Programmierer.

Bevor du anfängst globales Array $_SERVER in PHP, ich gebe dir gleich einen kleinen Hinweis. Es ist eine tolle Funktion integriert PHP, Was heisst phpinfo(). Lassen Sie uns gleich ein Beispiel für seine Verwendung geben:

phpinfo();
?>

Als Ergebnis der Ausführung dieses einfachen Skripts sehen Sie eine riesige Tabelle mit verschiedenen PHP-Interpreter-Einstellungen, einschließlich, am Ende wird es eine Wertetabelle geben globales Array $_SERVER. Es werden alle Schlüssel und alle zugehörigen Werte aufgelistet. Wie kann Ihnen das helfen? Und Tatsache ist: Wenn Sie diesen oder jenen Wert benötigen und vergessen haben, wie der Schlüssel heißt, dann verwenden Sie die Funktion phpinfo() Den Namen können Sie sich immer merken. Im Allgemeinen werden Sie dieses Skript ausführen und mich sofort verstehen.

Kommen wir nun zu den beliebtesten zu den Schlüsseln des $_SERVER-Arrays:

  • HTTP_USER_AGENT- Mit diesem Schlüssel können Sie die Eigenschaften des Kunden herausfinden. In den meisten Fällen ist dies sicherlich der Browser, jedoch nicht immer. Und noch einmal: Wenn es sich um einen Browser handelt, welchen, können Sie in dieser Variable herausfinden.
  • HTTP_REFERER- enthält den absoluten Pfad zu dieser Datei ( PHP-Skript, HTML-Seite), von dem wir zu diesem Skript gewechselt sind. Grob gesagt, woher der Kunde kam.
  • SERVER_ADDR - IP Adresse Server.
  • REMOTE_ADDR - IP Adresse Klient.
  • DOKUMENT ROOT- physischer Pfad zum Stammverzeichnis der Site. Diese Option wird über eingestellt Konfigurationsdatei des Apache-Servers.
  • SCRIPT_FILENAME- physischer Pfad zum aufgerufenen Skript.
  • QUERY_STRING– ein sehr nützlicher Wert, der es Ihnen ermöglicht, mit einer Anfrage eine Zeichenfolge abzurufen und diese Zeichenfolge dann zu analysieren.
  • REQUEST_URI– ein noch nützlicherer Wert, der nicht nur die Anfrage selbst, sondern auch den relativen Pfad zum aufgerufenen Skript vom Stammverzeichnis enthält. Dies wird sehr oft verwendet, um Duplikate zu entfernen index.php, das heißt, wenn wir solche haben URL: "http://mysite.ru/index.php" Und " http://mysite.ru/" führen zu einer Seite und URLs unterschiedlich, daher Duplikate, was sich negativ auf die Suchmaschinenoptimierung auswirkt. Und mit der Hilfe REQUEST_URI wir können bestimmen: mit index.php oder nicht, ob das Skript aufgerufen wurde. Und wir können eine Weiterleitung mit durchführen index.php(falls er dabei war REQUEST_URI) auf ohne index.php. Als Ergebnis beim Senden einer solchen Anfrage: „ http://mysite.ru/index.php?id=5", wir werden eine Weiterleitung haben URL: "http://mysite.ru/?id=5". Das heißt, wir haben die Duplizierung beseitigt, indem wir sie entfernt haben URL Das index.php.
  • SCRIPT_NAME- relativer Pfad zum aufgerufenen Skript.

Vielleicht sind das alle Elemente globales Array $_SERVER in PHP die regelmäßig genutzt werden. Sie müssen sie kennen und bei Bedarf nutzen können.



 


Lesen:



Huawei TalkBand B3 – ein smartes Armband des chinesischen Elektronikriesen Und es gibt Konkurrenten

Huawei TalkBand B3 – ein smartes Armband des chinesischen Elektronikriesen Und es gibt Konkurrenten

Ein einzigartiges Gerät von Huawei erregte unsere besondere Aufmerksamkeit. Das neue Gerät lässt sich nur schwer einem bestimmten Typ zuordnen...

Navigator wiederherstellen So stellen Sie Dateien nach dem Löschen wieder her: Prestige Navigator friert nach dem Flashen ein

Navigator wiederherstellen So stellen Sie Dateien nach dem Löschen wieder her: Prestige Navigator friert nach dem Flashen ein

Die aktuelle Situation auf den Straßen des Landes ist sehr kritisch: weitverbreitete Staus, ständige Verkehrsunfälle und vieles mehr. Wegen...

Rezension der kostenlosen Version von Droid4X

Rezension der kostenlosen Version von Droid4X

Sie haben von Android-Telefonen gehört, aber wussten Sie, dass Sie das gesamte Android-Betriebssystem direkt auf Ihrem Computer installieren können? Vielleicht haben Sie...

Ein paar Worte zum Mining der EXP-Kryptowährung (Expanse)

Ein paar Worte zum Mining der EXP-Kryptowährung (Expanse)

Details Veröffentlicht: 12.02.2016 08:04 Viele Miner sind ständig auf der Suche nach profitablen Kryptowährungen zum Schürfen, Ausgeben...

Feed-Bild RSS