Sikkerhetsdefiner vs sikkerhetsinvoker
Sikkerhets definererbegrepet henvist til noen eksepsjonelle funksjoner som brukes til å utføre unike og privilegerte oppgaver angående sikkerheten til databasen i PostgreSQL. Disse oppgavene er så offisielle og privilegerte at ikke alle brukere kan utføre dem eller bruke dem hvis det er trygt og forsvarlig. Dette kan brukes som en eiendom i PostgreSQL -spørringen mens du utfører noen transaksjoner fra PostgreSQL -databasen. Når en funksjon er blitt kalt med privilegiene til brukeren som har kalt denne funksjonen, sies det å være sikkerhetsinvokeregenskapen til funksjoner. På den annen side, når en funksjon er blitt kalt med rettighetene til sin virkelige eier (som opprettet denne funksjonen), sies det å være sikkerhetsdefineregenskapen til funksjonen.
Hvem kan bruke den?
Det meste av tiden kan sikkerhets definisjonsfunksjonen utføres med rettighetene til eieren i.e., Eieren av sikkerhets definisjonsfunksjonen vil være den eneste som bruker den på utførelsesdelen. På den annen side kan normale innebygde eller brukerdefinerte funksjoner utføres av enhver bruker i.e., Offentlig, hvis de ikke er spesifisert som sikkerhetsfinere. Siden PostgreSQL -databasen alltid samtykker i bruk av systemdatabaser og tabeller fra de lokale og eksterne PostgreSQL -arbeidsgivere, kan denne bruken påvirke utførelsen av sikkerhets definisjonsfunksjonen og også skade sikkerheten til en database. Det er en mulighet for at en ekstern bruker kan få en mulighet til å administrere eller kontrollere hele PostgreSQL -databasen og den. På denne måten kan den utenforstående brukeren utføre spørsmål og koder som han/hun ikke burde være. Mens vi bruker denne egenskapen i PostgreSQL -spørringen, har vi latt brukerne utføre funksjonene som er utført med rettighetene til brukeren som har opprettet den og ikke vil bruke rettighetene til brukeren som har ringt den. Dermed må vi være mer forsiktige enn før, mens vi bruker databasen etter bruk av sikkerhets definerer. La oss se på noen eksempler nå.
Eksempel 01
La oss ta en titt på et enkelt eksempel for å generere en funksjon med sikkerhetsdefineregenskap. Vi vil prøve å gjøre vår funksjon så sikker som mulig, men bruker sikkerhets definisjonsfunksjonen i den. Så vi har startet med påloggingen i PostgreSQL -databasen PGADMIN GUI -verktøy. Se fanen "Funksjoner" i din spesifikke database. Høyreklikk på det, hold musepekeren over “Opprett” -alternativet og velg “Funksjon”.
Skjermen som heter Create-Function vil bli åpnet. Legg til navnet på en funksjon som "ufarlig", velg eieren og skjemaet. Siden denne funksjonen kommer til å være en sikkerhetsdefiner, vil den bare bli utført av rettighetene til brukeren "Aqsayasin".
Fra definisjonsdelen, legg til returtypen, språket og legg til datatypen for argumentet som skal gis i funksjonen.
Innenfor kodeområdet, skriv litt enkel kode. Som du ser, bruker vi ikke noen tabell her, så det ser ut til å være uheldig når det gjelder utførelsen.
I opsjonsområdet, slå på "Security of Definer" for å aktivere egenskap for sikkerhetsdefiner.
Innenfor SQL -delen får du hele spørringen for å opprette en ny funksjon med egenskapen Sikkerhets definerer. Eieren av denne funksjonen vil være brukeren “Aqsayasin”.
Etter å ha kjørt den valgte instruksjonen for å kalle den ufarlige funksjonen som passerer 15 som verdi til den, har vi fått verdien 25 som utgang. Selv om det ser helt trygt og forsvarlig ut, vil bruk.
For å få informasjonen angående den nyopprettede sikkerhetsdefinerfunksjonen "ufarlig", må vi bruke den valgte instruksjonen som er vist nedenfor i spørringsområdet til PGADMIN 4. Kolonnen "proname" viser navnet på en funksjon i.e., ufarlig, "nspname" viser navnet på et skjema jeg.e., offentlig, og kolonnen “USName” tilhører eieren for denne funksjonen jeg.e., “Aqsayasin”. Slik får vi informasjonen om sikkerhets definisjonsfunksjonen.
Eksempel 02
Sikkerhets definisjonsfunksjonen kan også brukes til å opprette en prosedyre av en bestemt bruker. La oss opprette en ny prosedyre “sec_def” ved hjelp av sikkerhetsdefineregenskaper i den. Denne prosedyren brukes til å få verdier fra "ftest" -tabellen med "offentlige" skjemaet. Du må vite at "ftest" -tabellen er lagret i "Aqsayasin" -databasen og dens eier er bruker "Aqsayasin".
Nå må du logge inn fra PostgreSQL Shell Terminal for å legge til noen enkle kommandoer. Så vi har logget inn fra "Aqsayasin" -databasen først. Etter dette har vi prøvd å koble “Aqsayasin” -databasen med brukeren “Outsider” ved å bruke “\ C” -kommandoen sammen med databasenavnet og brukeren som skal kobles til. Brukerens "outsider" -bruker er koblet til databasen "Aqsayasin".
Nå er det på tide å ringe "sec_def ()" -prosedyren ved å bruke den innebygde samtale () -funksjonen i terminalskallet. Det vil kaste et unntak som viser at ”publikum.Ftest ”eksisterer ikke for vår bruker utenforstående. Dette er fordi prosedyren er opprettet med rettighetene til brukeren “Aqsayasin”, og brukeren “Outsider” har ingen slike rettigheter.
Hvis du vil unngå funksjonsfeil av utenforstående og upålagte brukere av PostgreSQL -databasen i systemet ditt, kan det hende du må begrense eller forby "skriving" -rettighetene for disse brukerne å sette inn poster i databasen din i parameteren "Search_path". Ved å bruke denne måten vil ikke de ytre brukerne kunne generere funksjonsfeilede objekter for å manipulere databasesystemet ditt, dets data og rettigheter. Du kan bruke det midlertidige skjemaet “PG_TEMP” på det siste for å bli søkt etter for å gjøre sikker ledelse innen “search_path” i spørringen.
Konklusjon
Bruken av sikkerhetsdefineregenskaper i funksjonene for å gjøre noen spesielle oppgave er også en kraftig teknikk, men likevel veldig risikabelt. For å la brukerne våre forstå konseptet for sikkerhetsdefiner, har vi prøvd å lage en funksjon og en prosedyre som har en sikkerhetsdefinerfunksjon som en egenskap. Vi har sett hvordan en feil oppstår når en bruker uten "sikkerhets definerer" eierrettigheter prøver å ringe funksjonen eller en prosedyre. For å oppsummere, foretrekker vi vanligvis ikke å bruke den ofte i databasen, da den kan være ufrelst for PostgreSQL -databasen.