Proč není v ASP.NET funkce addslashes? A jak tedy chránit databázi před Sql-injection?
- Vložil Trupík 3/17/2006 6:58:32 PM
-
Jak je známo, textům zadaným uživatelem nelze věřit a je třeba
uživatelské vstupy kontrolovat.
Jazyk PHP obsahuje několik funkcí pro ošetření uživatelských
vstupů.
Do první skupiny patří funkce, které ošetřují vypisování
uživatelem zadaného textu do těla stránky (a chrání tak
před Cross Site Scripting) - jsou to funkce
htmlentities a htmlspecialchars
a možná nějaké další. Ty zakódují
speciální HTML do jim odpovídajících HTML entit
(tedy především znak
< se zakóduje na < a > na >.
Další skupina ošetřuje vstupy před uložením do databáze. Tam je potřeba
dávat pozor na znaky jednoduchých a dvojitých uvozovek a zpětného lomítka,
které mají speciální význam v jazyce SQL. Některé servery s PHP mají zapnuté
tzv. Magic Quotes, které toto ošetření dělají automaticky, pokud zapnuté nejsou
je třeba použít funkci addslashes. Tyto prostředky chrání před tzv. Sql-injection.
V ASP.NET je třeba samozřejmě vstupy ošetřovat taktéž. K funkci htmlentities
z PHP existuje ekvivalentní metoda HtmlEncode. Navíc pokud nedůvěryhodný text
vypisujete v komponentě GridView, stačí danému sloupci nastavit vlastnost
HtmlEncode na true a dosáhnete téhož. Viz upravený příklad z MSDN:
<h3>BoundField Example</h3>
<asp:gridview id="CustomersGridView"
datasourceid="CustomersSqlDataSource"
autogeneratecolumns="false"
allowpaging="true"
runat="server">
<columns>
<asp:boundfield datafield="CustomerID"
readonly="true"
headertext="Customer ID"/>
<asp:boundfield datafield="Address"
htmlencode="true"
headertext="Address"/>
<asp:boundfield datafield="City"
htmlencode="true"
headertext="City"/>
</columns>
</asp:gridview>
Co se týče ochrany vstupů ukládaných do databáze, žádnou funkci jako je addslashes
v PHP v ASP.NET nenajedete - jednoduše proto, že není potřeba.
Databázi se totiž neposílají příkazy přímo, ale pomocí objektu SqlCommand.
Vlastonst SqlCommand.CommandText určuje, jaký příkaz bude proveden a je typu string.
Nedoporučuje se ale CommandText nastavovat nějakým řetězcem,
který vznikl sčítáním
řetězců určených programátorem spolu s řetězci uživatelského vstupu.
Nikdy byste tak neměli napsat něco takového:
SqlCommand sqlcomm = new SqlCommand();
sqlcom.CommandText =
"Select * from Products where productId = '" + pid + "'";
Je sice pravda, že byste mohli napsat nějakou vlastní funkci, která třeba pomocí
regulárních výrazů a nahrazování podřetězců provoede to, co dělá addslashes v PHP,
ale i tak, jeden nikdy neví, navíc existuje mnohem čistší přístup - použít
parametrizovaný dotaz. Předešlý kód upravíme takhle:
SqlCommand sqlcomm = new SqlCommand();
sqlcomm.CommandText =
"Select * from Products where productId = @pid";
sqlcomm.Parameters.AddWithValue("@pid", pid);
I když v kódu přímo explicitně žádné escapování neprovádíme, o veškerou
bezpečnost se již postará objekt SqlCommand, hodnotu parametru před provedením
příkazu sám upraví
tak, aby neobsahoval žádné nebezepečné sekvence znaků.
Ohodnoťte prosím užitečnost článku