sql >> Databáze >  >> RDS >> Mysql

Jsou tyto dvě funkce pro sanitaci přehnané?

Abych byl upřímný, myslím si, že autor těchto funkcí buď netuší, co jsou XSS a SQL injekce, ani co přesně použitá funkce dělá.

Abych jmenoval dvě zvláštnosti:

Dále:Obecně platí, že funkce, které chrání před XSS, nejsou vhodné k ochraně před SQL injekcemi a naopak. Protože každý jazyk a kontext má své vlastní speciální znaky, o které je třeba pečovat.

Moje rada je naučit se, proč a jak je možné vkládání kódu a jak se proti němu chránit. Naučte se jazyky, se kterými pracujete, zejména speciální znaky a jak jim uniknout.

Upravit Zde je nějaký (pravděpodobně divný) příklad:Představte si, že svým uživatelům umožníte zadat nějakou hodnotu, která by měla být použita jako segment cesty v URI, který používáte v nějakém kódu JavaScript v onclick hodnota atributu. Jazykový kontext tedy vypadá takto:

  • Hodnota atributu HTML
    • JavaScriptový řetězec
      • Segment cesty URI

A aby to bylo zábavnější:Tuto vstupní hodnotu ukládáte do databáze.

Nyní, abyste správně uložili tuto vstupní hodnotu do vaší databáze, stačí použít správné kódování pro kontext, který se chystáte vložit tuto hodnotu do vašeho databázového jazyka (tj. SQL); na zbytku (zatím) nezáleží. Protože jej chcete vložit do deklarace řetězce SQL, kontextové speciální znaky jsou znaky, které vám umožňují tento kontext změnit. Pokud jde o deklarace řetězců, tyto znaky jsou (zejména) " , ' a \ postavy, kterým je třeba uniknout. Ale jak již bylo řečeno, připravené příkazy dělají vše, co funguje za vás, takže je použijte.

Nyní, když máte hodnotu ve své databázi, chceme je správně vypsat. Zde postupujeme od nejvnitřnějšího k nejvzdálenějšímu kontextu a v každém kontextu použijeme správné kódování:

  • Pro segment cesty URI kontextu potřebujeme uniknout (alespoň) všem těm znakům, které nám umožňují tento kontext změnit; v tomto případě / (nechat aktuální segment cesty), ? a # (oba opouštějí kontext cesty URI). Můžeme použít rawurlencode za to.
  • Pro řetězec JavaScript kontextu, o který se musíme postarat " , ' a \ . Můžeme použít json_encode za tímto účelem (pokud je k dispozici).
  • Pro hodnotu atributu HTML musíme se postarat o & , " , ' a < . Můžeme použít htmlspecialchars za to.

Nyní vše dohromady:

'… onclick="'.htmlspecialchars('window.open("http://example.com/'.json_encode(rawurlencode($row['user-input'])).'")').'" …'

Nyní pokud $row['user-input'] je "bar/baz" výstup je:

… onclick="window.open(&quot;http://example.com/&quot;%22bar%2Fbaz%22&quot;&quot;)" …

Ale použití všech těchto funkcí v těchto kontextech není přehnané. Protože i když kontexty mohou mít podobné speciální znaky, mají různé únikové sekvence. URI má takzvané procentuální kódování, JavaScript má escape sekvence jako \" a HTML má odkazy na znaky jako &quot; . A nepoužít pouze jednu z těchto funkcí umožní narušit kontext.



  1. Chyba MySQL 1005?

  2. Upozornění:mysql_query():3 není platný prostředek MySQL-Link

  3. Oracle Shutdown error ORA-01033

  4. Pracovníci Rails Resque selžou s PGError:server neočekávaně ukončil připojení