Autor Zpráva
Lišák
Profil *
Dobrý den, snad mi někdo poradí, mám proměnnou kde mám obsáhlý mysql příkaz sestavený na jiné stránce, ale potřeboval bych tuto proměnnou ošetřovat na jakékoliv nebezpečné znaky, problém je ale v tom že pokud odeberu například ' , může mi příkaz pro mysql přestat fungovat i v případě že je vše korektně a uživatel tyto znaky nezadal. Dá se nějak docílit odstranění jen znaků které tam nemají co dělat? Děkuji!
TomášK
Profil
Nebezpečné nejsou ani tak znaky, které porušují syntaxi mysql, ale sql injection. A parsovat dotaz na to, jestli do něj někdo nepřidal něco škodlivého, je nepoužitelné. Konstrukcí, které by tam mohl někdo přidat a které by mohly uškodit bude asi hodně a musel byste ošetřit vešchny. Přechod na novou verzi by znamenal kontrolu, jestli nová verze nepřináší další možnosti útoku apod.
Řešení je ošetřit vstupy před tím, než se dostanou do dotazu, v okamžiku, kdy je dotaz sestavený, je už pozdě na to hledat v něm chyby.
Lišák
Profil *
Rozumím a myslel jsem si to, ale za dotaz nic nedám. Děkuji za odpověď. Připadá mi tedy má situace dost neřešitelná, dotaz se odesílá z pc nějakého klienta (stovky) a je vytvářen v C aplikaci a následně POSTem dopraven na server, ovšem postovat může pochopitelně kdo chce co chce a já tomu nezabráním...
TomášK
Profil
Řešení je nahradit POST něčím zabezpečeným, aby se uživatel musel identifikovat. Cesta nejmenšího odporu by asi byla doplnit aplikaci v C, aby přistupovala přímo k databázi, což chápu, že je poměrně náročné. Druhá varianta, která by mohla pomoct je spouštět přijaté dotazy s co nejmenšími nutnými právy. Pokud např. aplikace v C jen čte data a tyto data můžou být veřejně přístupná, pak by omezení práv jen na SELECT mohlo problém vyřešit.
AM_
Profil
Tvůj problém není ve speciálních znacích (na jejich ošetření jsou funkce jako mysql_escape_string), ale zřejmě skutečně v tom, že si tam kdo chce může poslat příkaz, jaký chce. Pak je skutečně nejlepší, aby se do PHP posílaly nějaké jednoduché příkazy, ze kterých až server udělá dotaz, který dělá jen to, co smí.
Lišák
Profil *
TomášK:
Přímý přístup k DB z C aplikace není možný, debuggerem se prý potom dají zjistit použité ověřovací údaje, takže je to jak to děláme asi jediným možným řešením, navíc při přihlášení k aplikaci dochází k zápisu dat, což znamená že se sice dá omezit výmaz, ale stejně se tím db dá dost nepříjemně narušit....
Řešením by asi bylo to co píše AM_, bohužel je ale dost pozdě toto předělávat, dám tam tedy asi jen co nejvíc bezpečnostních podmínek na každou proměnnou a podobně.

Díky!
Joker
Profil
Lišák
Pokud ta aplikace může posílat jen nějakou danou množinu dotazů, ještě by šlo ty dotazy parametrizovat.

Tj. aplikace by neposílala celý dotaz, ale možné dotazy by byly uložené na serveru a aplikace by poslala jen nějaký identifikátor, který dotaz chce, plus parametry.
Jack Finger
Profil
Nevím, jestli neplácám blbosti a ani tohle řešení mi nepřijde nejefektivnější, ale nevyplatilo by se v tomto případě nastavit magic_quotes_gpc na On? Anebo mi něco z té direktivy ušlo?
bohyn
Profil
Jack Finger
nevyplatilo by se v tomto případě nastavit magic_quotes_gpc na On
Urcite ne.

Anebo mi něco z té direktivy ušlo?
Ani ne tak u direktivy, jako v tom kde je problem.
Jack Finger
Profil
Ani ne tak u direktivy, jako v tom kde je problem.
Pak se omlouvám :)
Lišák
Profil *
Joker: Máte pravdu, asi by bylo nejideálnější z bezpečnostního hlediska posílat jen parametry plus případně jaký dotaz se má využít, časem to předěláme. Děkuji za diskusi.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: