تجنب حقن SQL في الاستعلام SQL مع مثل المشغل باستخدام المعلمات ؟

StackOverflow https://stackoverflow.com/questions/228476

سؤال

الاستيلاء على بعض التعليمات البرمجية من سلفي و وجدت استعلام يستخدم عامل التشغيل Like:

حدد * من الموردين حيث supplier_name مثل '%'+اسم+%';

في محاولة لتجنب حقن SQL المشكلة parameterize هذا ولكن أنا لست متأكدا تماما كيف سيكون هذا إنجاز.أي اقتراحات ؟

ملاحظة, أنا بحاجة إلى حل الكلاسيكية ADO.NET - ليس لدي الاخضر للتبديل هذا الرمز إلى شيء مثل LINQ.

هل كانت مفيدة؟

المحلول

وحاول هذا:

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();
}

والإطار سوف تتعامل تلقائيا مع القضايا نقلا.

نصائح أخرى

وببساطة بالحدود الاستعلام الخاص بك:

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

والآن يمكنك تمرير "اسم" متغير في المعلمةname وسوف الاستعلام تنفيذ دون أي خطر من هجمات حقن. حتى إذا كنت تمر في شيء من هذا القبيل " '' OR صحيح -" أنه سوف لا تزال تعمل بشكل جيد

في إطار الكيان 6 أنه يمكن أن يتم مثل هذا من قبل SQL الأصلي:

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();

قصيرة الإجابة إنها تبدو:

1) الاسم.محل("'", """)....استبدال أي أحرف الهروب أن قاعدة البيانات الخاصة بك قد يكون (علامات الاقتباس المفردة الأكثر شيوعا)

2) إذا كنت تستخدم لغة مثل .صافي استخدام استعلامات بمعلمات

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

سبق يحصل استبدال أدناه

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

3) المستخدم المخزنة procs

4) استخدام Linq to SQL مرة أخرى إذا كنت تستخدم .صافي

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top