2008-10-23 10 views
13

मेरे पूर्ववर्ती से कुछ कोड पर ले रहा है और मैं एक प्रश्न की तरह ऑपरेटर का उपयोग करता है पाया: आपूर्तिकर्ताओं कहां '%' + नाम +% 'की तरह supplier_name सेपैरामीटर का उपयोग कर ऑपरेटर की तरह एसक्यूएल क्वेरी में एसक्यूएल इंजेक्शन से बचें?

चुनें *;

एसक्यूएल इंजेक्शन समस्या से बचने और इसे पैरामीटर करने की कोशिश कर रहा है, लेकिन मुझे पूरा यकीन नहीं है कि यह कैसे पूरा किया जाएगा। कोई सुझाव ?

नोट, मुझे क्लासिक ADO.NET के लिए एक समाधान की आवश्यकता है - मुझे वास्तव में इस कोड को LINQ जैसे कुछ स्विच करने के लिए आगे बढ़ना नहीं है।

उत्तर

17

उपयोग कर रहे हैं इस प्रयास करें:

var query = "select * from foo where name like @searchterm"; 
using (var command = new SqlCommand(query, connection)) 
{ 
    command.Parameters.AddWithValue("@searchterm", String.Format("%{0}%", searchTerm)); 
    var result = command.ExecuteReader(); 
} 

ढांचे स्वचालित रूप से हवाले से मुद्दों से निपटने जाएगा।

+0

धन्यवाद! एक उत्तर के रूप में काम कोड स्निपेट पाने के लिए अच्छा लगा। मैं क्वेरी पाठ में {0} पर अटक गया था। – MikeJ

8

बस अपनी क्वेरी parameterize:

SELECT * FROM suppliers WHERE supplier_name like '%' + @name + '%' 

अब आप @name पैरामीटर में अपने "नाम" चर पारित कर सकते हैं और क्वेरी इंजेक्शन हमले के किसी भी खतरे के बिना निष्पादित करेंगे। यहां तक ​​कि यदि आप कुछ "" या सत्य "में गुजरते हैं - यह अभी भी ठीक काम करेगा।

-5

लघु anwser:

1) name.Replace (" '" "' '") .... अपने डेटाबेस हो सकता है कि किसी भी भागने वर्ण (एकल उद्धरण सबसे आम है बदलें)

2) ऊपर

Dim MySQL as string = "Insert into NewEmp (fname, LName, Address, City, State, Postalcode, Phone, Email) Values (@Firstname, @LastName, @Address, @City, @State, @Postalcode, @Phone, @Email)" 

With cmd.Parameters: 
    .Add(New SQLParameter("@Firstname", frmFname.text)) 
    .Add(New SQLParameter("@LastName", frmLname.text)) 
    .Add(New SQLParameter("@Address", frmAddress.text)) 
    .Add(New SQLParameter("@City", frmCity.text)) 
    .Add(New SQLParameter("@state", frmState.text)) 
    .Add(New SQLParameter("@Postalcode", frmPostalCode.Text)) 
    .Add(New SQLParameter("@Phone", frmPhone.text)) 
    .Add(New SQLParameter("@email", frmemail.text)) 
end with 
नीचे के साथ बदल दिया जाता है, तो आप एक भाषा की तरह .net parameterized क्वेरी का उपयोग

sql="Insert into Employees (Firstname, Lastname, City, State, Zip, Phone, Email) Values ('" & frmFirstname.text & "', '" & frmLastName & "', '" & frmCity & "', '" & frmState & "', '" & frmZip & "', '" & frmPhone & "', '" & frmEmail & "')" 

उपयोग कर रहे हैं

3) उपयोगकर्ता संग्रहीत procs

4), एसक्यूएल करने के लिए LINQ का उपयोग फिर से यदि आप .net

+0

मैं नहीं देखता कि यहां सभी नीचे वोट क्यों हैं ... मैंने विकल्पों की सीमा और दिखाया कि क्या उपलब्ध था। व्यक्तिगत रूप से मैं विकल्प 1 का उपयोग नहीं करता, लेकिन मैंने कहा है कि सभी पात्रों को केवल एक ही उद्धरण से बचने की आवश्यकता नहीं होगी। अगर ऐसा किया जाता है तो यह पूरी तरह मान्य है। विकल्प केवल वहां से बेहतर हो जाते हैं। लोगों को बिना कहने के वोट क्यों देना चाहिए। – vdhant

+0

vdhant, आपने सवाल का जवाब नहीं दिया। प्रारंभिक प्रश्न इस तरह केंद्रित था कि लाइक ऑपरेटर के साथ पैरामीटरयुक्त प्रश्नों का उपयोग कैसे करें, और आप अपने उत्तर में बिल्कुल पसंद ऑपरेटर का उल्लेख नहीं करते हैं। – CodeThug

0

इकाई की रूपरेखा 6 में यह देशी एसक्यूएल द्वारा इस तरह किया जा सकता है:

List<Person> peopleList = contex.People.SqlQuery(
    @"SELECT * FROM [Person].[Person] 
     WHERE [FirstName] LIKE N'%' + @p0 + '%' ", "ab").ToList(); 

या

List<Person> peopleList = contex.People.SqlQuery(
    @"SELECT * FROM [Person].[Person] 
     WHERE [FirstName] LIKE N'%' + @name + '%' ", 
    new SqlParameter("@name", "ab")).ToList(); 
इसके अलावा

, तो आप सिर्फ LINQ संस्थाओं के लिए सीधे उपयोग कर सकते हैं:

List<Person> peopleList1 = contex.People.Where(s => s.FirstName.Contains("ab")).ToList(); 
संबंधित मुद्दे