Ahoj všem,
rád bych znal názor zkušenějších na následující problematiku:
1. Programuji webovou aplikaci větších rozměrů. Je zde kladen velký důraz na bezpečnost celé aplikace a nyní jsem ve fázi, kdy řeším SQL injection - tedy ošetření formulářů a URL adres.
2. Ze specifických důvodů (nebudu rozvádět) musím použít v několika případech celé části SQL dotazu v proměnných, které předávám přes URL - např. výsledná $_GET['page'] = "p1 ='0' OR p1 = '1' "; - tato proměnná se následně vkládá přímo do SQL dotazu. Nemohu tedy použít na obrazu před SQL injekcí klasické opatření nahrazením proměnných např. otazníkem a jejich vložení do dotazu až následně. Stejnětak nemohu použít escapování (a ani nechci, je to starý a děravý způsob). Vymyslel jsem následující bezpečnostní řešení a rád bych znal vaše názory na něj, popř. jak ho prolomit :D
a) Ošetření proměnných přes URL: Vycházím z faktu, že každá proměnná předávaná URL adrese, ve které je potřeba použít část SQL dotazu má předem známé hodnoty (to je fakt v této aplikaci). Tzn. buď A nebo B nebo C. Proto v rámci zabezpečení nebudu předávat do SQL dotazu přímo proměnnou $_GET['x'], ale nejprve ji proženu přes podmínku if $_['x'] = výraz A nebo výraz B nebo výraz C - jen pokud je splněna tato podmínka, tak definuji proměnnou A, B nebo C a až tuto použiji v samotném SQL dotazu. Tím předpokládám, že URL adresy budou zcela neprůstřelné a 100% bezpečné.
b) Ošetření formulářů (např. přihlášení apod): Použít escapování se mi nezdá bezpečné, umím jej prolomit :). První věc - pro psaný text používám TinyMCE a zde vnímám současné zabezpečení TEXTAREA vstupu uživatele jako dobré. Zbývá ošetřit prvky typu INPUT a zde zcela striktně proženu nejprve každou hodnotu z formuláře přes kontrolu tzn. ze speciálních znaků povolím pouze ampersant (ten se někdy používá v názvech např. hotel & restaurant), zbytek ze vstupu zcela odstraním (tedy veškeré druhy uvozovek, rovnítka, apod. a také slova jako DELETE či TRUNCATE apod.) a až teprve potom vložím výsledek do druhé proměnné a tu následně použiji v SQL dotazu... Prolomíte?
Díky všem za odpovědi.