2014-06-20 3 views
5

के माध्यम से SQL INSERT INTO में विशेष वर्णों से बचें मैंने Google की खोज की है और अभी तक मेरी समस्या के लिए कोई समाधान नहीं मिला है। असल में मेरे पास एक टिप्पणी फ़ीड है जो एक छवि गैलरी के भीतर स्थापित है (फेसबुक या स्टैक ओवरफ्लो टिप्पणियों के समान)। उपयोगकर्ता टिप्पणियां पोस्ट कर सकते हैं और अन्य उपयोगकर्ताओं द्वारा पोस्ट की गई टिप्पणियां पढ़ सकते हैं। यह ठीक काम कर रहा है।सी #

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

टिप्पणी है कि मैं एसक्यूएल करने के लिए पोस्ट कर रहा हूँ 81 के है: हालांकि, एक उपयोगकर्ता एपोस्ट्रोफ़ी साथ एक टिप्पणी पोस्ट करने का प्रयास करे, मैं एक अच्छी छोटी वेब अनुप्रयोग त्रुटि मिलती है। मैं एक समाधान चाहता हूं जो से बच जाएगा विशेष पात्र ताकि उपयोगकर्ता जो भी हो, चाहे कोई फर्क नहीं पड़ता, कोई त्रुटि नहीं है।

पीछे

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

फ़ेचर

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

डेटा प्रकार स्ट्रिंग है और मैं भी एक .ToString() लेकिन कोई भाग्य कर की कोशिश की है कोड। किसी भी उपयोगी इनपुट के लिए अग्रिम धन्यवाद।

+1

से बचने के लिए ऐसा मत करो! आप स्वयं को [एसक्यूएल इंजेक्शन हमलों] (http://msdn.microsoft.com/en-us/library/ff648339.aspx) पर खोल रहे हैं। अपना कोड बदलें ताकि आप अपने सभी प्रश्नों को पैरामीटर कर सकें। आपको अन्यथा खेद होगा। –

उत्तर

7

तुम हमेशा पैरामिट्रीकृत querys उपयोग करना चाहिए। वे आपको एक आप कर रहे हैं इस तरह की स्थितियों से बचने के साथ-साथ 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

जानकारी और सुधार के लिए धन्यवाद। सबकुछ अब अच्छा काम कर रहा है। –

3

आप टिप्पणी

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

वैकल्पिक रूप में 'चरित्र नकल करने की जरूरत है, लेकिन और अधिक सुरक्षा, Sql पैरामीटर का उपयोग करने, उदाहरण है:

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

यह एक बैंड-सहायता फिक्स होगा। मुझे तब सभी विशेष पात्रों के लिए ऐसा करना होगा। मैं एक और स्थायी फिक्स की तलाश में हूं। हालांकि सलाह के लिए धन्यवाद। मुझे "सभी विशेष पात्रों" को बताने के लिए प्रश्न को अपडेट करने की आवश्यकता है –

+0

*** *** की तरह विशेष पात्र हैं। शायद भी बचें। – Kiquenet

3

आप ऐसा कभी नहीं करना चाहिए ... क्योंकि यह आसान एसक्यूएल इंजेक्शन के लिए अनुमति देता है मदद करते हैं। मैं एक टिप्पणी के माध्यम से दुर्भावनापूर्ण एसक्यूएल प्रश्नों इंजेक्षन सकता है, कुछ की तरह ...

;drop database master; 

उपयोग मानकों के बजाय एसक्यूएल इंजेक्शन

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