Autor Zpráva
Celebi
Profil
Zdravím,
chtěl bych se zeptat, jak nějak globálně (nejlépe pomocí .htaccess) nastavit escapování všech proměnných (hlavně automatické escapování jednoduchých uvozovek ('), jde mi o zabránění SQL injekcím). Zatím jsem zkoušel nastavit v .htaccess php_flag magic_quotes_gpc On a php_value magic_quotes_gpc On, ale to mi SQL injekci nijak nezabránilo. Existuje nějaký způsob, jak to řešit jednoduše pro celý web, nebo musím každou escapovat zvlášť pomocí mysql_real_escape_string? (Používám PHP verzi 5.5.1 a hosting php5.cz.)
Předem děkuji.
juriad
Profil
Pořád dokola: neexistuje a ani nemůže escapovat žádné univerzalní escapování, vždy musíš escapovat pro konkrétní kontext.
http://phpfashion.com/escapovani-definitivni-prirucka

Pokud bys používal nějakou knihovnu pro práci s databází (třeba dibi), nebo alespoň mysqli_ (kde jsou prepared statements), tyto nástroje umí escapovat pro databázi.

Magic_quotes jsou omyl PHP, nepoužívej je. Byly dokonce odstraněny ve verzi 5.4, protože nechránily, ale naopak navozovaly falešný pocit bezpečí.
Celebi
Profil
Tak jsem zkusil použít na všechno mysql_real_escape_string, ale zjistil jsem, že z nějakého důvodu nefunguje všude tak jak má. Proto jsem se pokusil napsat jednoduché vlastní escapování, ale narazil jsem na zajímavou chybu, kterou nevím, jak vyřešit. Z nějakého důvodu se escapovaná proměnná neuloží.

Mám kód, přičemž do GET['id'] jde z URL adresy promměná o hodnotě a', ale správně se to escapuje jen při výpisu. Když chci $_GET['id'] trvale přepsat, tak se mi neuloží a pokud ho pak použiju v SQL dotazu, tak způsobí bezpečnostní chybu. Potřeboval bych, aby se mi to do té promměnné uložilo na stálo. Kód:
function esc($text) {
$text=str_replace("'", "\'", $text);
return $text; }

$_GET['id']==esc($_GET['id']);
echo $_GET['id']; //  Vypíše a'
echo esc($_GET['id']); // Vypíše a\'
Alphard
Profil
Zřejmě proto, že tam máte operátor porovnání a ne přiřazení.
Mimochodem, když to tak vidím, budou vaše stránky velká bezpečnostní katastrofa. Doporučuji na stránku s přihlášením uživatelům napsat velkým červeným písmem, že se do systému dostane kdokoliv :-) Jediné správné escapování pro databázi je escapování funkcí, kterou poskytuje příslušná extenze pro práci s databází.
Joker
Profil
Celebi:
Četl jste [#2]?
Co je na následujícím nepochopitelného?
juriad: „Pořád dokola: neexistuje a ani nemůže escapovat žádné univerzalní escapování, vždy musíš escapovat pro konkrétní kontext.

Nevymýšlejte vlastní escapovací funkce. Asi pro všechny kontexty které potřebujete používat už v PHP máte escapovací funkci, která bude fungovat lépe než cokoliv, co si napíšete sám.
Stačí ji použít.
Nicméně (opakování matka moudrosti) žádné univerzální escapování neexistuje, musíte escapovat ve chvíli kdy to potřebujete a pro kontext ve kterém se nacházíte.

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: