» »

[MariaDB] Brez insert pravice možen insert preko procedure...

[MariaDB] Brez insert pravice možen insert preko procedure...

HotBurek ::

Dober večer.

Danes sem nalete na nenavadno obnašanje MariaDB 10.11.1 serverja, kar se gre pravic.

Uporabnik user_1 ima na bazi database_1:
- GRANT EXECUTE ON pravico na nivoju baze (to je za poganjat procedure)
- ter GRANT SELECT, INSERT, UPDATE ON na tabeli table_1

Na tej bazi pa obstaja tudi tabela table_2, ter procedura, ki izvede INSERT v tabelo table_2.

In sedaj, če z uporabnikom user_1 poženem INSERT INTO table_2..., dobi 'command denied', kar je normalno, ker na tej tabeli nima teh pravic.

A če s tem istim uporabnikom požene proceduro CALL `database_1`.`table_2_insert` (...);, v kateri je ta isti insert ukaz, pa gre zadeva skozi in vnese podatke.

Testiral sem tako, da sem se v terminalu privajil s tem userjem (mysql -u user_1 -p). Pa 3x preveril, da nisem root al pa kaj takega.

Kolikor se spomnim, "včasih" to, da si proceduro uporabil kot proxy in je šlo vse skos, tudi če nisi imel pravic na tabeli, ni delalo. Sedaj pa dela. Weird. :|

-----------------------------------

UPDATE 1

Primer iz MSSQL: https://sqlnuggets.com/stored-procedure...


UPDATE 2

Rešitev: SQL SECURITY INVOKER

Docs:

https://mariadb.com/kb/en/stored-routin...

https://kedar.nitty-witty.com/blog/acce...

Solid. 8-)
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
  • spremenilo: HotBurek ()

jernejl ::

Če je procedura od drugega userja in ima tisti user ustrezen grant, potem to tako deluje. Sicer si pa že sam ugotovil.
To pride prav, če želiš uporabnikom omejiti dostop do tabele, recimo onemogočiti, da bi notri vnašali karkoli, in poskrbeti, da se hkrati mogoče posodobijo še odvisne tabele.
Recimo procedura za vstavljanje nove osebe v bazo (psevdokod):
procedure vstavi_osebo(ime, priimek, datum_rojstva, spol, ulica, postna_st, posta)
begin
 preveri_datum(datum_rojstva) --ali je v smiselnem intervalu
 preveri_ime(ime) --ali nima kakih nenavadnih znakov
 
 if "ne obstaja ulica v tabeli ulica" then
   insert into ulica...
 end if;

 if "ne obstaja pošta v tabeli posta" then
   insert into posta...
 end if

 insert into oseba ...
end

Tole je recimo bolje, kot da vsaki aplikaciji (ki mora vstavljati osebe v bazo) oziroma njihovim programerjem daš prost dostop do vseh teh tabel in naj sami vnesejo vse tako, da bo prav. Ker je samo vprašanje časa, kdaj se bo našel en "študent", ki se mu ne bo dalo programirati vseh mogočih "checkov" in boš potem imel v bazi osebe, ki jim je ime "XYZ123", živijo v ulici "DELETE FROM TABELA WHERE 1=1" in so se rodile 1.1.2111.

Zgodovina sprememb…

  • spremenil: jernejl ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Mariadb (InnoDB) istočasni insert v tabelo iz različnih procesov (strani: 1 2 )

Oddelek: Programiranje
877354 (3712) 2g00d4u
»

C# INSERT statment ne vpise podatkov

Oddelek: Programiranje
111209 (1083) darkolord
»

mysql, insert, values, select

Oddelek: Programiranje
91837 (1664) slosi
»

[SQL] Insert

Oddelek: Programiranje
252079 (1681) greentech
»

[T-SQL] Kako vnest podatek v bazo in da ti hkrati vrne id?

Oddelek: Programiranje
162896 (2614) dmok

Več podobnih tem