Jistě že PreparedStatement je řešení, ale také ne vždy, protože už jsem viděl mnoho DB, kde se spouštěly "stored procedures" s parametrama, ve kterých pak následně byl exec(SQL) nebo sp_execute nebo něco takováho a script na konci stejně injektovaný script spustil, takže pro javu platí stejně jako pro cokoliv ostatního.
Jinak v .NET je DLINQ, v rámci kterého toto opravdu nelze přejít, ale to zase nelze použít vždy.
Kontrola vstupních dat se musí provádět vždy a u každého programu Pro programátora by měla být naprostou samozřejmostí . Vzpomínám si, že u některých programů představovala validace dat i více než 50% práce. (To ještě nebyly k mání regulární výrazy). Bohužel - pokud si autor tuto práci ušetří, zákazník to včas nezjistí. A to je ten problém.
Je to šmejd a podvod na zákazníka - asi jako švestková povidla s jablečnou dření nebo špekáčky se sójou. (Tedy něco, co je dnes naprosto běžné - bohužel).
Zvykáme si, že za levný peníz je pouze náhražka - nebo-li předražený šmejd. Nedivme se, že to proniká i do této profese.
Taky bych to takhle videl. Dalsi vec je take to, ze kdyz uz nekdo programuje neco v jave, jedna se zpravidla o vetsi vec, ve ktere uz se pouzivaji objektove-relacni mapovaci frameworky jako je ibatis nebo hibernate, kde se pouzivaji prepared statementy, jak psal kolega prede mnou.
prosímvás, nepřebrat cokoliv přímo z parametrů je stejná zásada jako nepokládat holou ruku na rozpálený kamna. toto je zásada kterou jsem se velmi záhy naučil před dávnými lety při psaní cgi v shellu - to je aspoň prasárna ;-) - a platí pro všechno programování v čemkoliv a čehokoliv. pokud toto někdo nedodržuje, neumí programovat.
Ono je tezke potkat dokumentaci k SQL API v libovolnym jazyku, kde by k tomu nenabadali;)
Vetsinou jeste uvednou priklad jak se to nema delat, aby zduraznili mozny bezpecnostni problem, ale jak je vedit spousta "programatoru" tu dokumentaci necte a nema ani tuseni ze neco takovyho hrozi.
A neni to jen SQL-injection ale bezpecnostim otazkam vubec spousta lidi nevenuje pozornost, a podle toho ty weby vypadaj.
To je stejné, jako se hádat, zda memory (resource) leaky souvisejí s jazykem. Některé jazyky to dělají snazší a některé těžší, ale možné je to ve všech.
Ra100 tym chcel povedat, ze vyukove materialy nabadaju k pouzitiu prepared statementov. Pokial je vsak programator nedosledny a lenivy, tak to moze pisat v com chce a nikto mu nezabrani to napisat nespravnym sposobom.
> Je důležité si uvědomit i to, že SQL injection nemá nic společného s jazykem, ve kterém je webová aplikace napsaná
Tak s tymto by som dost nesuhlasil aj ked dovody nie su technicke, ale socialne.
Vsetci Javovsky programatori uz od zakladnych tutorialov vedia, ze SQL string sa nema vyskladavat z textov co zadava uzivatel, ale maju pouzivat PreparedStatement, teda posielat parametre do SQL. Dokonca niektore nastroje na staticku kontrolu kodu na tuto chybu upozornuju ( FindBugs ) .
Pravdupovediac, rovnako sa to da osetrit v PHP alebo ASP, ale z mne neznamych dovodov na to tie lamy kaslu.