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.
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ć