2016-06-02 14 views
1

Escape (' ) symbol in Textbox for asp.net c#Der beste Weg parametrisierte Abfrage in C#

Basierend zu Debuggen auf die Frage in der Post über, die meisten Leute vorgeschlagen, dass „parametrisierte Abfrage“ ist die beste Lösung, um die SQL-Injection zu vermeiden.

Unten ist mein Code, indem Sie die SQL-Injection

public DataSet checkemp(string user) 
{ 
    strsql = "SELECT * from employee where employeeid = @userid"; 
    SqlConnection con = new SqlConnection(connectionString); 
    SqlDataAdapter da = new SqlDataAdapter(strsql, connectionString); 
    da.SelectCommand.Parameters.Add("@userid", SqlDbType.VarChar, 50).Value = user;  
    // pretend the user name is "Micheal" 
    con.Open(); 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 
    con.Close(); 
    con.Dispose(); 
    return ds; 
} 

Während der Fehlersuche verwendet wird, kann ich nur die Abfrage erhalten "SELECT * from employee where Employeeid = @userid" wenn ich auf "strsql" label zeigen, aber nicht „SELECT * from employee where Employeeid = 'Micheal'

Jede Lösung, um diese Frage zu lösen, schlug vor, und machen es die meisten Effizienz dank jeder

+0

Einfache Antwort ist nein, es ist nicht möglich, den Befehl als "SELECT * von Mitarbeiter, wo MitarbeiterID =" Micheal ". Bei Überstreichen von" Strsql ". –

+0

Sie können auch Profiler, um die tatsächliche SQL-Anweisung anzuzeigen ausgeführt auf Datenbank – Yogi

+0

Wenn Sie die Abfrage testen möchten, warum tun Sie es nicht in der SQL-Server – woodykiddy

Antwort

0

Versuchen Miniprofiler:.?!

"Ein ADO.NET-Profiler, auf rohe ADO.NET fähig Anrufe von Profilierungs"

http://miniprofiler.com/

public DataSet checkemp(string user) 
{ 
    strsql = "SELECT * from employee where employeeid = @userid"; 
    SqlConnection con = GetOpenConnection(connectionString); 
    SqlDataAdapter da = new SqlDataAdapter(strsql, connectionString); 
    da.SelectCommand.Parameters.Add("@userid", SqlDbType.VarChar, 50).Value = user;  
    // pretend the user name is "Micheal" 
    con.Open(); 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 
    con.Close(); 
    con.Dispose(); 
    return ds; 
} 

public static DbConnection GetOpenConnection(string connectionString) 
{ 
    var cnn = new SqlConnection(connectionString); 
    // wrap the connection with a profiling connection that tracks timings 
    return new StackExchange.Profiling.Data.ProfiledDbConnection(cnn, MiniProfiler.Current); 
} 

** Möglicherweise müssen SqlCommand mit ProfiledDbCommand

0

Ich würde einführen wickeln eine Erweiterungsmethode (obwohl dies nicht zwingend erforderlich ist, ist die tatsächliche Logik wichtiger), die die analysierte Abfrage wie folgt zurückgibt und diese nur während debug mode:

aufruft
public void TestMethod() 
{ 
    string cmdStr = "<some sql command text>"; 
    SqlConnection con = new SqlConnection(connectionString); 
    SqlCommand cmd = new SqlCommand(cmdStr, con); 
    cmd.Parameters.AddWithValue("<param1>", <value1>); // add parameter in any way you want 
#if DEBUG 
    string parsedQuery = cmd.GetParsedQuery(); 
    Console.WriteLine(parsedQuery); // or whatever 
#endif 
    SqlDataAdapter da = new SqlDataAdapter(cmd); 
    con.Open(); 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 
    con.Close(); 
    con.Dispose(); 
    return ds; 
} 

public static string GetParsedQuery(this SqlCommand cmd) 
{ 
    if(cmd.CommandType == CommandType.Text) 
    { 
     string parsedQuery = cmd.CommandText; 
     foreach(var p in cmd.Parameters) 
     { 
      parsedQuery = parsedQuery.Replace(p.ParameterName, Convert.ToString(p.Value)); 
     } 

     return parsedQuery; 
    } 

    return null; 
} 

Beachten Sie, dass, obwohl ich direkt die Erweiterungsmethode (für die Kürze) geschrieben habe, sollte es wirklich in einer separaten statischen Klasse definiert werden.