Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

Problem prilikom detaljne pretrage Baze MSSQL - C#2005

  • 30 odgovora
  • 10.591 pregleda

Najnovija ↓

Re: Problem prilikom detaljne pretrage Baze MSSQL - C#2005 10.08.2006. u 15:28 · pre 246 meseci #21
Citat:
Radice, ali uopste nije preporucljivo posto je podlozno SQL injection napadima. Dovoljno je da ukucam '; delete from Proizvodi; u bilo koji text box i da ti obrisem tabelu sa proizvodima. SQLParameters ima mehanizam zastite od ovog napada.

Pa ajde probaj tako nešto i videćeš da ti neće uspeti to što si naveo.
Upravo je to i svrha Prepare() metode za SqlCommand, da ako navedeš u tekst polju neku komandu da je NE IZVRŠI.

Izvršio bi je kada bi je sastavljao u slučaju
Code:

komanda.CommandText = "INSERT INTO TABELA VALUES(' + txtIme.Text + ',' + txtPrezime.Text + ')";


Potpis
Winners never quit, quitters never win.
Re: Problem prilikom detaljne pretrage Baze MSSQL - C#2005 10.08.2006. u 15:39 · pre 246 meseci #22
Citat:
mmix: Kao prvo, = operator ne radi sa NULLovima, x = NULL uvek vraca false; Ispravni operator je IS, tj
@par1 is NULL


Da, slazem se, moja greska, zurio sam ;)

A sto se tice stringova, sve su stringovi posto je na pocetku navedeno da koristi
Request.QueryString("Vrsta")
i to nadovezuje kao parametar SqlCommand objektu, bez upotrebe storovane procedure.
Potpis
Every hamster has his day.
Re: Problem prilikom detaljne pretrage Baze MSSQL - C#2005 10.08.2006. u 16:31 · pre 246 meseci #23
Citat:
VerbatimBOT: Pa ajde probaj tako nešto i videćeš da ti neće uspeti to što si naveo.
Upravo je to i svrha Prepare() metode za SqlCommand, da ako navedeš u tekst polju neku komandu da je NE IZVRŠI.



Code:

        [STAThread]
        static void Main(string[] args)
        {
            string emuliranitextBox = "''; delete from TempTable;";

            string command = "select * from TempTable where ";
            if (emuliranitextBox != "")
                command += "Polje = " + emuliranitextBox;
    
            // krajnji rezultat: select * from TempTable where Polje = ''; delete from TempTable;
            SqlConnection conn = new SqlConnection(connectionstring);
            conn.Open();
            SqlCommand cmd = new SqlCommand(command, conn);

            cmd.Prepare();  // iako nema nikakvog efekta, al ajde
            cmd.ExecuteNonQuery();
            conn.Close();
        }


I voila, TempTable je prazan....

Prepare nema efekta na ovu nasu pricu, on poziva sp_prepexec SQL sistemsku proceduru da "kompajlira" i izvrsi skript i ostavi ga u memoriji SQL servera kako bi pri visestrukom izvrsavanju preko sp_execute sa razlicitim parametrima ustedeo na vremenu. Bez Prepare, SQLCommand objekat koristi sp_executesql da direktno izvrsi skriptu sa parametrima, gde sp_executesql interno svaki put pozove sp_prepexec. Efektivno nista te ne sprecava da iskoristis sp_prepexec da izvrsis SQL injection napad. Zastitni sloj je ovde u samom SqlCommand objektu koji pri parsiranju parametara koje ce proslediti u sp_preexec/sp_executesql zamenjuje ' sa '' :) Ako nema parametara, nema ni parsiranja istih i SQL injection prolazi neotkriven.


Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Problem prilikom detaljne pretrage Baze MSSQL - C#2005 10.08.2006. u 16:54 · pre 246 meseci #24
Code:
cmd.Prepare();  // iako nema nikakvog efekta, al ajde


Pa naravno da nema kada ja celo vreme pricam o PARAMETRIMA komande!
Dakle: Ako se radi preko parametara, npr:
Code:

komanda.Parameters.Add(new SqlDbParameters("prezime", SqlDbType.VarChar, 25));
komanda.Parameters["prezime"].Value = txtPrezime.Text;
//... neki kod
konekcija.Open();
komanda.Prepare();
komanda.ExecuteNonQuery();
konekcija.Close();


Ako ovde probas da uneses u TextBox
Code:

txtPrezime.Text = "''; delete from TempTable;";

dzaba! Nece izvrsiti ovaj delete upit.
Ja sam samo ovo hteo da napomenem!
Potpis
Winners never quit, quitters never win.
Re: Problem prilikom detaljne pretrage Baze MSSQL - C#2005 10.08.2006. u 17:45 · pre 246 meseci #25
Citat:
VerbatimBOT: 
Pa naravno da nema kada ja celo vreme pricam o PARAMETRIMA komande!
Dakle: Ako se radi preko parametara, npr:

Ajd da ne bude da sam lud :), pogledaj svoju originalnu poruku, citirao si poruku od logic_rabbit i rekao da ce to resenje raditi (a njegovo resenje btw ne koristi parametre) na sta sam ja odgovorio da hoce ali je podlozno napadu. Otkud sad pominjes parametre kad ih nema u njegovom resenju (resenje sa paramterima je ponudio Fedya ako se ne varam)...


Citat:
VerbatimBOT: dzaba! Nece izvrsiti ovaj delete upit.
Ja sam samo ovo hteo da napomenem!

SQL Injection napad nece raditi sa parametrima nikad, cak i ako ne pozoves Prepare; sta vise ako text SQL komandu izvrsavas samo jednom nema apsolutno nikakve razlike u funkcionalnosti i performansama izmedju "sa" i "bez" poziva Prepare(). I to je bila moja napomenta, da Prepare() nema nikakve veze sa sprecavanjem SQL injection napada, on jednostavno sluzi za poboljsavanje performansi kada se ista komanda poziva vise puta sa razlicitim parametrima, nista vise. SQL injection sprecava parser parametara u SqlCommand objektu.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Problem prilikom detaljne pretrage Baze MSSQL - C#2005 11.08.2006. u 09:17 · pre 246 meseci #26
Hm... neka me neko ispravi ako gresim, ali kako se ovo naziva
Citat:

Mozda je bolje da dinamicki pravis sql upit kao npr.
Code:

if !(Textbox1.text=="")
{
SqlUpit+="AND Vrsta="+@Vrsta
}

Znaci da dinamicki dodajes novi "AND" ako je textbox za unos pun.

ako ne upit sa parametrima?
Kako god, umorio sam se od pisanja... Uostalom, onaj ko je trazio resenje, dobio ga je... tako da je sada svaka rec suvisna.
Potpis
Winners never quit, quitters never win.
Re: Problem prilikom detaljne pretrage Baze MSSQL - C#2005 11.08.2006. u 09:44 · pre 246 meseci #28
Citat:
cmd.Parameters.Add("@Vrsta", Textbox1.text);

Ovo bih podrazumevao. Jer pri kreiranju upita ide
Code:
SqlUpit+="AND Vrsta=@Vrsta";

tako da bi se javila greska (runtime) ukoliko se taj deo koda ne bi naveo.
Potpis
Winners never quit, quitters never win.
Re: Problem prilikom detaljne pretrage Baze MSSQL - C#2005 11.08.2006. u 14:03 · pre 246 meseci #29
Citat:
VerbatimBOT: Ovo bih podrazumevao. Jer pri kreiranju upita ide
Code:
SqlUpit+="AND Vrsta=@Vrsta";

tako da bi se javila greska (runtime) ukoliko se taj deo koda ne bi naveo.


Ah sad vidim gd je nastala konfuzija, on je zapravo napisao:

SqlUpit+="AND Vrsta=" + @Vrsta;

sto nije isto. Rezultat ovog koda nije "AND Vrsta = @Vrsta", posto @Vrsta nije string pod navodnicima u gornjem kodu nego varijabla. Tehnicki, ni ja ni ti nismo bili u pravu, posto @Vrsta cak ne moze ni da bude .NET varijabla (pocinje sa @), tako da njegovo resenje uopste ne bi ni radilo jer se ne bi ni iskompajliralo :). Toliko o tome...
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Problem prilikom detaljne pretrage Baze MSSQL - C#2005 14.08.2006. u 09:32 · pre 246 meseci #30
Cuo sam nesto o tome sql injection-u ali sad prvi put da to vidim.
Svaka cast na ovako zanimljivoj temi.
Vecina programera ne bi tako kompresivno razmisljala o tome vecina bi posegnula za jednostavnim resenjem koje sam naveo.
Potpis
logic_rabbit (MCAD,MCSD,MCT,MCTS-
Windows development,MCPD)
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme