SQL Server - baza podataka i sigurnost

Pozdrav!

Imam pitanje u vezi sigurnosti baze podataka;

Jasno je meni sve u vezi kreiranja nekakvog korisnika, kojemu se onda mogu zadat određena ovlaštenja(primjer: da može samo čitati podatke - SELECT, . . .), ili recimo kreirat poglede, pa da ograničimo pristup nekim stupcima,. itd

Konkretno me zanima kakvu to primjenu ima u nekoj aplikaciji? Imam bazu i radim windows aplikaciju(VS 2010, programski jezik C#), pa me zanima kako meni sve to(vezano uz sigurnost) može koristiti u aplikaciji? Primjer: da se (u aplikaciji) provjeri koji je user ulogiran na serveru, te da taj user onda ima i ovlaštenja - ovisno o tome koja sam mu pridodjelio.

Nadam se da sam bio jasan. Hvala

Jednostavno. Kreiraš korisnika u MS SQL Serveru i onda njemu dodaš prava koja mu trebaju. Nakon toga se iz tvoje aplikacije korisnik spaja s tim SQL Server loginom na bazu.

Sad ako ti treba više različitih razina i do se da odraditi, nisam baš doma s tim stvarima, ali nekom logikom stvari bi bilo ok napraviti jednu tablicu u kojoj ćeš spremati vrstu korisnika koji koristi tvoju aplikaciju i korisnički login SQL servera koji ima određena prava. Na tu tablicu kreirati view koji ima dopuštenje samo za čitanje ne znam dali postoji anonymus korisnik za SQL server.

Nakon što si pročitao kojoj grupi korisnika pripada taj korisnik koji se ulogirao povućeš taj login i koristiš ga za spajanje na bazu iz svoje aplikacije.

Ne znam da li sam bio najjasniji ali se nadam da si donekle shvatio što sam htio reći.

Ima tu i pamenijih od mene što se tiče tih stvari pa se nadam da će i oni nadodati koju na ovo moje.

[quote=“SILE_090”]Konkretno me zanima kakvu to primjenu ima u nekoj aplikaciji?[/quote]Zašto bi to imalo primjenu u aplikaciji i što bi uopće to značilo?

Aplikacija je samo klijent koji služi korisniku da dodaje/briše/ažurira zapise u bazi podataka, te izrađuje izvještaje. Sve te operacije bi korisnik mogao činiti tako da se izravno prijavi na poslužitelj baze podataka i izdaje naredbe u SQL-u, te pokreće pohranjene procedure. Naravno, to bi bilo vrlo nepraktično i neprikladno. Stoga on koristi aplikaciju kako bi iste te operacije obavljao preko ergonomskog korisničkog sučelja.

Dakle, nakon što u aplikaciju unese svoje podatke za prijavu na bazu podataka, svaka daljna operacija koju korisnik pokrene
kroz aplikaciju će se izvršiti uspješno ili rezultirati pogreškom, ovisno o tome kakva prava nad podacima ima u bazi podataka dodjeljen taj korisnički račun.

Aplikacija nije ništa drugo doli, kako se engleski to veli, “glorificirana” konzola servera - upravo ona koju ti koristiš za rad s bazom (mysql ili SQL Management Studio ili Toad ili sl.)

[hr][/hr]

Zbog toga što su se baze podataka odlično uklopile u komponentnu paradigmu razvoja softvera, pa ih je vrlo jednostavno uključiti u bilo koji scenarij, one se vrlo često koriste kao nekakva prikladna skladišta podataka za aplikacije koje nisu primarno namijenjene manipulaciji podacima. Primjerice, umjesto u nekakvim informacijskim sustavima - od bankarskih, preko knjigovodstvenih, do aplikacija za videoteke, baze podataka se često uključuju kao komponente programa igrica, softvera za nadzor ili upravljanje ili sl. Tamo razmišljati o korisnicima na razini baze podataka i nije prva stvar koja bi ti trebala pasti na pamet u pogledu osiguravanja pristupa procesu kojim se kroz program upravlja.

Ne zaboravi da autentifikacijski podsustav ima i sam operacijski sustav, pa čak i da se autentifikacijski sustav OS-a može povezati s onim od baza podataka (SSPI kod Windowsa). Koristiti login korisnika u OS-u može biti u nekim slučajevima prikladnije, pogotovo ako se računala nalaze u domeni.

[hr][/hr]

Konačno, kao pomalo specifična kategorija su se razvile web-aplikacije koje mogu imati tisuće nepoznatih korisnika. Vidim da se u praksi za takve aplikacije razvija vlastiti sustav autentifikacije (npr. “Forms authentication” u ASP.NET-u, a i “Basic HTTP authentication” bi se mogao ovdje uključiti, u Apacheu podržano kroz htaccess i htpasswd i sl.). Ovome se pribjegava vjerojatno zato što bi bilo teško upravljivo imati tisuće korisničkih računa otvorenih od strane nepoznatih ljudi u OS-u ili u bazi podataka. Međutim, ako se radi o web-aplikaciji koju koriste dobro poznate osobe (npr. zaposlenici nekog poduzeća), korištenje sustava baze podataka ili OS-a (integrirano s bazom) je opet u igri.

Ok, ovo kužim; da kreiram neku tablicu s korisnicima koji će korisiti aplikaciju, itd. Ali, nakon šta dohvatim taj login, trebam ga iskoristit da se sa njim spoji na bazu iz aplikacije, na način da se u konekcijski string upiše username i password? Kojom naredbom onda upisat baš taj username u config file-u(u konekcijski string)?

uvijek mozes napisati dio vlastitog koda koji s jedne strane odrzava bazu
a s druge keshira podatke ubrzavajuci rad klijentskog dijela kriptirajuci
i komprimirajuci promet izmedju 2 vlastita koda koji onda ne ovisi o
sikjuritiju same baze ili os.a. Logove kad se sto dogadjalo, sto je radio
po bazi, sto se dogadjalo u njoj, resursima, kapaciteti i slicno pohranjuje
lokalno za svoje potrebe i radi izvjestaje po potrebi

Imam još jedan problem, u vezi ovoga; kreirao sam tablicu u bazi, sa korisnicima koje sam kreirao u SqlServeru. Sada u kodu(u jednoj formi) imam 2 text polja u koje korisnik unosi username(sqlServer login) i password, te nakon pritiska na gumb, ja u eventu od buttona provjeravam dali taj korisnik postoji u bazi, te ovisno o tome (ne)dopuštam odlazak na drugu formu.
Problem mi je kod upisa username i passworda u konekcijski string koji je naravno u app.config file-u. Recimo, ako se ulogiram kao korisnik ‘gost’, ne bi smio ubacivati nove zapise u bazu(jer sam stavio SELECT ograničenje), ali on ipak može unositi nove zapise u bazu.
Evo dijela koda, pa ako netko zna kako bih mogao dohvatiti CS iz config file-a, te napraviti update: da se zapišu te kredencije u CS.

public LoginForm()
{
InitializeComponent();
zaKonekciju = “Data Source=imeServera; Initial Catalog=imeBaze; Integrated Security=SSPI”; //služi mi samo do mogu napraviti sql upit sa kojim ću provjeriti dali postoji taj korisnik
}

private vodi button1_click(. . )
{
//sada tu dohvacam u 1.string username a u drugi password
string isLogIn=null;
using(SqlConnection conn = new SqlConnection(zakonekciju))
{
SqlCommand comm = new SqlCommand();
string queryString = “SELECT username FROM SqlKorisnici WHERE pasword= '” + pass + “’”;
comm.CommandText = queryString;
comm.Connection = conn;
conn.Open();
isLogIn = System.Convert.ToString(comand.ExecuteScalar());
conn.Close();
}
if(isLogIn.Length >0)
{
//ako je ovo istinito, znaci da je pronasa korisnika, te sada bi trebalo(barem mislim) upisati kon. string
//i onda preusmjeravam na drugu formu, a ovu zatvaram.
}
}

Hvala na pomoći.