Mis on MariaDB (ja MySQL) nähtamatud veerud ja kuidas neid rakendada

Ingmar Aasoja
Jaga:

Mis on nähtamatu veerg

Veebirakenduste valdkonnas on andmete haldamine igapäevane ja oluline tegevus. See hõlmab nii kliendiandmete kaitsmist kui ka süsteemi töö efektiivsuse parandamist.  Viimasel ajal on MariaDB ja MySQL tutvustanud mitmeid uusi funktsioone, mis aitavad andmeid paremini hallata.  Üks neist on “nähtamatud veerud”. See võimaldab arendajatel ja andmebaasi administraatoritel paremini kontrollida, milliseid andmeid päringutes näidatakse, pakkudes suuremat paindlikkust ning turvalisust.

Nii saab MariaDB ja MySQL andmebaasides määrata veerule nüüd atribuudi INVISIBLE, mis peidab vastavad väärtused SELECT *  päringutes ning nendele pääseb ligi ainult otse pöördudes näiteks päringuga SELECT veeru_nimi FROM from tabel.

Milleks nähtamatud veerge kasutada?

Andmete turvalisuse suurendamine

Veergude “nähtamatuks” muutmine võib natukene maandada andmevarguse riski, kuna andmebaasile ligi pääsenud kolmas isik ei pruugi olla tuttav andmebaasi struktuuriga ja teada, et kasutusel on “nähtamatud” väljad. Kui andmevargust proovitakse sooritada elementaarse SELECT *  käsu abil, siis “nähtamatud” andmed ei leki. Tasub siiski meeles pidada, et see lahendus maandab selliste rünnakute riski, mis toetuvad automatiseeritud skänneritele või tööriistadele, aga kui ründajal on SELECT privileeg, siis saab ta võimalike “nähtamatute” veergude kohta infot küsida SHOW CREATE TABLE käsuga. Neid välju näevad ka mariadbdump ja mysqldump utiliidid.

Riskide maandamisele aitab kaasa see, kui määrata “nähtamatuks tegev” atribuut kõikidele veergudele, mis sisaldavad tundlikke andmed näiteks salasõnade räsid, ligipääsu token’eid ja isikuandmed. Meeles tuleb pidada, et tegemist on vaid ühe turvameetmega, mis üksi kasutades ei välista nende andmete lekkimist. Turvaliselt seadistatud ligipääsukontrolle ja andmete krüpteerimist ei asenda miski.

Päringuvastuste optimeerimine

Tihtilugu on andmebaasis päritaval real kirjas ka selle kohta käivad meta- ja/või logiandmeid, mille maht võib olla “kasulikest” andmetest endast suurem. Määrates need väljad “nähtamatuks”, saab neid pärida ainult siis, kui neid on tegelikult vaja. See on eriti kasulik võimalus sellisele andmebaasi administraatorile või arendajale, kas kasutab SQL’iga suhtlemiseks mõnd klientprogrammi näites phpMyAdmin. Sellise rakenduse abil andmetes navigeerides, et kuvata peidetud väljasid automaatselt ja seetõttu ei avalda rakendus koormust andmebaasiserveritele ja parandab kasutuskogemust. Sama efekti annab see ka teistes rakendustes, mis kipuvad küsima andmebaasist andmeid, mida kasutajal tegelikult ei pruugi vaja minna.

Olukorras, kus andmebaasi kasutab mitu rakendust, võib tekkida olukord, kus üks rakendus lisab andmeid, mida läheb vaja ainult selle konkreetse rakenduse tööks ja teine rakendus – näiteks klientidele andmeid kuvav veebirakendus – neid väljasid üldse ei vaja. Kui selline rakendus küsib oma disaini tõttu siiski iga kord andmebaasist välja kõik andmebaasiveerud, siis oleks nutikas määrata sellele mittevajalikud veerud baasis “nähtamatuks”, mis aitab ühtlasi vähendada võrguliiklust andmebaasi ja klientrakenduse vahel, parandades rakenduse kuvade latentsusaega ja seeläbi ka kasutajakogemust veelgi.

Kuidas seda kõike rakendada?

MariaDB ja MySQL veergudele saab lisada “nähtamatuks” tegeva INVISIBLE atribuudi CREATE TABLE ja ALTER TABLE käskudega.

Uut tabelit luues saab veerge “nähtamatuks” seadistada järgmiselt:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    password VARCHAR(255) INVISIBLE
);
Code language: SQL (Structured Query Language) (sql)

“Nähtamatuks” saab muuta ka olemasolevate tabelite veergusid. Näiteks, kui varem oli päringu tagastus järgmine:

siis pärast järgmise käsu käivitamist

<code>ALTER TABLE users MODIFY COLUMN password VARCHAR(255) INVISIBLE;</code>
Code language: SQL (Structured Query Language) (sql)

on tagastus hoopis selline:

Reaalne näide Laravel’i raamistikuga

Kui muutusi andmebaasis tehakse Laravel’i migratsioonidega, siis piisab neile  ->invisible() meetodi lisamisest.

Laravel Eloquent ORM’is ei ole määratud üksikud väljad, mida andmebaasist päritakse. Kui määrata users tabeli password veerg “nähtamatuks”, siis seda model’i külge ei pärita:

$user = User::find(1);
$this->info('Salasõna: ' . $user->password);

// väljund:
// Salasõna
Code language: PHP (php)

Sellleks, et konkreetse veeru infot küsida, peab sellele konkreetselt koodis viitama.

$user = User::find(1, ['id', 'name', 'password']);
$this->info('Salasõna: ' . $user->password);

// väljund:
// Salasõna: $2y$12$...

// või

$user = User::select('id', 'name', 'password')->find(1);
$this->info('Salasõna: ' . $user->password);

// väljund:
// Salasõna: $2y$12$...
Code language: PHP (php)

Kui Laraveli rakendusega seotud teegid ei tea “nähtamatust” veerust midagi ja ei oska seda ise spetsiifiliselt pärida, on võimalik ka kasutada näiteks globaalseid skoope. Näiteks:

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class User extends Model
{
    protected static function booted()
    {
        static::addGlobalScope('includePassword', function (Builder $builder) {
            $builder->addSelect('password');
        });
    }
}
Code language: PHP (php)

Kokkuvõtteks

“Nähtamatutel” väljadel on siinviidatule lisaks mitmeid kasutuskohti, kuid paljud arendajad ei pruugi olla kursis sellise võimaluse olemasoluga. See funktsionaalsus lisandus MySQL’i versioonist 8.0.24 ja MariaDB‘sse versioonist 10.3.3.

Kindlasti peab tähelepanu pöörama sellele, et olemasolevad rakendused ei pruugi peale “nähtamatute” veergude kasutuselevõttu tööle jääda ning neile võiks mõelda juba andmebaasi arhitektuuri muutmise käigus, see aitab vältida hilisemaid ebameeldivaid üllatusi.

Populaarsed postitused

CloudFest 2024: AI annab riistvarale uue hingamise

Ingmar Aasoja
Läinud nädalal istus Zone tiim lennukisse ja sööstis taaskord CloudFesti põnevasse maailma, et heita pilk veebimajutusteenuste arengusuundadele. Meie...

Zone+ WordPressi Assistent: kuidas AI abiga sekunditega veebileht luua

Jaanus Putting
See aeg on läbi, mil vajadus kodulehe järele tähendas telefoniraamatust või guuglist veebidisaineri kontaktide otsimist. Tõenäoliselt üks viimase...

Aegunud PHP on aegunud PHP

Hasso Tepper
Kui esimene tänapäevane PHP versioon 25 aastat tagasi avalikuks tehti, oli internet hoopis teistsugune. Nõudmised veebilehtedele olid tagasihoidlikud...

Zone Veebiakadeemia - kuidas end Internetis nähtavaks teha

blogi
Zone Veebiakadeemia uusima episoodiga hakkame tutvustama ägedaid Zone koostööpartnereid. Seekord on meil külas Nobel Digitali tootejuht ja partner...