Nevim jak je to u MySQL, opustil jsem ji kdysi u verze 3, ale u MSSQL se domuhle nechá předejít používáním procedur a tam pak opravdu není prostor pro injecting (pokud teda někdo nevolá exec na parametr, ale to je čuňárna sama o sobě).
V případě použití nástrojů jako je LINQ pak injecting asi opravdu nemá smysl.
Jinak já předcházím problémů s injectingem striktní bezpečnostní politikou, tj. účet, přes který se web připojuje k DB, má pouze ta práva, která potřebuje a ani o jedno navíc, stokrát jsem se setkal s plným read/write zápisem a to si pak programátor opravdu koleduje.
Kombinací těchto praktik se nechá injecting hodit za hlavu. Nebo se mýlím?
Procedury to zesloziti, ale princpipielne to nevyresi. Kdyz budete mit treba proceduru 'vyber_zbozi(idkategorie)', tak ja misto cisla kategorie dam retezec '0); update zbozi set cena=cena/10; neco_co_ma_smysl(', tak se mu ten update provede.
Prinicipielne to resi, jak uz tu nekdo podotkl, striktni pouzivani parametrizovanych dotazu misto lepeni SQL. Pritom to je odolne proti chybam; AddSlashes() zapomenout lze, ale "omylem" pouzit neparametrizovany dotaz je uz dost tezke :-D
To neni pravda - procedury pouzivaji parametrizovane (v kontextu presneji prepared) dotazy. Parametry procedure se predavaji binarne - tj. pokud bude idkategorie integer, tak pri volani call vyber_zbozi('0...') tak samozrejme dojde k vyvolani vyjimky, jelikoz dany retezec system nedokaze pretypovat na integer.
Z principu parametrizovane dotazy maji tutez (absolutni) odolnost vuci SQL injektazi jako ulozene procedury - jelikoz je interne procedury pouzivaji. Mluvim o parametrizovanych dotazech implementovanych na strane serveru - totez na strane klienta, coz nektera API dokazi, vuci SQL injektazi odolna nejsou.
Pokud do parametru kategorie dam urcity retezec, muzu vytvorit statement:
call vyber_zbozi(0); update zbozi set cena=cena/10; call vyber_zbozi(1);
To je SQL injection - posle se jine SQL a procedury tomu nezabrani. Co v tomhle konkretnim pripade pomuze je to, ze MySQL driver pro PHP provede pouze to prvni statement a dalsi ignoruje, takze realna zneuzitelnost tohoto injection neni. Ale to je vec driveru; u jinych driveru / jazyku tomu muze byt jinak.
to je pravda - i prikaz CALL je SQL prikaz, takze je potreba je volat parametricky - vyhoda ulozene procedury je ta, ze se musite soustredit pouze na bezpecne zavolani prikazu CALL. Vse ostatni je jiz bezpecne.
Jistě že pokud lepíte i samotné volání procedury, pak je to to samé, ale nikdy by mě nenapadlo posílat parametry lepením, na to je v C# AddParameterWithValue, kam vložíš samotný parametr, ve zkompilované proceduře už pak jakýkoliv pochybný parametr nemá smysl ... znovu opakuji, pokud nepoužíváte exec nebo sp_execute nebo tak nějak, to pak vám nic nepomůže.
Věřím že PHP něco podobného také má, nebývalo to ale zvykem před lety, když jsem PHP opustil. Stejně si ale myslím, že většina programátorů v PHP používá "staré dobré praktiky" lepení všeho dohromady.
Přebíral jsem několik projetků v C# a nelepí jen programátoři v PHP, i když bych řekl, že když už někdo jde to C# nebo Javy, asi už něco o programování ví, v PHP programuje asi každý...