SQL injectie

Status
Niet open voor verdere reacties.

Myclos81

Gebruiker
Lid geworden
17 nov 2007
Berichten
157
Beste,

ik gebruik onderstaande functie voor het opvullen van een dataset met klantgegevens. Hierbij gebruik ik parameters om SQL injectie te voorkomen maar hij geeft een syntax error als ik bijvoorbeeld d'hondt invoer.

SQL laag:

"SELECT * FROM CUSTOMER WHERE customer.lastname LIKE '" + @input + "'";
DataAccess dataAccess = new DataAccess();
dataAccess.AddParameter("@input", input);
return dataAccess.GetDatasetResult(_sql, "CUSTOMER");


DataAccess laag:
public DataSet GetDatasetResult(string sql, string tableName)
{
DataSet ds = new DataSet();
IEnumerator enumerator = _parameterList.GetEnumerator();
_odbcConnection = new OdbcConnection(ConnectionString);
_odbcCommand = new OdbcCommand(sql, _odbcConnection);
if(sql == null) throw new ArgumentNullException("sql");

while (enumerator.MoveNext())
{
_odbcCommand.Parameters.Add(enumerator.Current);
}
OdbcDataAdapter da = new OdbcDataAdapter(_odbcCommand);
if (tableName == string.Empty)
{
da.Fill(ds);
}
else
{
da.Fill(ds, tableName);
}
return ds;
}
 
Deze manier van werken voorkomt in principe geen SQL injectie. Zolang je "input" niet eerst correct schoonmaakt, is deze manier van werken prima te injecteren.

Probeer deze naam eens:

a' or '1'='1
 
Als ik dat doe, dan geeft hij blijkbaar alles?

Wat bedoel je dan met "schoonmaken" maw hoe kan ik SQL injectie dan voorkomen ?
 
En het teruggeven van alle data is een goed geval van SQL injectie :P . Het gebruik van parameters is in principe goed, maar het is het beste om dan een databasetype mee te geven.

Zie ook hier: http://msdn.microsoft.com/en-us/library/ms161953.aspx

Je kunt ook characters zoals ' vervangen door \' De database zal dan de ' letterlijk nemen in plaats van een onderdeel van het commando.
 
@nestles dat is echter PHP. In PHP is het een stuk eenvoudiger. Dit is echter C#
 
Beste,

bedankt voor de link maar volgende regel werkt niet: String EncodedString = Server.HtmlEncode(TestString);
"The name 'Server' does not exist in the current context"
 
Stored procedures

Ik zou stored procedures gebruiken en @input als parameter meegeven dat voorkomt veel problemen.
Uiteraard nog steeds de waarde van @input controleren en System.Web.HttpUtility.HTMLEncode.

Om naar een tekst als d'hondt te zoeken dien je de ' te replacen naar '' (dubbele singlequote).
 
Probeer je input te controleren. 'Never trust user input'.

Zoals all eerder gezegd moet je de query opschonen alvorens deze uit te voeren. Het volgende artikel op codeproject.com legt uit hoe je SQL injecties in C# kunt tegengaan:

Code:
http://www.codeproject.com/Articles/9378/SQL-Injection-Attacks-and-Some-Tips-on-How-to-Prev
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan