2014-06-20 7 views
5

Ho cercato su google e non ho ancora trovato alcuna soluzione per il mio problema. Fondamentalmente ho un feed di commenti che è impostato all'interno di una galleria di immagini (simile a commenti di stackoverflow o di Facebook). Gli utenti possono postare commenti e leggere commenti postati da altri utenti. Funziona bene Tuttavia, se un utente tenta di inviare un commento con un apostrofo, ho un bel po 'di errore di applicazione web:Escape caratteri speciali in SQL INSERT INTO tramite C#

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

Il commento che sto postando a SQL è 81 di. Sto cercando una soluzione che sfugga allo a tutti i caratteri speciali in modo che qualunque sia l'utente digita, non importa cosa, non si verifica un errore.

Codice Dietro

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

Fetcher

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

Il tipo di dati è una stringa e ho anche provato a fare un .ToString() ma senza fortuna. Grazie in anticipo per qualsiasi informazione utile.

+1

Non fare questo! Ti stai aprendo a [SQL Injection attacks] (http://msdn.microsoft.com/en-us/library/ff648339.aspx). Cambia il tuo codice in modo da parametrizzare tutte le tue query. Sarai dispiaciuto diversamente –

risposta

7

È consigliabile utilizzare sempre querys parametrizzate. Essi consentono di evitare situazioni come quella che si sta avendo, così come 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

Grazie per le informazioni e le correzioni. Tutto funziona bene ora. –

3

è necessario duplicare il 'personaggio nei commenti

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

alternativa, ma più sicurezza, è quello di utilizzare il parametro Sql, ad esempio:

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

Questa sarebbe una correzione per il cerotto. Dovrei quindi farlo per tutti i personaggi speciali. Sto cercando una soluzione più permanente. Grazie per il consiglio però. Devo aggiornare la domanda per dichiarare "tutti i caratteri speciali" –

+0

*** Like *** ha caratteri speciali. Forse anche scappare. – Kiquenet

3

Si dovrebbe MAI fare questo ... perché permette una facile SQL injection. Potrei iniettare query SQL maligni attraverso un commento, qualcosa di simile ...

;drop database master; 

parametri di utilizzo, invece di evitare SQL injection

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