Hoe een veilig sessiebeheersysteem in PHP en MySQL te creëren
In deze handleiding wordt uitgelegd hoe u sessies veilig in een mySQL-database kunt opslaan. Je leert ook alle gegevens van de sessie die naar de database gaat versleutelen, dat wil zeggen dat als iemand erin slaagt om de database te hacken, alle gegevens van de sessies worden geleverd met een 256-bits AES-codering.
stappen
Methode 1
Configureer de mySQL-database1
Maak een MySQL-database.
In deze gids zullen we een database maken met de naam sesiones_seguras.
Zie hoe een database wordt aangemaakt in phpMyAdmin.
Of u kunt de onderstaande SQL-code gebruiken om er een te maken.
Maak de databasecode:
In deze gids zullen we een database maken met de naam sesiones_seguras.
Zie hoe een database wordt aangemaakt in phpMyAdmin.
Of u kunt de onderstaande SQL-code gebruiken om er een te maken.
Maak de databasecode:
CREËER DATABASE `secure_sessions` -
Opmerking: sommige hostingservices staan u niet toe om een database te maken met phpMyAdmin, leer het te doen in cPanel.
2
Maak een gebruiker aan die alleen rechten heeft voor SELECT, INSERT en DELETE.
Dus als er een inbreuk is op de beveiliging van ons script, kan de hacker geen tabellen uit de database verwijderen. Als je echt paranoïde bent, maak dan voor elke functie een andere gebruiker.
Dus als er een inbreuk is op de beveiliging van ons script, kan de hacker geen tabellen uit de database verwijderen. Als je echt paranoïde bent, maak dan voor elke functie een andere gebruiker.
Maak de gebruikerscode aan:
CREATE USER `sec_user` @ `localhost` identified by `eKcGZr59zAa2BEWU`-GRANT SELECT, INSERT, UPDATE, DELETE ON `sesiones_seguras`. * TO` sec_user `@` localhost`-
Opmerking: het is een goed idee om het wachtwoord van de bovenstaande code te wijzigen wanneer u het op uw eigen server uitvoert (zorg ervoor dat u ook de PHP-code wijzigt). Vergeet niet dat u het wachtwoord niet hoeft te onthouden, dus u kunt het zo hard mogelijk doen. Hier is een generator willekeurige wachtwoorden.
3
Maak een MySQL-tabel met de naam "sessies".
De volgende code maakt een tabel met 4 velden (id, tijd, data, session_key).
Maak de tabel "sessies":
De volgende code maakt een tabel met 4 velden (id, tijd, data, session_key).
Maak de tabel "sessies":
CREËER TAFEL `sessies` (` id` CHAR (128) NOT NULL, `schedule` CHAR (10) NOT NULL,` data` text NOT NULL, `session_key` CHAR (128) NOT NULL, PRIMARY KEY (` id`) ) MOTOR = InnoDB DEFAULT CHARSET = latin1-
Gebruik het gegevenstype CHAR voor velden met een bekende lengte, zoals de velden "id" en "session_key", die altijd 128 tekens lang zijn. Door CHAR te gebruiken, besparen we verwerkingskracht.
Methode 2
Maak een sesion.class.php bestand aan1
Maak een klas
Om een nieuwe klasse te initialiseren, moet u de volgende code invoeren:
Nieuwe les:
Om een nieuwe klasse te initialiseren, moet u de volgende code invoeren:
Nieuwe les:
class session {
2
Maak de functie __construct.
Deze functie wordt elke keer dat u een nieuw exemplaar van een object maakt met de klasse `sessie` gemaakt. U kunt lezen over de functie PHP _construct hier.
Deze functie configureert onze aangepaste sessiemanager zodat deze beschikbaar is zodra de klasse geïnitialiseerd is (dat wil zeggen, het is gedaan, gecompileerd of geconstrueerd).
__construct functie:
Deze functie wordt elke keer dat u een nieuw exemplaar van een object maakt met de klasse `sessie` gemaakt. U kunt lezen over de functie PHP _construct hier.
Deze functie configureert onze aangepaste sessiemanager zodat deze beschikbaar is zodra de klasse geïnitialiseerd is (dat wil zeggen, het is gedaan, gecompileerd of geconstrueerd).
__construct functie:
functie __construct () {// stel de sessie functies personalizada.session_set_save_handler (array ($ this, `open`), array ($ this, `dicht`), array ($ this, `lezen`), array ($ dit, `schrijven`), array ($ this, `vernietigen`), array ($ this, `gc`)) - // deze regel voorkomt onverwachte objecten met behulp van als manipulators guardado.register_shutdown_function ( `session_write_close`) effecten - }
3
Maak een session_session-functie.
Deze functie wordt aangeroepen elke keer dat iemand een nieuwe sessie wil starten, in plaats van session_start () -. Kijk naar de opmerkingen in de code om te zien wat elke regel doet.
session_start functie:
Deze functie wordt aangeroepen elke keer dat iemand een nieuwe sessie wil starten, in plaats van session_start () -. Kijk naar de opmerkingen in de code om te zien wat elke regel doet.
session_start functie:
inicio_sesion functie ($ session_name, $ bewaking) {// Zorg ervoor dat de sessie cookie kan niet worden geopend door jаvascript $ httponly = true -. // hash-algoritme voor gebruik met sessionid. (Gebruikt hash_algos () om een lijst met beschikbare hash te zien) $ session_hash = `sha512` - // Controleer of er een hash disponibleif (in_array ($ session_hash, hash_algos ())) {// Stel de hash.ini_set functie ( `session.hash_function` $ session_hash) -} // aantal bits per teken hash.// mogelijke waarden zijn `4` (0-9, af), `5` (0-9, v) en " 6 `(0-9, az, AZ, ";", "") ini_set. (` session.hash_bits_per_character `5) - // Dwing de session cookies alleen, geen variabelen URL.ini_set gebruiken (` session.use_only_cookies`, 1) - // Get parameters session cookie $ cookieParams = session_get_cookie_params () - // Stel de parámetrossession_set_cookie_params ($ cookieParams [ "lifetime"], $ cookieParams [ "path"], $ cookieParams [ `domein`], $ veilig, $ httponly) - // Hernoemt de sesiónsession_name ($ session_name) - // kunnen we nu beginnen met sesiónsession_start () - // Deze lijn regenereert de sessie en elimineert de anterior.// Het genereert ook een nieuwe coderingssleutel in de basis van gegevens. session_regenerate_id (true) -}
4
Maak een open functie.
De PHP-sessies roepen deze functie op wanneer u een nieuwe sessie start, we gebruiken deze om een nieuwe verbinding in de database te starten.
open functie:
De PHP-sessies roepen deze functie op wanneer u een nieuwe sessie start, we gebruiken deze om een nieuwe verbinding in de database te starten.
open functie:
functie open () {$ host = `localhost` - $ user = `sec_user` - $ pas = `eKcGZr59zAa2BEWU` - $ name = `sesiones_seguras` - $ mysqli = new mysqli ($ host, $ user, $ pas, $ name ) - $ this-> db = $ mysqli-return true-}
5
Maak een close-functie.
Deze functie wordt aangeroepen wanneer de sessies gesloten willen worden.
sluit functie:
Deze functie wordt aangeroepen wanneer de sessies gesloten willen worden.
sluit functie:
function close () {$ this-> db-> close () - return true-}
6
Maak een leesfunctie.
PHP roept deze functie op wanneer u een sessie probeert te openen, bijvoorbeeld wanneer u echo $ _SESSION [`something`] - gebruikt. Omdat er op één pagina veel oproepen naar deze functie kunnen worden uitgevoerd, kunt u profiteren van voorbereide instructies, niet alleen voor beveiliging, maar ook voor prestaties. Bereid de instructie eenmaal voor en voer deze vervolgens vele malen uit.
Het decodeert ook sessiegegevens die zijn gecodeerd in de database. U gebruikt 256-bits AES-codering in sessies.
Lees functie:
PHP roept deze functie op wanneer u een sessie probeert te openen, bijvoorbeeld wanneer u echo $ _SESSION [`something`] - gebruikt. Omdat er op één pagina veel oproepen naar deze functie kunnen worden uitgevoerd, kunt u profiteren van voorbereide instructies, niet alleen voor beveiliging, maar ook voor prestaties. Bereid de instructie eenmaal voor en voer deze vervolgens vele malen uit.
Het decodeert ook sessiegegevens die zijn gecodeerd in de database. U gebruikt 256-bits AES-codering in sessies.
Lees functie:
functie lezen ($ id) {if (isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> prepare ( "SELECT gegevens van sessies WHERE id = LIMIT 1?") -} $ this-> read_stmt-> bind_param ( `s`, $ id) - $ this-> read_stmt-> execute () - $ this-> read_stmt-> store_result () - $ this-> read_stmt-> bind_result ($ data ) - $ this-> read_stmt-> fetch () - $ key = $ this-> GETKEY ($ id) - $ data = $ this-> decoderen ($ data, $ key) -Return $ data-}
7
Maak een schrijffunctie.
Deze functie wordt gebruikt bij het toewijzen van een waarde aan een sessie, bijvoorbeeld $ _SESSION [`something`] = `iets anders`-. De functie codeert alle gegevens die in de database moeten worden ingevoegd.
schrijf functie:
Deze functie wordt gebruikt bij het toewijzen van een waarde aan een sessie, bijvoorbeeld $ _SESSION [`something`] = `iets anders`-. De functie codeert alle gegevens die in de database moeten worden ingevoegd.
schrijf functie:
functie write ($ id, $ data) {// Hier krijg je een enkele toets $ key = $ this-> getKey ($ id) - codeert gegevens // $ data = $ this-> versleutelen ($ data, $ key) - $ time = time () - if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> bereiden ( "REPLACE INTO sessies (id, tijd, data, clave_sesion) WAARDEN ( ? ,,) ") -?} $ this-> w_stmt-> bind_param ( `SISS`, $ id, $ tijd, $ data, $ key) - $ this-> w_stmt-> execute () - terug true-}
8
Maak een vernietigingsfunctie.
Deze functie verwijdert de sessie uit de database, het gebruikt PHP wanneer u functies zoals session__destroy () - aanroept.
functie vernietigen:
Deze functie verwijdert de sessie uit de database, het gebruikt PHP wanneer u functies zoals session__destroy () - aanroept.
functie vernietigen:
function destroy ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> prepare ("DELETE FROM sessions WHERE id =?") -} $ this- > delete_stmt-> bind_param (`s`, $ id) - $ this-> delete_stmt-> execute () - return true-}
9
Maak een gc-functie aan (garbage collector, voor het acroniem in het Engels).
De garbage collector-functie wordt aangeroepen om de oude sessies te verwijderen. De frequentie waarmee deze functie wordt aangeroepen, wordt bepaald door de twee configuratie-instructies session.gc_probability en session.gc_divisor.
gc-functie ():
De garbage collector-functie wordt aangeroepen om de oude sessies te verwijderen. De frequentie waarmee deze functie wordt aangeroepen, wordt bepaald door de twee configuratie-instructies session.gc_probability en session.gc_divisor.
gc-functie ():
functie gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> prepare ("DELETE FROM sessions WHERE schedule < ? ") -} $ old = time () - $ max- $ this-> gc_stmt-> bind_param (`s`, $ old) - $ this-> gc_stmt-> execute () - return true-}
10
Maak een getkey-functie.
Deze functie wordt gebruikt om de unieke sleutel te verkrijgen om de sessietabel te versleutelen. Als er geen sessie is, hoeft u alleen een nieuwe willekeurige sleutel in te voeren om te coderen.
getkey-functie ():
Deze functie wordt gebruikt om de unieke sleutel te verkrijgen om de sessietabel te versleutelen. Als er geen sessie is, hoeft u alleen een nieuwe willekeurige sleutel in te voeren om te coderen.
getkey-functie ():
prive-functie getKey ($ id) {if (isset ($ this-> key_stmt)!) {$ this-> key_stmt = $ this-> db-> bereiden ( "SELECT FROM sessies waarin clave_sesion id = LIMIT 1?") - } $ this-> key_stmt-> bind_param ( `s`, $ id) - $ this-> key_stmt-> execute () - $ this-> key_stmt-> store_result () - if ($ this-> key_stmt-> NUM_ROWS == 1) {$ this-> key_stmt-> bind_result ($ key) - $ this-> key_stmt-> fetch () - terug $ sleutel-} else {$ random_key = hash ( `sha512`, uniqid (mt_rand (1 , mt_getrandmax ()), true)) - return $ random_key-}}
11
Maak de coderings- en decoderingsfuncties.
Deze functies versleutelen de gegevens van de sessies met een coderingssleutel van de database die voor elke sessie anders is. De coderingssleutel wordt niet direct gebruikt, maar u gebruikt deze om de sleutelhas nog meer willekeurig te maken.
codeer () en decodeer () functies:
Deze functies versleutelen de gegevens van de sessies met een coderingssleutel van de database die voor elke sessie anders is. De coderingssleutel wordt niet direct gebruikt, maar u gebruikt deze om de sleutelhas nog meer willekeurig te maken.
codeer () en decodeer () functies:
private encrypt functie ($ data, $ key) {$ salt = `CH swe retReGu7W6bEDRup7usuDUh9THeD2CHeGE * ewr4n39 = E @ rAsp7c-Ph @ pH!` - $ key = substr (hash ( `sha256`, $ zout $ key $.. zout), 0, 32) - $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB) - $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND) - $ gecodeerde = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ key, $ data, MCRYPT_MODE_ECB, $ iv)) -Return $ encrypted-} private function decrypteert ($ data, $ key) {$ salt = `cH swe ewr4n39 retReGu7W6bEDRup7usuDUh9THeD2CHeGE * = E @ rAsp7c-ph @ pH!` - $ key = substr (hash ( `sha256`, $ . salt $ key $ salt), 0, 32) -. $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB) - $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND) - $ ontsleutelde = MCRYPT_DECRYPT (MCRYPT_RIJNDAEL_256, $ key, base64_decode ($ data) , MCRYPT_MODE_ECB, $ iv) -Return $ decrypted-}
12
Sluit de klassen.
Hier sluit je gewoon de klassen met de toetsen:
Sluiten klassen:
Hier sluit je gewoon de klassen met de toetsen:
Sluiten klassen:
}
Methode 3
Maak pagina`s met sessies1
Gebruik sessies met de aangepaste sessiemanager.
Hier leest u hoe u een nieuwe sessie start - u moet dit opnemen op alle pagina`s die u wilt openen met de sessies, gebruik het in plaats van session_start () -
Start een sessie:
Hier leest u hoe u een nieuwe sessie start - u moet dit opnemen op alle pagina`s die u wilt openen met de sessies, gebruik het in plaats van session_start () -
Start een sessie:
require (`session.class.php`) - $ session = new session () - // Stel dit in op true als u https $ session-> session_home (`_ s`, false) gebruikt - $ _ SESSION [`something`] = `A waarde .`- echo $ _SESSION [`iets`] -
Delen op sociale netwerken:
Verwant
- Hoe een inventarisdatabase in Access te maken
- Hoe een database in MySQL te maken
- Hoe een database in Excel te maken
- Hoe een database in SQL Server te maken
- Hoe een database te maken in phpMyAdmin
- Hoe een tabel in MySQL te maken
- Hoe een E R-diagram te tekenen met de MySQL-databasemanager
- Hoe een MySQL-database te verwijderen
- Hoe Wordpress in XAMPP te installeren
- Hoe een Wiki te installeren in minder dan 20 minuten
- Hoe een MySQL-server op een pc te installeren
- Hoe sql-query`s naar de MySQL-opdrachtregel te verzenden
- Hoe een Joomla-website te back-uppen met behulp van cPanel
- Hoe SQL te gebruiken
- Hoe toegang te krijgen tot een MySQL-database met PHP
- Hoe PHP en MySQL te leren
- Hoe een L2J-server te configureren
- Hoe een blog te maken met Wordpress
- Hoe maak je een eenvoudige inlogcode in PHP
- Hoe een gebruiker in een Oracle-database te maken
- Hoe moodle 2.4 te installeren