2016-08-01 6 views
0

Um Zeit zu sparen, schrieb ich ein SQL-Modul, das es mir erlaubt, Dinge in Kurzform zu schreiben, anstatt ein Objekt SqlCommand jedes Mal initialisieren zu müssen, wenn ich Abfragen innerhalb eines Moduls ausführen wollte.Verwenden von WCF-Service zum Behandeln von SQL-Abfragen

Ich versuche jetzt, dieses Modul aus Sicherheitsgründen in einen WCF-Dienst zu verschieben (verhindert, dass die Winforms-App direkt auf die Datenbank zugreift). ist

die folgende Funktion zum Abfragen der Datenbank und gibt ein DataTable der Ergebnisse verwendet

public DataTable FillTable(string sql) 
{ 
    query = new SqlCommand(); 

    query.Connection = conn; 
    query.CommandText = sql; 

    DataTable dt = new DataTable(); 

    try 
    { 
     conn.Open(); 
     dt.Load(query.ExecuteReader()); 
     conn.Close(); 
    } 
    catch (Exception ex) 
    { 
     conn.Close(); 
     Console.Write("fillTable: " + ex.Message); 
    } 

    return dt; 
} 

Da diese buchstäblich nur einen String als Eingabe verwendet, kann ich davon ausgehen, dass diese potenziellen Injection-Angriffe offen ist - trotz Wird es nicht direkt in der Datenbank ausgeführt? Wenn ein potenzieller Angreifer nur den Standort des Dienstes kennt (basierend auf der Dienstreferenz innerhalb der Anwendung), könnte die gesendete Zeichenfolge leicht ersetzt und nicht autorisierte Daten extrahiert werden?

Die Datenbank, mit der ich arbeite, ist nur klein, aber ich möchte sicherstellen, dass ich die Sicherheit richtig mache.

Natürlich weiß ich, ich könnte eine individuelle Funktion für jede Instanz schreiben, aber mit fast 100 Verwendungen innerhalb des Projekts bisher für diese Funktion allein, wäre es nicht nur ein Schmerz zu tun, sondern Wartung in der Zukunft wäre eine echte Kopfschmerzen

+1

Es gibt nicht viel zu sagen. Ja, Ihr Code ist sehr anfällig für jede Art von Injection – Steve

+1

Sie könnten dies als private Methode verwenden und verwenden. Sie müssen dies nicht als öffentlichen Webdienst bereitstellen. In jedem Fall muss jede API-Methode eine Authentifizierungs-/Berechtigungsprüfung haben. Wer diese Service-Methode nutzen will, muss das tun. – Aravind

+0

Gibt es einen besonderen Grund, warum Sie immer noch plain SQL verwenden, anstatt zu Entity Framework und linq zu wechseln, die von SQL Injection nicht betroffen sein können? –

Antwort

1

Der Server sollte der einzige sein, der diese Methode FillTable verwenden. Es muss für den Kunden nicht erreichbar sein.

Client sollte nur kjow, zum Beispiel, getBooks() und der Server ruft FillTable ("wählen * aus Bücher").

+0

Das war, was ich hoffte, ich könnte vermeiden, aber tief in der Tiefe denke ich, ich wusste bereits, dass es die einzige echte Methode war – Takarii

2

Ja, der Code kann leicht injiziert werden. Ein sicherer Weg wäre die Verwendung von Some ORM für diesen Zweck. Zum Beispiel Entity Framework oder Hibernate, werden sie Sie mit Themen wie SQL-Injection behandeln helfen usw.

OR

von @Fil sagte Wie Sie die Umsetzung von dem Benutzer verbergen, indem sie Einwickeln in einer externen Methode, die Sie Benutzern zur Verfügung stellen können.