Bezpieczeństwo Procedury składowane Funkcje i Wyzwalacze Wykład 8 Prowadzący: dr Paweł Drozda
Użytkownicy – dostęp do danych (1) Użytkownik bazy danych – osoba lub aplikacja, mająca dostęp do części danych zgromadzonych w bazie Uprawnienia – zakres czynności, które użytkownik może wykonać na bazie danych Uwierzytelnianie – weryfikacja użytkownika (w MySQL –na podstawie loginu i hasła zapisanego w bazie)
Użytkownicy – dostęp do danych (2) Dwa typy ograniczenia działań: Ograniczenie dostępu do poszczególnych danych (tabele, bazy danych) Ograniczenie wykonywania poszczególnych operacji (SELECT, UPDATE, itd.) Mechanizmy nakładające ograniczenia: System przywilejów Role bazodanowe (tylko Oracle)
Przywileje Prawo wykonywania przez użytkownika określonej akcji w bazie danych lub dostępu do określonego obiektu Przykłady przywilejów: Wstawianie do bazy Usuwanie z bazy Modyfikowanie rekordów Przeglądanie rekordów
Zarządzanie kontami – MySQL (1) Tworzenie użytkownika – bez żadnych przywilejów CREATE USER nazwa IDENTIFIED BY [PASSWORD] ‘hasło’; Usuwanie użytkownika DROP USER nazwa; Nadanie hasła SET PASSWORD [for nazwa]=PASSWORD(‘nowehaslo’); Przykład: SET PASSWORD FOR Stefan = PASSWORD(‘qwerty’);
Zarządzanie kontami – MySQL (2) Zmiana nazwy użytkownika RENAME USER staranazwa TO nowanazwa; Nadawanie przywilejów – GRANT GRANT rodzajePrzywilejów[(nazwyKolumn)] ON nazwyObiektów TO listaUzytkowników [IDENTIFIED BY [PASSWORD] ‘haslo’] [WITH opcje];
GRANT – przywileje (1) Możliwe przywileje ALL – nadanie wszystkich przywilejów oprócz GRANT OPTION ALTER – możliwość modyfikacji struktury DELETE – możliwość usunięcia danych INDEX – możliwość tworzenia i usuwania indeksu INSERT – możliwość wstawiania danych CREATE – możliwość tworzenia tabel GRANT OPTION – możliwość nadawania uprawnień
GRANT – przywileje (2) Możliwe przywileje (cd) CREATE USER – możliwość tworzenia użytkowników CREATE VIEW – możliwość tworzenia perspektyw DROP – możliwość usuwania tabel LOCK TABLES – możliwość blokowania SHOW DATABASES – możliwość obejrzenia wszystkich baz danych w systemie UPDATE – możliwość uaktualnień
GRANT, przywileje – przykłady GRANT SELECT, DELETE, INSERT, UPDATE ON *.* TO student; GRANT SHOW DATABASES ON *.* TO student; GRANT ALTER, DROP, CREATE ON bazka.* TO student;
GRANT – obiekty Rodzaje obiektów *.* - dostęp do wszystkich baz danych w systemie Nazwa.* - dostęp do bazy o nazwie Nazwa Nazwa – dostęp do tabeli o nazwie Nazwa w aktualnej bazie Baza.Tabela – dostęp do tabeli Tabela w bazie danych Baza
GRANT obiekty - przykłady GRANT INSERT ON Biblioteka.* TO Bibliotekarz; GRANT UPDATE(zarobki) ON Uni.Pracownik TO Płace; GRANT ALL ON *.* TO Administrator; Use Pizzeria GRANT SELECT ON Zamowienia TO Kelner;
GRANT – użytkownicy (1) Używając GRANT dla istniejącego użytkownika – zmiana przywilejów GRANT dla nieistniejącego użytkownika – powstaje nowy użytkownik z przywilejami określonymi w poleceniu Hasło gdy powstaje nowy użytkownik bez hasła – logowanie bez hasła Gdy ze słowem PASSWORD ‘hasło’ – hasło musi być zakodowane funkcją PASSWORD Bez PASSWORD ‘hasło’ – hasło podane jako tekst
GRANT – użytkownicy (2) Użytkownik PUBLIC – przywileje nadane dla wszystkich użytkowników Przykłady DROP USER Szukacz; GRANT SELECT ON *.* TO Szukacz; CREATE USER Tworca IDENTIFIED BY ‘wielki’; GRANT CREATE ON nowa.* TO Tworca; GRANT ALL ON *.* TO ADMIN IDENTIFIED BY PASSWORD ‘6af4442460ade563’; GRANT SELECT ON Test.* TO PUBLIC;
GRANT - opcje GRANT OPTION – możliwość nadawania posiadanych uprawnień innym użytkownikom MAX_QUERIES_PER_HOUR – max liczba zapytań na godzinę MAX_UPDATES_PER_HOUR – max liczba aktualizacji na godzinę MAX_CONNECTIONS_PER_HOUR = max liczba połączeń na godzinę MAX_USER_CONNECTIONS – max liczba jednoczesnych połączeń jednego użytkownika Gdy parametry zero – brak ograniczeń
Usuwanie przywilejów REVOKE – składnia Przykład: REVOKE rodzajePrzywilejów ON nazwyObiektów FROM użytkownicy; Przykład: REVOKE ALTER, DROP on Baza.* FROM Tworca; REVOKE ALL, GRANT OPTION FROM student;
Procedury składowane Zbiór instrukcji SQL wykonywanych jako jedno polecenie Możliwości: przekazywania parametrów do procedury Wywołanie większości poleceń SQL (również innych procedur) Dodanie fragmentu logiki po stronie bazy danych Aby móc utworzyć procedurę składowaną – niezbędny przywilej CREATE ROUTINE
Procedury składowane - rodzaje Wywołane poleceniem CALL Wynik w formie tabeli Odwołuje się do referencji (IN, OUT) Może używać poleceń SQL Może wywoływać procedury i funkcje Funkcje Mogą być wbudowane w polecenie SQL Zwracają pojedyncze wartości Przekazywanie parametrów Brak możliwości wywołania poleceń dotyczących tabel Nie może odwoływać się do procedur
Funkcje – składnia (1) Tworzenie funkcji Zmienne w funkcjach CREATE FUNCTION nazwa(lista parametrow) RETURNS typ zwracanej zmiennej polecenia funkcji Blok BEGIN – END Gdy występuje w funkcji więcej niż jedna instrukcja – grupowanie w blok BEGIN – END Zmienne w funkcjach Zwykłe – poprzedzone @ Lokalne – deklarowane przy użyciu DECLARE, aktualne tylko w bloku BEGIN END DECLARE zmienna1, zmienna2 , … typDanych [DEFAULT wartosc]
Funkcje – składnia (2) Pętle w MySQL CASE REPEAT ciagInstrukcji UNTIL warunek END REPEAT; Opuszczenie pętli – LEAVE Wymuszenie kolejnej iteracji – ITERATE WHILE warunek DO instrukcje; END WHILE; CASE CASE wyrażenie WHEN wartość1 THEN polecenia; WHEN wartość2 THEN polecenia; WHEN wartość3 THEN polecenia; else polecenia; END CASE;
Funkcje – składnia (3) Usuwanie Pokazanie składni funkcji DROP FUNCTION [IF EXISTS] nazwa Pokazanie składni funkcji SHOW CREATE FUNCTION nazwa Wyświetlenie statusu funkcji SHOW FUNCTION STATUS Informacje na temat funkcji Tabela information_schema.routines
Funkcja – przykład(1) CREATE FUNCTION silnia(n INT) RETURNS int(11) BEGIN DECLARE i INT DEFAULT 1; DECLARE silnia INT DEFAULT 1; REPEAT SET i=i+1; SET silnia=silnia*i; UNTIL i>=n END REPEAT; RETURN silnia; END
Funkcja – przykład(2) CREATE FUNCTION silnia1(n INT) RETURNS int BEGIN DECLARE i INT DEFAULT 1; DECLARE silnia INT DEFAULT 1; BEGIN IF (n=0) THEN RETURN 1; ELSE REPEAT SET i=i+1; SET silnia=silnia*i; UNTIL i>=n END REPEAT; RETURN silnia; END IF; END
Funkcja – przykład(3) CREATE FUNCTION shorten(s VARCHAR(255), n INT) RETURNS VARCHAR(255) BEGIN IF ISNULL(s) THEN RETURN ''; ELSEIF n<15 THEN RETURN LEFT(s, n); ELSE IF CHAR_LENGTH(s) <= n THEN RETURN s; ELSE RETURN CONCAT(LEFT(s, n-10), ' ... ', RIGHT(s, 5)); END IF; END
Procedury – składnia Tworzenie CREATE PROCEDURE (IN|OUT|INOUT zmienne typ) Pola IN określają parametry wejściowe Pola OUT określają parametry zwracane Pozostałe elementy – tak jak w funkcjach (zamiast FUNCTION należy wstawić PROCEDURE)
Procedury – przykład(1) CREATE PROCEDURE Studenci(OUT ile int) SELECT COUNT(*) INTO ile FROM Student Wywołanie CALL Studenci(@a); SELECT @a; CREATE PROCEDURE pobierz (out nazwa VARCHAR(50), in skrot VARCHAR(5)) BEGIN SELECT opis INTO nazwa FROM skroty WHERE skrot_id=skrot LIMIT 1; END
Wyzwalacze Pozwalają wykonywać ciąg poleceń SQL przed lub po jednym z poleceń INSERT, UPDATE, DELETE wykonanym na ustalonej tabeli Unikalne nazwy dla tej samej tabeli Brak możliwości wywołania CALL, poleceń transakcji wewnątrz wyzwalacza
Wyzwalacze - składnia(1) Tworzenie Tylko dla użytkowników z uprawnieniami SUPER CREATE TRIGGER nazwa BEFORE|AFTER INSERT|UPDATE|DELETE ON tabela FOR EACH ROW ciag polecen; Dostęp do kolumn rekordu OLD.nazwakolumny – wartość przed wykonaniem polecenia NEW.nazwakolumny – wartość po wykonaniu polecenia Usuwanie wyzwalaczy DROP TRIGGER nazwatabeli.nazwawyzwalacza Wyświetlanie SHOW TRIGGERS
Wyzwalacze - przykład CREATE TABLE test1(a1 INT); CREATE TABLE test2(a2 INT); CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY); CREATE TABLE test4( a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b4 INT DEFAULT 0 ); delimiter | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END; |
Wyzwalacze – przykład cd. delimiter ; INSERT INTO test3 (a3) VALUES (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL); INSERT INTO test4 (a4) VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0), (0); INSERT INTO test1 VALUES (1), (3), (1), (7), (1), (8), (4), (4);