Nyers SQL
Amikor SQL-t írsz - mindenhez, ami valóban emberi erőforrást igényel, sok mindent megtettek az injekció elkerülése érdekében.
Mindenki, aki hallotta az SQL injekcióból tudja, hogy (mintául a PHP-t fogom használni) az ilyesmi nem biztonságos:
$ sql = "SELECT * FROM ʻusers`. WHERE ʻuserName `=" {$ _POST ["felhasználónév"]} ". ÉS` pass` = "{$ _POST [" pass "]}"; ";
Varázslat
Aztán természetesen valakinek az az ötlete támadt, hogy "varázslatos menekülési idézetek" segítségével kezelje azokat a programbeviteleket, amelyeket nem megfelelően fertőtlenítettek, és amelyeket rossz gyakorlatok eredményeként közvetlenül az sql-be tettek. Ez nem igazán oldotta meg az SQL injekcióval kapcsolatos problémát, de azt jelentette, hogy az összes felhasználói bevitelt összekeverték.
Perjelek hozzáadása
Tehát néhány ember kikapcsolta a varázslatokat. Ezután az SQL pontja előtt elemezték a felhasználói adatbevitelt a addlashes ()
segítségével, amely elméletileg elkerül minden idézetet, és a hacker nem tudja megtenni a 'OR 1 = 1
-ot, de még az addlashes dokumentációja is azt mondja, hogy nem szabad használnia addlashes-eket, azt mondja, használja az adatbázis-specifikus függvényt, például a mysql_real_escape_string ()
-ot, de egyesek szerint ez még mindig nem elég.
Adatbázishoz tartozó perjelek hozzáadása
Tehát nem használhatunk DBMS-specifikus * _real_escape_string
-et, nem használhatjuk a perjeleket hozzáadva
, a "varázslatos idézetek" dolog sok kérdést okozott, és az internet tele van rövid megfogalmazott idézetekkel, például:
"Egy elkötelezett hacker megtalálja a módját, hogy átugorja az árajánlatok elől menekülve ciklusok, csak használja a DBAL előkészített utasításokat "- John Q bármely programozó
Oké, ez eléggé megijesztett ahhoz, hogy a utasításokat és a DBAL-t használjam. Valójában nem magyarázott semmit, de jól hangzik, mert sokat hallottam róla.
Előkészített állítások
Tehát most az OEM-et vagy a keretrendszer, vagy valami más, ami beburkolja az összes sql-t és biztosítja, hogy valaki ne futtathasson sql injekciót.
A kérdésem alapvetően "miért ne?", nem pedig "mit használjak?". Az internet tele van emberekkel, akik azt mondják, hogy használja ezt, vagy használja ezt, vagy bármit , de nincs magyarázat arra, miért kellett ezeknek a dolgoknak történnie.
Közvetlen kérdések
Pontos kérdések (emlékeztető, az SQL-ről kérdezem, a PHP egy példanyelv volt, mivel az SQL körüli rossz rep, a fogalmak univerzálisak):
- Miért nem kerülhetjük el az összes felhasználói bevitelt "varázslat"?
- Miért nem voltak "elég jók" az összecsapások?
- Mi a baj a DB-specifikus menekülési funkciók használatával, és miért volt jobb, mint az összecsapások?
- Miért üdvözlik az elkészített állításokat keretrendszerekkel és OEM-kel, mint az SQL aranystandardját? Miért jobbak? Miért nem tudok ezekkel SQL-injekciót végrehajtani, ahol azt a korábban említett eszközökkel megtehetném? Nem tud egy programozó valahogy ezt mégis elcseszni? Mire kell figyelniük?
- Egyéb aggályok, amelyeket nem vetettem fel?