2014-06-20 9 views
5

Ich habe google gesucht und habe keine Lösung für mein Problem gefunden. Grundsätzlich habe ich einen Kommentar-Feed, der innerhalb einer Bildergalerie eingerichtet wird (ähnlich wie Facebook oder stackoverflow Kommentare). Benutzer können Kommentare schreiben und Kommentare von anderen Benutzern lesen. Das funktioniert gut. Wenn jedoch ein Benutzer einen Kommentar mit einem Apostroph zu schreiben versucht, erhalte ich ein netten kleine Web-Anwendungsfehler:Escape Sonderzeichen in SQL INSERT INTO via C#

Incorrect syntax near 's'. Unclosed quotation mark after the character string ')'.

Der Kommentar, den ich SQL bin Entsendung sind 81 Jahre. Ich möchte eine Lösung, die alle Sonderzeichen entgeht, so dass, was auch immer der Benutzer eingibt, egal was, nicht aus.

Code hinter

Fetcher.postUserComments(connectionString, imagePath, comments.ToString(), userId); 

Fetcher

sqlCom.CommandText = "INSERT INTO dbo.Table(userId, imagePath, userComments, dateCommented) VALUES ('" + userId + "', '" + imagePath + "', '" + comments + "', '" + theDate + "')"; 

Der Datentyp String ist, und ich habe auch versucht, ein .ToString() aber kein Glück zu tun. Vielen Dank im Voraus für hilfreiche Informationen.

+1

Tu das nicht! Sie öffnen sich für [SQL Injection-Angriffe] (http://msdn.microsoft.com/en-us/library/ff648339.aspx). Ändern Sie Ihren Code, damit Sie alle Ihre Abfragen parametrisieren. Es wird dir sonst leid tun. –

Antwort

7

Sie immer parametrisierte querys verwenden soll. Sie helfen Ihnen, Situationen zu vermeiden, wie die, die Sie haben, sowie SQL Injection attacks

sqlCom.CommandText = "INSERT INTO dbo.Table(userId, imagePath, userComments, dateCommented) VALUES (@userId, @imagePath, @userComments, @dateCommented)"; 

sqlCom.Parameters.AddWithValue("@userId", userId); 
sqlCom.Parameters.AddWithValue("@imagePath", imagePath); 
sqlCom.Parameters.AddWithValue("@userComments", comments); 
sqlCom.Parameters.AddWithValue("@dateCommented", theDate); 
+0

Vielen Dank für die Informationen und Korrekturen. Alles funktioniert jetzt gut. –

3

Sie müssen die "Zeichen in den Kommentaren

comments = comments.Replace("'", "''"); 

Alternativ duplizieren, aber mehr Sicherheit, ist Sql Parameter zu verwenden, zB:

cmd.CommandText = "SELECT * FROM Client, Project WHERE Client.ClientName = @ClientName AND Project.ProjectName = @ProjectName"; 

cmd.Parameters.Add(new SqlParameter("@ClientName",client.SelectedValue)); 

cmd.Parameters.Add(new SqlParameter("@ProjectName",projnametxt.Text)); 
+0

Das wäre ein Pflaster-Fix. Das müsste ich dann für alle Sonderzeichen machen. Ich suche eine dauerhafte Lösung. Vielen Dank für den Hinweis. Ich muss die Frage aktualisieren, um "alle Sonderzeichen" anzugeben. –

+0

*** Like *** hat Sonderzeichen. Vielleicht auch entkommen. – Kiquenet

3

Sie sollten dies nie tun ... weil es für eine einfache SQL-Injection ermöglicht. Ich konnte bösartige SQL-Abfragen über einen Kommentar, so etwas wie ...

;drop database master; 

Verwendung Parameter statt spritzen zu vermeiden, SQL-Injection

command.Parameters.Add(new SqlParameter("@Param", value));