Hvorfor er det farlig å aktivere parameteren PHP register_globals? Opprette et enkelt brukerregistreringssystem i PHP og MySQL Impersonal index php register

Hallo! Nå skal vi prøve å implementere den enkleste registreringen på nettstedet ved å bruke PHP + MySQL. For å gjøre dette må Apache være installert på datamaskinen din. Arbeidsprinsippet til skriptet vårt er vist nedenfor.

1. La oss starte med å lage en brukertabell i databasen. Den vil inneholde brukerdata (pålogging og passord). La oss gå til phpmyadmin (hvis du oppretter en database på PC-en din http://localhost/phpmyadmin/). Vi oppretter en tabell brukere, den vil ha 3 felt.

Jeg lager den i mysql-databasen, du kan lage den i en annen database. Deretter setter du verdiene som i figuren:

2. En tilkobling til denne tabellen er nødvendig. La oss lage en bd.php-fil. Dens innhold:

I mitt tilfelle ser det slik ut:

Lagre bd.php .
Flott! Vi har en tabell i databasen og en kobling til den. Nå kan du begynne å lage en side der brukerne vil legge igjen dataene sine.

3. Lag en reg.php-fil med innholdet (alle kommentarer inne):



Registrering


Registrering


Din pålogging:




Ditt passord:








4. Lag en fil som vil legge inn data i databasen og lagre brukeren. save_user.php (kommentarer inne):

5. Nå kan våre brukere registrere seg! Deretter må du opprette en "dør" for allerede registrerte brukere for å komme inn på nettstedet. index.php (kommentarer inne):




Hjemmeside


Hjemmeside


Din pålogging:


Ditt passord:






Registrere



OK, det er over nå! Leksjonen kan være kjedelig, men veldig nyttig. Bare ideen om registrering vises her, så kan du forbedre den: legg til sikkerhet, design, datafelt, lasting av avatarer, logg ut av kontoen din (for å gjøre dette, ødelegg ganske enkelt variabler fra økten med funksjonen deaktivert) og så videre. Lykke til!

Jeg sjekket alt, det fungerer som det skal!

Reg.ru: domener og hosting

Den største registratoren og vertsleverandøren i Russland.

Mer enn 2 millioner domenenavn i tjeneste.

Markedsføring, domenepost, forretningsløsninger.

Mer enn 700 tusen kunder over hele verden har allerede tatt sitt valg.

* Hold musen over for å pause rullingen.

Tilbake fremover

Opprette et enkelt brukerregistreringssystem i PHP og MySQL

Å lage et registreringssystem er mye arbeid. Du må skrive kode som validerer e-postadresser, sender en e-post som bekrefter registreringen, og som også validerer andre skjemafelt og mye mer.

Og selv etter at du har skrevet alt dette, vil brukere være motvillige til å registrere seg, fordi... dette krever en viss innsats fra deres side.

I denne opplæringen vil vi lage et veldig enkelt registreringssystem som ikke krever eller lagrer passord i det hele tatt! Resultatet vil være enkelt å endre og legge til et eksisterende PHP-nettsted. Vil du finne ut hvordan det fungerer? Les under.



Slik fungerer vårt superenkle system:

Vi kombinerer autorisasjonsskjema og registrering. Dette skjemaet vil ha et felt for å angi e-postadressen din og en registreringsknapp;
- Når du fyller ut feltet med en e-postadresse, vil et klikk på registreringsknappen opprette en post om en ny bruker, men kun hvis den oppgitte e-postadressen ikke ble funnet i databasen.

Etter dette opprettes et tilfeldig unikt sett med tegn (token), som sendes til e-posten spesifisert av brukeren i form av en lenke som vil være relevant i 10 minutter;
– Lenken tar brukeren til nettsiden vår. Systemet bestemmer tilstedeværelsen av et token og autoriserer brukeren;

Fordeler med denne tilnærmingen:

Det er ikke nødvendig å lagre passord eller validere felt;
- Det er ikke nødvendig å gjenopprette passordet ditt, sikkerhetsspørsmål osv.;
- Fra det øyeblikket en bruker registrerer seg/logger inn, kan du alltid være sikker på at denne brukeren vil være i din tilgangssone (at e-postadressen er sann);
- Utrolig enkel registreringsprosess;

Feil:

Brukerkontosikkerhet. Hvis noen har tilgang til brukerens e-post, kan de logge inn.
- E-post er ikke sikker og kan avskjæres. Husk at dette spørsmålet også er relevant i tilfellet der passordet er glemt og må gjenopprettes, eller i ethvert autorisasjonssystem som ikke bruker HTTPS for dataoverføring (pålogging/passord);
- Mens du konfigurerer e-postserveren riktig, er det en sjanse for at meldinger med autorisasjonslenker ender opp i spam;

Ved å sammenligne fordelene og ulempene med systemet vårt, kan vi si at systemet har høy brukervennlighet (maksimal bekvemmelighet for sluttbrukeren) og samtidig har en lav sikkerhetsindikator.

Så det foreslås å bruke det til registreringer på fora og tjenester som ikke fungerer med viktig informasjon.

Hvordan bruke dette systemet

I tilfelle du bare trenger å bruke et system for å autorisere brukere på nettstedet ditt, og du ikke ønsker å ta denne leksjonen i stykker, er dette hva du må gjøre:

Du må laste ned kildene vedlagt leksjonen
- Finn tables.sql-filen i arkivet Importer den til databasen din ved å bruke importalternativet i phpMyAdmin. Alternativ måte: åpne denne filen gjennom et tekstredigeringsprogram, kopier SQL-spørringen og kjør den;
- Åpne include/main.php og fyll inn innstillingene for å koble til databasen din (spesifiser brukeren og passordet for å koble til databasen, samt verten og navnet på databasen). I samme fil må du også spesifisere e-posten, som skal brukes som den opprinnelige adressen for meldinger sendt av systemet. Noen verter blokkerer utgående e-post med mindre skjemaet inneholder en ekte e-postadresse, som ble opprettet fra vertens kontrollpanel, så oppgi en ekte adresse;
- Last opp alle index.php , protected.php filer og eiendeler og inkluderer mapper via FTP til verten din;
- Legg til koden nedenfor på hver PHP-side der du ønsker å vise påloggingsskjemaet;

Require_once "includes/main.php"; $bruker = ny bruker(); if(!$user->loggedIn())( redirect("index.php"); )
- Klar!

For de som er interessert i hvordan det hele fungerer, les videre nedenfor!

Det første trinnet er å skrive HTM-koden for autorisasjonsskjemaet. Denne koden ligger i index.php-filen. Denne filen inneholder også PHP-kode som håndterer skjemadata og andre nyttige påloggingsfunksjoner. Du kan lære mer om dette i delen nedenfor som er dedikert til PHP-kodegjennomgangen.

index.php

Opplæring: Superenkelt registreringssystem med PHP og MySQL Logg inn eller registrer deg

Skriv inn e-postadressen din ovenfor, så sender vi
du en påloggingslenke.

Logg inn/registrer deg

I head-delen (mellom taggene og) inkluderte jeg hovedstilene (de er ikke dekket i denne opplæringen, så du kan se på dem selv. Folder assets/css/style.css). Før den avsluttende taggen inkluderte jeg jQuery-biblioteket og script.js-filen, som vi skal skrive og analysere nedenfor.


JavaScript

jQuery sporer tilstanden til "Registrer/Logg inn"-knappen ved å bruke funksjonen e.preventDefault() og sender AJAX-forespørsler. Avhengig av serverresponsen, viser den en eller annen melding og bestemmer ytterligere handlinger/

assets/js/script.js

$(function())( var form = $("#login-register"); form.on("submit", function(e)( if(form.is(".loading, .loggedIn"))( return false ; ) var email = form.find("input").val(), messageHolder = form.find("span"); e.preventDefault(); $.post(this.action, (e-post: email), function (m)( if(m.error)( form.addClass("error"); messageHolder.text(m.message); ) else( form.removeClass("error").addClass("loggedIn"); messageHolder . text(m.melding); ) )); )); $(document).ajaxStart(function())( form.addClass("laster"); )); $(document).ajaxComplete(function()) ( form. removeClass("laster"); )); ));

ble lagt til i skjemaet for å vise gjeldende status for AJAX-forespørselen (dette ble muliggjort takket være metodene ajaxStart()) Og ajaxComplete(), som du finner mot slutten av filen).

Denne klassen viser en spinnende animert GIF-fil (som for å gi oss et hint om at forespørselen blir behandlet), og fungerer også som et flagg for å forhindre at skjemaet sendes inn igjen (når registreringsknappen allerede er trykket én gang). .loggedIn-klassen er et annet flagg - det er satt når e-posten ble sendt. Dette flagget blokkerer umiddelbart eventuelle ytterligere handlinger med skjemaet.

Databaseskjema

Vårt utrolig enkle loggsystem bruker 2 MySQL-tabeller (SQL-koden er i tables.sql-filen). Den første lagrer data om brukerkontoer. Den andre lagrer informasjon om antall påloggingsforsøk.


Brukertabellskjema.

Systemet bruker ikke passord, som kan ses i diagrammet. På den kan du se token-kolonnen med tokens ved siden av token_validity-kolonnen. Tokenet installeres så snart brukeren kobler seg til systemet og setter sin e-post til å sende en melding (mer om dette i neste blokk). Kolonnen token_validity setter tiden 10 minutter senere, hvoretter tokenet ikke lenger er gyldig.


Tabellskjema som teller antall autorisasjonsforsøk.

I begge tabellene er IP-adressen lagret i behandlet form, ved å bruke ip2long-funksjonen i et felt av typen heltall.

Nå kan vi skrive litt PHP-kode. Hovedfunksjonaliteten til systemet er tildelt klassen User.class.php, som du kan se nedenfor.

Denne klassen bruker aktivt idorm (docs), disse bibliotekene er minimum nødvendige verktøy for å jobbe med databaser. Den håndterer databasetilgang, tokengenerering og tokenvalidering. Det gir et enkelt grensesnitt som gjør det enkelt å koble et registreringssystem til nettstedet ditt hvis det bruker PHP.

User.class.php

Klassebruker( // Privat ORM-tilfelle privat $orm; /** * Finn en bruker etter token. Kun gyldige tokens aksepteres for vurdering. Tokenet genereres kun i 10 minutter fra det øyeblikket det ble opprettet * @param string $token . Dette er den vi leter etter token * @return User Returner verdien til brukerfunksjonen */ public static function findByToken($token)( // finn tokenet i databasen og sørg for at riktig tidsstempel er satt $result = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) returner ny bruker($result); ) /** * Autoriser eller registrer en bruker * @param string $email. Brukers e-postadresse * @return User */ offentlig statisk funksjon loginOrRegister($email)( // Hvis en slik bruker allerede eksisterer, returner verdien av brukerfunksjonen fra den spesifiserte e-postadressen som er lagret i databasen if(User::exists($email))( return new User($email); ) // Ellers oppretter du en ny bruker i databasen og returner verdien til User::create-funksjonen fra den angitte e-posten return User::create($email ); ) /** * Opprett en ny bruker og lagre i databasen * @param string $email. Bruker e-postadresse * @return Bruker */ privat statisk funksjon create($email)( // Skriv en ny bruker og returner resultatet av brukerfunksjonen fra disse verdiene $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); return new User($result); ) /** * Sjekk om en slik bruker finnes i databasen og returner den boolske verdien av variabelen * @param streng $email. Brukers e-postadresse * @return boolean */ offentlig statisk funksjon eksisterer($email)( // Finnes brukeren i databasen? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Opprett et nytt brukerobjekt * @param instans $param ORM , id, email eller 0 * @return User */ public function __construct($param = null) ( if($param instanceof ORM)( // ORM-sjekk bestått $this->orm = $param; ) else if(is_string($param))( // E-postsjekk bestått $this->orm = ORM:: for_table ("reg_users") ->hvor("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // verdien av variabelen $param er sendt til brukeridentifikatoren $id = $param; ) else if(isset($_SESSION["loginid"]))( // Se ellers økt $id = $_SESSION["loginid"]; ) $this->orm = ORM::for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Generer et nytt SHA1-autorisasjonstoken, skriver det til databasen og returnerer verdien * @return string */ public function generateToken( )( // Generer et token for en autorisert bruker og lagre det i databasen $token = sha1($this->email.time().rand(0, 1000000)); // Lagre tokenet i databasen // Og merk det som gyldig kun de neste 10 minuttene $this->orm->set("token", $token); $this->orm->set_expr("token_validity", "ADDTIME(NOW(),"0:10")"); $this->orm->lagre(); returner $token; ) /** * Autoriser brukeren * @return void */ public function login())( // Merk brukeren som pålogget $_SESSION["loginid"] = $this->orm->id; // Oppdater verdien av databasefeltet last_login $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Ødelegg økten og logg ut brukeren * @return void */ offentlig funksjonslogg ut ()( $_SESSION = array(); unset($_SESSION); ) /** * Sjekk om brukeren er pålogget * @return boolean */ public function loggedIn())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Sjekker om brukeren er en administrator * @return boolean */ public function isAdmin())( return $this->rank() = = "administrator"; ) /** * Finn brukertypen, kan enten være administrator eller vanlig * @return string */ public function rank())( if ($this->orm->rang == 1)( return "administrator" "; ) return "vanlig"; ) /** * Metode som lar deg få brukerens private informasjon som * egenskaper for brukerobjektet * @ param string $key Navnet på egenskapen som får tilgang * @return mixed */ public function __get($key)( if(isset($this->orm->$key))( return $this->orm-> $nøkkel; ) returner null; ) )

Tokens genereres ved hjelp av SHA1-algoritmen og lagres i databasen. Jeg bruker MySQLs tidsfunksjoner for å sette en 10-minutters tidsbegrensning for et tokens gyldighet.

Når et token er validert, forteller vi behandleren direkte at vi kun vurderer tokens som ennå ikke har utløpt, lagret i token_validity-kolonnen.

Vær oppmerksom på at jeg bruker den magiske metoden __få docs-biblioteket på slutten av filen for å avskjære tilgang til egenskapene til brukerobjektet.

Takket være dette blir det mulig å få tilgang til informasjon som er lagret i databasen takket være egenskapene $user->email, $user->token osv. I neste kodefragment skal vi se på hvordan man bruker disse klassene som eksempel .


Beskyttet side

En annen fil som lagrer nyttig og nødvendig funksjonalitet er functions.php-filen. Det finnes flere såkalte hjelpere – assistentfunksjoner som lar deg lage renere og mer lesbar kode i andre filer.

funksjoner.php

Funksjon send_email($from, $to, $subject, $message)( // Hjelper som sender e-post $headers = "MIME-versjon: 1.0" . "\r\n"; $headers .= "Innholdstype: tekst /plain; charset=utf-8" . "\r\n"; $headers .= "Fra: ".$fra . "\r\n"; returner e-post($to, $subject, $message, $headers ); ) funksjon get_page_url())( // Bestem URL-en til PHP-filen $url = "http".(empty($_SERVER["HTTPS"])?"":"s")."://" .$_SERVER ["SERVER_NAME"]; if(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")( $url.= $_SERVER["REQUEST_URI"]; ) else( $url. = $_SERVER["PATH_INFO"]; ) returner $url; ) funksjon rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Antall påloggingsforsøk den siste timen til denne IP-adressen $ count_hour = ORM: :for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"1:00 ")") ->count(); // Antall påloggingsforsøk de siste 10 minuttene på denne IP-adressen $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u ", ip2long($ ip))) ->where_raw("ts > SUBTIME(NOW(),"0:10")") ->count(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( throw new Exception("For mange påloggingsforsøk!"); ) ) function rate_limit_tick($ip, $email)( // Opprett en ny post i tabellen som teller antall påloggingsforsøk $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email; $login_attempt->ip = sprintf("%u", ip2long($ip )); $login_attempt->save(); ) function redirect($url)( header("Plassering: $url"); exit; )

Funksjoner rate_limit Og rate_limit_tick overvåke antall autorisasjonsforsøk over den forløpte tidsperioden siden første forsøk. Påloggingsforsøket registreres i databasen i kolonnen reg_login_attempt. Disse funksjonene kalles når skjemadataene behandles og sendes som du kan se fra følgende kodebit.

Koden nedenfor er hentet fra index.php-filen og håndterer skjemainnsendingen. Den returnerer et JSON-svar, som igjen behandles av jQuery i assets/js/script.js-filen som vi så på tidligere.

index.php

Prøv( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Skriv ut en JSON-header("Content-type: application/json"); // Er denne e-postadressen gyldig hvis (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( throw new Exception("Vennligst skriv inn en gyldig e-post."); ) // Sjekk. Er bruker har lov til å logge på, har han overskredet antall tillatte tilkoblinger? (functions.php-fil for mer informasjon) rate_limit($_SERVER["REMOTE_ADDR"]); // Logg dette påloggingsforsøket rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // Send en e-post til brukeren $message = ""; $email = $_POST["email"]; $subject = "Din påloggingslenke"; if(!Bruker:: exists($email) )( $subject = "Takk for at du registrerte deg!"; $message = "Takk for at du registrerte deg på siden vår!\n\n"; ) // Forsøk på å autorisere eller registrere en bruker $user = Bruker ::loginOrRegister($_POST[ "email"]); $message.= "Du kan logge inn fra denne URLen:\n"; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Koblingen vil utløpe automatisk etter 10 minutter."; $result = send_email($fromEmail, $_POST["email"], $subject, $message); if(!$result)( throw new Exception("Det oppsto en feil ved sending av e-post. Vennligst prøv igjen."); ) die(json_encode(array("message" => "Takk! Vi har sendt en lenke til innboksen din. Sjekk søppelpostmappen din også."))); ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage() ))); )

Etter vellykket innlogging/registrering vil koden ovenfor sende brukeren en påloggingslenke. Tokenet blir tilgjengelig pga den sendes som en variabel i den genererte lenken av metoden $_GET med tk markør

index.php

If(isset($_GET["tkn"]))( // Er dette tokenet gyldig for autorisasjon? $user = User::findByToken($_GET["tkn"]); if($user)( // Ja , is. Omdiriger til en beskyttet side $user->login(); redirect("protected.php"); ) // Nei, tokenet er ikke gyldig. Omdiriger til en side med en autorisasjons-/registreringsskjema redirect("index. php ");)

$user->login()

vil opprette de nødvendige variablene for økten, slik at brukeren, som ser på påfølgende sider på nettstedet, vil forbli autorisert til enhver tid.

Behandlingen av funksjonen for å gå ut av systemet er ordnet på lignende måte.

index.php

If(isset($_GET["logout"]))( $user = new User(); if($user->loggedIn())( $user->logout(); ) redirect("index.php") ;)

På slutten av koden satte jeg igjen en omdirigering til index.php, så parameteren ?logg ut=1 overført via URL er ikke nødvendig.

Vår index.php-fil krever ytterligere. beskyttelse - vi ønsker ikke at personer som har logget inn i systemet skal se registreringsskjemaet igjen. Til disse formålene bruker vi metoden $user->loggedIn().

index.php

$bruker = ny bruker(); if($user->loggedIn())( redirect("protected.php"); )

Til slutt, her er et stykke kode som lar deg beskytte sidene på nettstedet ditt og gjøre det tilgjengelig bare etter autorisasjon.

beskyttet.php

// For å beskytte hver side på nettstedet ditt, inkluderer du en main.php-fil // og oppretter et nytt brukerobjekt. Så enkelt er det! require_once "includes/main.php"; $bruker = ny bruker(); if(!$user->loggedIn())( redirect("index.php"); )

Etter denne kontrollen kan du være sikker på at brukeren ble autorisert. Du kan også få tilgang til lagret informasjon i databasen ved hjelp av objektegenskaper $bruker. For å vise brukerens e-post og status, bruk denne koden:

Ekko "Din e-post: ".$user->email; echo "Din rangering: ".$user->rang();

Metode rang() brukes her fordi databasen vanligvis lagrer tall (0 for en vanlig bruker, 1 for en administrator) og vi må konvertere disse dataene til statusene de tilhører, noe denne metoden hjelper oss med.

For å gjøre en vanlig bruker til administrator, rediger ganske enkelt brukeroppføringen gjennom phpMyAdmin (eller et annet program som lar deg administrere databaser). Administratorstatusen gir ingen privilegier; i dette eksemplet vil siden vise at du er administrator - og det er det.

Men hva du skal gjøre med dette er overlatt til ditt skjønn; du kan skrive og komponere kode selv som setter visse privilegier og muligheter for administratorer.

Vi er ferdige!

Vi er ferdige med denne utrolig superenkle formen! Du kan bruke det på PHP-sidene dine, det er ganske enkelt. Du kan også endre det selv og gjøre det slik du vil.

Materialet er utarbeidet av Denis Malyshok spesielt for nettstedet

P.S. Vil du komme videre i å mestre PHP og OOP? Vær oppmerksom på førsteklasses leksjoner om ulike aspekter av nettstedbygging, inkludert programmering i PHP, samt et gratis kurs om å lage ditt eget CMS-system i PHP fra bunnen av ved hjelp av OOP:

Likte du materialet og vil takke meg?
Bare del med dine venner og kolleger!


På grunn av det faktum at det svært ofte oppstår spørsmål om globale variabler og problemer knyttet til deaktivering av register_globals-direktivet, vil vi prøve å dekke dette emnet litt i denne artikkelen.

La oss først definere hva eksterne variabler er. Dette er eventuelle variabler som kommer inn i programmet utenfra, dvs. er ikke definert i selve programmet. For et php-skript er alle variabler som sendes gjennom nettleserlinjen eller gjennom skjemaet eksterne.
La oss se på hvordan de er skapt.

Hvis register_globals = On-direktivet er aktivert på serveren (i php.ini), vil de automatisk opprettes når variabler sendes gjennom et skjema eller gjennom en nettleserlinje, i skriptet som disse variablene er ment for. De. hvis du har skrevet følgende i nettleserlinjen: www.server.ru/index.php?var=1, vil $var-variabelen med en verdi lik 1 automatisk bli opprettet i index.php-skriptet.

Kommentar

Dette direktivet er et av de mest kontroversielle punktene i PHP-språket. På den ene siden kan bruken faktisk gi opphav til reelle problemer med beskyttelsen av PHP-skript, hvis mulige feilsituasjoner ikke tas riktig hensyn til, og mange utviklere bemerker med rette at å skrive skript uten å bruke globale variabler reduserer sårbarheten til skript for ulike typer angrep med 90 %. På den annen side, ved begynnelsen av PHP, stolte mer enn tusen brukere på språkutviklerne (inntil PHP 4.3 ble dette direktivet aktivert som standard), på grunn av dette er det for tiden millioner av faktisk fungerende skript skrevet ved hjelp av globale variabler (Det er verdt å merke seg at for pedagogiske formål er det noen ganger helt verdt å skrive skript ved hjelp av globale variabler, siden å erstatte dem med superglobale arrays i stor grad svekker lesbarheten til koden).

For øyeblikket har de fleste vertsleverandører dette direktivet aktivert og vil sannsynligvis forbli aktivert i lang tid fremover, da det ellers kan bryte kodekontinuiteten.

Når register_globals-direktivet er deaktivert, er tilgang til slike variabler mulig på to måter:

  • via assosiative arrays HTTP_***_VARS (HTTP_POST_VARS, etc.)
  • gjennom superglobale arrays ($_ENV, $_GET, $_POST, $_SERVER, $_COOKIE, $_FILES, etc.)

Superglobale arrays er tilgjengelige i ethvert omfang. PHP-utviklere anbefaler å deaktivere register_globals-direktivet på serveren og arbeide med variabler gjennom superglobale arrays. Denne anbefalingen skyldes sikkerhetsproblemer som kan oppstå når register_globals-direktivet er aktivert.

Selv om register_globals-direktivet inntil nylig forble aktivert på vertssider. Situasjonen begynte å endre seg med utgivelsen av PHP 5, der dette direktivet er deaktivert som standard og hostere ikke har hastverk med å aktivere det (kanskje med rette).

Så, hva bør du gjøre for å få variabler? Du må ta dem fra superglobale matriser. For å få variabler sendt gjennom nettleserlinjen, bruk for eksempel $_GET-matrisen. La oss si at nettleserlinjen sier www.server.ru/index.php?var=1. Så for å få var-variabelen i index.php må du skrive:

$var=$_GET["var"];

Og for for eksempel å motta variabler overført fra et skjema ved hjelp av POST-metoden, må du skrive i skjemabehandlerskriptet:

$var=$_POST["var"];

I denne artikkelen lærer du hvordan du oppretter et registrerings- og påloggingsskjema ved hjelp av HTML, JavaScript, PHP og MySql. Slike skjemaer brukes på nesten alle nettsider, uansett type. De er laget for et forum, en nettbutikk, sosiale nettverk (som Facebook, Twitter, Odnoklassniki) og mange andre typer nettsteder.

Hvis du har et nettsted på din lokale datamaskin, håper jeg at du allerede har en lokal server installert og kjører. Uten det vil ingenting fungere.

Opprette en tabell i databasen

For å implementere brukerregistrering trenger vi først og fremst en database. Hvis du allerede har det, så flott, ellers må du lage det. I artikkelen forklarer jeg i detalj hvordan du gjør dette.

Og så, vi har en database (forkortet som DB), nå må vi lage en tabell brukere der vi vil legge til våre registrerte brukere.

Jeg forklarte også hvordan du lager en tabell i en database i artikkelen. Før vi lager en tabell, må vi bestemme hvilke felt den skal inneholde. Disse feltene vil samsvare med feltene fra registreringsskjemaet.

Så tenkte vi, forestilte oss hvilke felt skjemaet vårt ville ha og laget en tabell brukere med disse feltene:

  • id- Identifikator. Felt id Hver tabell i databasen bør ha det.
  • fornavn- For å lagre navnet.
  • etternavn- For å bevare etternavnet.
  • e-post- For å lagre postadressen. Vi vil bruke e-post som innlogging, så dette feltet må være unikt, det vil si ha UNIK indeks.
  • email_status- Felt for å angi om e-posten er bekreftet eller ikke. Hvis e-posten er bekreftet, vil den ha en verdi på 1, ellers er verdien 0.
  • passord- For å lagre passordet.


Hvis du vil at registreringsskjemaet ditt skal ha noen andre felt, kan du også legge dem til her.

Det er det, bordet vårt brukere klar. La oss gå videre til neste trinn.

Databasetilkobling

Vi har opprettet databasen, nå må vi koble til den. Vi kobler til ved hjelp av PHP-utvidelsen MySQLi.

Lag en fil med navnet i mappen på nettstedet vårt dbconnect.php, og skriv følgende skript i den:

Denne filen dbconnect.php må kobles til skjemabehandlere.

Legg merke til variabelen $address_site, her indikerte jeg navnet på testsiden min som jeg skal jobbe med. Vennligst oppgi navnet på nettstedet ditt.

Nettstedets struktur

La oss nå se på HTML-strukturen til nettstedet vårt.

Vi vil flytte topp- og bunnteksten til nettstedet til separate filer, header.php Og bunntekst.php. Vi vil inkludere dem på alle sider. Nemlig på hovedsiden (fil index.php), til siden med registreringsskjemaet (fil form_register.php) og til siden med autorisasjonsskjemaet (fil form_auth.php).

Blokkér med lenkene våre, registrering Og autorisasjon, legg dem til i sideoverskriften slik at de vises på alle sider. En lenke kommer inn til siden med registreringsskjemaet (fil form_register.php) og den andre til siden med autorisasjonsskjemaet (fil form_auth.php).

Innhold i header.php-filen:

Navnet på nettstedet vårt

Som et resultat ser hovedsiden vår slik ut:


Selvfølgelig kan nettstedet ditt ha en helt annen struktur, men dette er ikke viktig for oss nå. Hovedsaken er at det er lenker (knapper) for registrering og autorisasjon.

La oss nå gå videre til registreringsskjemaet. Som du allerede forstår, har vi den på fil form_register.php.

Gå til databasen (i phpMyAdmin), åpne tabellstrukturen brukere og se på hvilke felt vi trenger. Det betyr at vi trenger felt for å legge inn for- og etternavn, et felt for å legge inn postadresse (E-post) og et felt for å skrive inn passord. Og av sikkerhetshensyn vil vi legge til et felt for å legge inn en captcha.

På serveren, som et resultat av behandling av registreringsskjemaet, kan det oppstå ulike feil på grunn av at brukeren ikke vil kunne registrere seg. Derfor, for at brukeren skal forstå hvorfor registreringen mislykkes, er det nødvendig å vise meldinger om disse feilene.

Før du viser skjemaet, legg til en blokk for å vise feilmeldinger fra økten.

Og en ting til, hvis brukeren allerede er autorisert, og av nysgjerrighet går han direkte til registreringssiden ved å skrive i adressefeltet til nettleseren site_address/form_register.php, så i dette tilfellet, i stedet for registreringsskjemaet, vil vi vise en overskrift som sier at han allerede er registrert.

Generelt, filkoden form_register.php vi fikk dette:

Du er allerede registrert

I nettleseren ser siden med registreringsskjemaet slik ut:


Ved å bruke det nødvendige attributtet gjorde vi alle felt obligatoriske.

Vær oppmerksom på koden til registreringsskjemaet der captchaen vises:


Vi spesifiserte banen til filen i verdien av src-attributtet for bildet captcha.php, som genererer denne captchaen.

La oss se på filkoden captcha.php:

Koden er godt kommentert, så jeg vil fokusere på bare ett punkt.

Inne i en funksjon imageTtfText(), er banen til fonten spesifisert verdana.ttf. Så for at captchaen skal fungere riktig, må vi opprette en mappe fonter, og plasser fontfilen der verdana.ttf. Du kan finne den og laste den ned fra Internett, eller ta den fra arkivet med materialene i denne artikkelen.

Vi er ferdige med HTML-strukturen, det er på tide å gå videre.

Sjekker e-postens gyldighet ved hjelp av jQuery

Ethvert skjema må kontrollere gyldigheten av de angitte dataene, både på klientsiden (ved hjelp av JavaScript, jQuery) og på serversiden.

Vi må være spesielt oppmerksomme på E-post-feltet. Det er svært viktig at oppgitt postadresse er gyldig.

For dette inndatafeltet setter vi e-posttypen (type="email"), dette advarer oss litt mot feil formater. Men dette er ikke nok, for gjennom kodeinspektøren som nettleseren gir oss, kan vi enkelt endre attributtverdien type Med e-posttekst, og det er det, sjekken vår vil ikke lenger være gyldig.


Og i dette tilfellet må vi gjøre en mer pålitelig sjekk. For å gjøre dette bruker vi jQuery-biblioteket fra JavaScript.

For å koble til jQuery-biblioteket, i filen header.php mellom tagger , før den avsluttende taggen , legg til denne linjen:

Umiddelbart etter denne linjen vil vi legge til e-postvalideringskoden. Her vil vi legge til en kode for å sjekke lengden på det angitte passordet. Lengden må være minst 6 tegn.

Ved å bruke dette skriptet sjekker vi den angitte e-postadressen for gyldighet. Hvis brukeren skrev inn feil e-post, viser vi en feilmelding om dette og deaktiverer innsendingsknappen for skjema. Hvis alt er i orden, fjerner vi feilen og aktiverer innsendingsknappen for skjema.

Og så er vi ferdige med skjemavalidering på klientsiden. Nå kan vi sende det til serveren, hvor vi også vil gjøre et par kontroller og legge til data i databasen.

Bruker registrering

Vi sender skjemaet til filen for behandling register.php, via POST-metoden. Navnet på denne behandlerfilen er spesifisert i attributtverdien handling. Og sendemetoden er spesifisert i attributtverdien metode.

Åpne denne filen register.php og det første vi må gjøre er å skrive en øktstartfunksjon og koble til filen vi opprettet tidligere dbconnect.php(I denne filen har vi laget en kobling til databasen). Og la oss også umiddelbart erklære cellene feilmeldinger Og suksessmeldinger i den globale sesjonsmatrisen. I feilmeldinger vi vil registrere alle feilmeldinger som oppstår under skjemabehandling, og i suksessmeldinger, vil vi spille inn glade meldinger.

Før vi fortsetter, må vi sjekke om skjemaet i det hele tatt ble sendt inn. En angriper kan se på attributtverdien handling fra skjemaet, og finn ut hvilken fil som behandler dette skjemaet. Og han kan ha ideen om å gå direkte til denne filen ved å skrive inn følgende adresse i nettleserens adresselinje: http://site_address/register.php

Så vi må se etter en celle i den globale POST-arrayen hvis navn samsvarer med navnet på "Registrer"-knappen vår fra skjemaet. På denne måten sjekker vi om "Registrer"-knappen ble trykket eller ikke.

Hvis en angriper prøver å gå direkte til denne filen, vil de motta en feilmelding. La meg minne deg på at $address_site-variabelen inneholder navnet på nettstedet og det ble deklarert i filen dbconnect.php.

Captcha-verdien i økten ble lagt til da den ble generert, i filen captcha.php. Som en påminnelse vil jeg vise deg denne kodebiten fra filen igjen captcha.php, hvor captcha-verdien legges til økten:

La oss nå gå videre til selve bekreftelsen. I fil register.php, inne i if-blokken, der vi sjekker om "Registrer"-knappen ble klikket, eller snarere hvor kommentaren " er indikert" // (1) Plass for neste kodebit"vi skriver:

//Sjekk den mottatte captchaen //Trim mellomrommene fra begynnelsen og slutten av linjen $captcha = trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //Sammenlign den mottatte verdien med verdien fra økten. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // Hvis captchaen ikke er riktig, så returnerer vi brukeren til registreringssiden, og der vil vi vise en feilmelding til ham om at han skrev inn feil captcha . $error_message = "

Feil! Du skrev inn feil captcha

"; // Lagre feilmeldingen til økten. $_SESSION["error_messages"] = $error_message; // Returner brukeren til registreringssidens header("HTTP/1.1 301 flyttet permanent"); header("Plassering: " .$address_site ."/form_register.php"); //Stopp skriptet exit(); ) // (2) Plasser for neste kodebit )else( //Hvis captchaen ikke er bestått eller den er tom, avslutter du ("

Feil! Det er ingen bekreftelseskode, det vil si en captcha-kode. Du kan gå til hovedsiden.

"); }

Deretter må vi behandle de mottatte dataene fra POST-arrayet. Først av alt må vi sjekke innholdet i den globale POST-matrisen, det vil si om det er celler der hvis navn tilsvarer navnene på inndatafeltene fra skjemaet vårt.

Hvis cellen eksisterer, trimmer vi mellomrommene fra begynnelsen og slutten av linjen fra denne cellen, ellers omdirigerer vi brukeren tilbake til siden med registreringsskjemaet.

Deretter, etter at vi har trimmet mellomrommene, legger vi til linjen i variabelen og sjekker denne variabelen for tomhet; hvis den ikke er tom, går vi videre, ellers omdirigerer vi brukeren tilbake til siden med registreringsskjemaet.

Lim inn denne koden på den angitte plasseringen" // (2) Plass for neste kodebit".

/* Sjekk om det er data sendt fra skjemaet i den globale matrisen $_POST og pakk inn de innsendte dataene i vanlige variabler.*/ if(isset($_POST["first_name"]))( //Trim mellomrommene fra begynnelsen og slutten av strengen $first_name = trim($_POST["first_name"]); //Sjekk variabelen for tomhet if(!empty($first_name))( // For sikkerhets skyld, konverter spesialtegn til HTML-entiteter $first_name = htmlspecialchars($first_name, ENT_QUOTES) ; )else( // Lagre feilmeldingen i økten. $_SESSION["error_messages"] .= "

Skriv inn navnet ditt

Navnefelt mangler

"; //Retur brukeren til registreringssidens header("HTTP/1.1 301 flyttet permanent"); header("Plassering: ".$address_site."/form_register.php"); //Stopp scriptet exit(); ) if( isset($_POST["last_name"]))( //Trim mellomrom fra begynnelsen og slutten av linjen $last_name = trim($_POST["last_name"]); if(!empty($last_name)) ( // For sikkerhets skyld, konverter spesialtegn til HTML-enheter $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // Lagre feilmeldingen i økten. $_SESSION["error_messages"] .= "

Vennligst fyll inn ditt etternavn

"; //Retur brukeren til registreringssidens header("HTTP/1.1 301 flyttet permanent"); header("Plassering: ".$address_site."/form_register.php"); //Stopp scriptet exit(); ) )else ( // Lagre feilmeldingen i økten. $_SESSION["error_messages"] .= "

Etternavnsfelt mangler

"; //Retur brukeren til registreringssidens header("HTTP/1.1 301 flyttet permanent"); header("Plassering: ".$address_site."/form_register.php"); //Stopp scriptet exit(); ) if( isset($_POST["email"]))( //Trim mellomrom fra begynnelsen og slutten av linjen $email = trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) Kodeplassering for å sjekke formatet til e-postadressen og dens unikhet )else( // Lagre feilmeldingen i økten. $_SESSION["error_messages"] .= "

Skriv inn din email

"; //Retur brukeren til registreringssidens header("HTTP/1.1 301 flyttet permanent"); header("Plassering: ".$address_site."/form_register.php"); //Stopp scriptet exit(); ) )else ( // Lagre feilmeldingen i økten. $_SESSION["error_messages"] .= "

"; //Retur brukeren til registreringssidens header("HTTP/1.1 301 flyttet permanent"); header("Plassering: ".$address_site."/form_register.php"); //Stopp scriptet exit(); ) if( isset($_POST["passord"]))( //Trim mellomrom fra begynnelsen og slutten av strengen $password = trim($_POST["passord"]); if(!empty($password)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //Krypter passordet $password = md5($password."top_secret"); )else( // Lagre feilmeldingen i økten. $_SESSION["error_messages"] .= "

Skriv inn passordet ditt

"; //Retur brukeren til registreringssidens header("HTTP/1.1 301 flyttet permanent"); header("Plassering: ".$address_site."/form_register.php"); //Stopp scriptet exit(); ) )else ( // Lagre feilmeldingen i økten. $_SESSION["error_messages"] .= "

"; //Retur brukeren til registreringssidens header("HTTP/1.1 301 flyttet permanent"); header("Plassering: ".$address_site."/form_register.php"); //Stopp scriptet exit(); ) // (4) Sted for koden for å legge til en bruker i databasen

Særlig viktig er feltet e-post. Vi må sjekke formatet på den mottatte postadressen og dens unikhet i databasen. Det vil si, er det noen bruker med samme e-postadresse som allerede er registrert?

På det angitte stedet" // (3) Kodeplassering for å sjekke formatet til postadressen og dens unikhet" legg til følgende kode:

//Sjekk formatet til den mottatte e-postadressen ved å bruke et regulært uttrykk $reg_email = "/^**@(+(*+)*\.)++/i"; //Hvis formatet på den mottatte e-postadressen ikke samsvarer med det regulære uttrykket if(!preg_match($reg_email, $email))( // Lagre feilmeldingen i økten. $_SESSION["error_messages"] .= "

Du skrev inn feil e-post

"; //Retur brukeren til registreringssidens header("HTTP/1.1 301 flyttet permanent"); header("Plassering: ".$address_site."/form_register.php"); //Stopp scriptet exit(); ) // Vi sjekker om en slik adresse allerede er i databasen. $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email."""); / /Hvis antall mottatte er det nøyaktig én rad, noe som betyr at brukeren med denne e-postadressen allerede er registrert if($result_query->num_rows == 1)( //Hvis resultatet ikke er usant if(($row = $result_query->fetch_assoc()) != false) ( // Lagre feilmeldingen i økten. $_SESSION["error_messages"] .= "

En bruker med denne e-postadressen er allerede registrert

"; //Retur brukeren til registreringssideoverskriften("HTTP/1.1 301 flyttet permanent"); header("Plassering: ".$address_site."/form_register.php"); )else( // Lagre feilmeldingen til økten . $_SESSION["error_messages"] .= "

Feil i databasespørring

"; //Retur brukeren til registreringssideoverskriften("HTTP/1.1 301 flyttet permanent"); header("Sted: ".$address_site."/form_register.php"); ) /* lukker utvalget */ $ result_query-> close(); //Stopp skriptet exit(); ) /* lukker utvalget */ $result_query->close();

Og så, vi er ferdige med alle sjekkene, det er på tide å legge brukeren til databasen. På det angitte stedet" // (4) Sted for koden for å legge til en bruker i databasen" legg til følgende kode:

//Spørring om å legge til en bruker i databasen $result_query_insert = $mysqli->query("INSERT INTO `brukere` (fornavn, etternavn, e-post, passord) VERDIER ("".$fornavn."", "".$last_name ." ", "".$email.", "".$passord."")"); if(!$result_query_insert)( // Lagre feilmeldingen i økten. $_SESSION["error_messages"] .= "

Feil ved forespørsel om å legge til bruker i databasen

"; //Retur brukeren til registreringssidens header("HTTP/1.1 301 flyttet permanent"); header("Plassering: ".$address_site."/form_register.php"); //Stopp scriptet exit(); )else( $_SESSION["success_messages"] = "

Registreringen fullført!!!
Nå kan du logge inn med brukernavn og passord.

"; //Send brukeren til autorisasjonssidens header("HTTP/1.1 301 flyttet permanent"); header("Sted: ".$address_site."/form_auth.php"); ) /* Fullfører forespørselen */ $ result_query_insert-> close(); //Lukk forbindelsen til databasen $mysqli->close();

Hvis det oppstod en feil i forespørselen om å legge til en bruker i databasen, legger vi til en melding om denne feilen i økten og returnerer brukeren til registreringssiden.

Ellers, hvis alt gikk bra, legger vi også til en melding til økten, men denne gangen er det mer behagelig, nemlig vi forteller brukeren at registreringen var vellykket. Og vi omdirigerer den til siden med autorisasjonsskjemaet.

Skriptet for å sjekke e-postadresseformatet og passordlengden er i filen header.php, så det vil også gjelde for felt fra dette skjemaet.

Økten startes også i filen header.php, så i filen form_auth.php Det er ikke nødvendig å starte en økt, fordi vi får en feilmelding.


Som jeg allerede har sagt, fungerer skriptet for å sjekke e-postadresseformatet og passordlengden også her. Derfor, hvis brukeren oppgir feil e-postadresse eller kort passord, vil han umiddelbart motta en feilmelding. En knapp å komme inn vil bli inaktiv.

Etter å ha rettet feilene, knappen å komme inn blir aktiv, og brukeren vil kunne sende inn skjemaet til serveren, hvor det vil bli behandlet.

Brukerautorisasjon

Å tilskrive verdi handling autorisasjonshandikapet har en fil spesifisert auth.php, betyr dette at skjemaet vil bli behandlet i denne filen.

Og så åpne filen auth.php og skriv kode for å behandle autorisasjonsskjemaet. Det første du må gjøre er å starte en økt og koble til filen dbconnect.php for å koble til databasen.

Når du klikker på exit-lenken fra siden, blir vi tatt til en fil logout.php, hvor vi rett og slett ødelegger cellene med e-postadressen og passordet fra økten. Etter dette returnerer vi brukeren tilbake til siden der lenken ble klikket exit.

Filkode logout.php:

Det er alt. Nå vet du hvordan du implementerer og behandler brukerregistrerings- og autorisasjonsskjemaer på nettstedet ditt. Disse skjemaene finnes på nesten alle nettsteder, så enhver programmerer bør vite hvordan de lager dem.

Vi lærte også hvordan man validerer inndata, både på klientsiden (i nettleseren, ved hjelp av JavaScript, jQuery) og på serversiden (ved hjelp av PHP). Vi lærte også hvordan vi implementerer en prosedyre for å forlate nettstedet.

Alle skript er testet og fungerer. Du kan laste ned arkivet med filene til denne lille siden fra denne lenken.

I fremtiden vil jeg skrive en artikkel hvor jeg skal beskrive. Og jeg planlegger også å skrive en artikkel der jeg skal forklare (uten å laste inn siden på nytt). Så, for å holde deg informert om utgivelsen av nye artikler, kan du abonnere på nettstedet mitt.

Hvis du har spørsmål, vennligst kontakt meg, og hvis du oppdager feil i artikkelen, vennligst gi meg beskjed.

Leksjonsplan (del 5):

  • Opprette en HTML-struktur for autorisasjonsskjemaet
  • Vi behandler de mottatte dataene
  • Vi viser brukerens hilsen i sideoverskriften
  • Likte du artikkelen?

    Jeg vet ikke hvorfor ... nei, jeg vet hvorfor du ikke kan aktivere register_globals-direktivet, men jeg vet ikke hvorfor det i litteraturen som regel ikke er sagt noe om dette.

    I denne artikkelen vil jeg prøve å få alle de som sitter i den ut av tanken og forklare hva som er hva (spesielt for de på pansertoget - red.anm.). Det er ikke for ingenting at noen hostere deaktiverer dette direktivet. Så…

    Hvordan det fungerer

    I PHP-innstillingene (php.ini-filen) er det et slikt register_globals-direktiv. Betydningen er at hvis den er aktivert (register_globals = på), vil alle variabler som sendes via GET og POST automatisk bli registrert som globale. Hva betyr det?

    For eksempel sender vi GET-metoden til index.php-skriptet en sideverdi: index.php?page=2. Den beståtte verdien er lagret i en GET-matrise og kan brukes i et skript som $_GET["side"]. Imidlertid, hvis vi har register_globals aktivert, vil en $page-variabel bli opprettet for den beståtte verdien, som er tilgjengelig i alle deler av index.php-skriptet.

    En liten oppsummering og tillegg. Når register_globals er aktivert, opprettes tre kopier av variabelen: i GET-matrisen, i GLOBALS-matrisen, og ganske enkelt selve variabelen ($_GET["page"], $GLOBALS["page"], $page), mens når register_globals er deaktivert, kan den beståtte verdien bare være tilgjengelig gjennom GET-matrisen ($_GET["side"]). Huske.

    Fare for bruk

    La oss se på et enkelt eksempel for å forstå hva som er i vente for oss (fra 3 til 5 år - redaktørens notat). For å gjøre det enklere, vil jeg si med en gang at $login og $password er variabler som sendes av GET/POST-metoden.

    Kort om hva scriptet gjør:

      Linje 2. Vi sender en forespørsel til databasen for å hente ut det virkelige passordet for innloggingen som er lagt inn av brukeren.

      Linje 3. Vi får dette passordet og tildeler det til $real_pass-variabelen.

      Linje 4. Vi sammenligner det virkelige og det angitte passordet, og hvis de samsvarer, vil $check-variabelen bli tildelt true.

      Linje 5-8. Hvis $check er sant, skriver vi at autorisasjonen var vellykket osv.

    Det foreslåtte scenariet er per definisjon det mest lekke i verden, og nå skal jeg vise deg disse hullene. Tilstand: register_globals er aktivert.

    La oss si at overføringen utføres ved hjelp av GET-metoden. Da vil url-en se omtrent slik ut:
    www.site.com/index.php?login =admin&passord =qwerty
    Det er tydelig at de globale variablene $login og $password opprettes umiddelbart. Se nå på manuset. Den inneholder $check-variabelen. Hva om du sender den via URL?

    www.site.com/index.php?login =admin&passord =qwerty&sjekk =1
    Deretter omgås passordtilpasningskontrollen og brukeren blir umiddelbart autorisert (tross alt, husker du at 1 er sant, og 0 er usant?). Det samme resultatet vil oppstå hvis vi skriver www.nettstedet.no/indeks.php?Sjekk =1 . Og selv om du bruker POST-metoden, vil all slik svindel fortsatt fungere, siden når register_globals er aktivert, spiller det ingen rolle hvilken metode du bruker - GET eller POST.

    Jeg tror noen har et spørsmål, hvordan vet en cracker om sjekkevariabelen, at den er ansvarlig for alt? Hvis du ikke har vist manuset til noen, vet de neppe det. Det er imidlertid ikke alle som bruker egne scripts, CMS osv., men bruker det som er tilgjengelig på nettverket. I slike tilfeller kan en cracker for eksempel studere CMS-koden og angripe nettsteder som er opprettet med dens hjelp.

    Imidlertid deaktiverer ikke alle hostere register_globals, og selv om skriptene dine er designet for å ikke ha register_globals aktivert, kan en cracker fortsatt hacke skriptet ditt ved å bruke sårbarheten til dette direktivet.

    La oss ta vårt eksempel. For å beskytte den i tilfelle register_globals er aktivert, etter linjen hvis ($passord==$ekte_pass)$sjekk =ekte; legg til følgende: annet$sjekk =falsk;. I dette tilfellet, selv om kontrollvariabelen som er lik én, sendes av GET-metoden, vil skriptet fortsatt sette $check=false hvis passordet er feil.

    Ja, jeg vil også gjøre deg oppmerksom på at hvis du slår av register_globals, vil ikke vårt eksempel fungere. Og for at det skal fungere, må du skrive $login = $_POST["login"]; $password = $_POST["passord"];

    La oss oppsummere det...

    og trekke to hovedkonklusjoner:

    1) Når register_globals er aktivert, kan du sende forskjellige variabler, verdiene som ikke ble beregnet til å mottas via GET eller POST.

    2) Register_globals i seg selv er ikke så farlig som et skjevt skrevet manus.

    Det var alt for i dag! Jeg vil bli veldig glad for å se dine kommentarer, kommentarer, forslag og bare tilbakemeldinger. Skriv derfor, ikke vær sjenert!

    Med ønsker om en vellykket uke,
    Alexander SHUYSKY