c# - حقن SQL على INSERT



sql-injection (6)

أسهل طريقة للحماية من هذا الشكل من حقن SQL ، هو استخدام المعلمات والإجراءات المخزنة بدلاً من بناء عبارات SQL لتشغيل. (في C # أو داخليًا إلى SQL Server).

ومع ذلك لست متأكدًا تمامًا من أنك يجب أن تقضي وقتًا في هذا ، ما لم تكن بالطبع سياسة شركتك ، حيث إن فرص حدوثها داخليًا ضئيلة جدًا في أفضل الأحوال ، وإذا حدث ذلك ، فإنني آمل أن تعرف على الفور من أنه.

https://ffff65535.com

لقد قمت بإنشاء صفحة ويب استطلاع صغيرة على شركتنا Intranet. صفحة الويب هذه لا يمكن الوصول إليها من الخارج.

النموذج هو ببساطة بضعة أزرار الاختيار ومربع التعليقات.

أرغب في الحفاظ على ممارسات الترميز جيدة ونود أن يحمي من "حقن SQL".

هل يمكن أن تحدث حقن SQL في بيان إدراج مع تعليقات من مربع النص؟ إذا كان الأمر كذلك ، كيف يمكنني أن أحميها باستخدام .NET 2.0؟


استخدم استعلامات معلمة بحيث يتم اقتباس النص تلقائيًا نيابة عنك.

SqlCommand command = connection.CreateCommand();
command.CommandText = "insert into dbo.Table (val1,val2,txt) values (@val1,@val2,@txt)";
command.AddParameterWithValue( "val1", value1 );
command.AddParameterWithValue( "val2", value2 );
command.AddParameterWithValue( "txt", text );

...

منع حقن SQL باستخدام بيان المعدة. استخدام placehoder (؟) يزيل تماما ثغرة حقن SQL. مثال String sql = حدد * من user_table حيث username = '+ request.getparameter ("username") +'؛ statement.executeQuery (SQL)؛

البيان أعلاه عرضة للحقن.

لجعلها آمنة ضد حقن SQL. استخدم بعد القصاصة

String sql = Select * from user_table where username = ؟؛ statement.setString (1، اسم المستخدم)؛


نعم ، يمكن أن يحدث. أسهل طريقة للحماية من هذا هو استخدام عبارات المعدة بدلاً من بناء SQL يدوياً.

لذلك ، بدلاً من هذا:

String sql = 
 String.Format("INSERT INTO mytable (text_column) VALUES ( '{0}' )",
   myTextBox.Text); // Unsafe!

ستفعل شيئًا كهذا:

String sql = "INSERT INTO mytable (text_column) VALUES ( ? )"; // Much safer

ثم قم بإضافة نص مربع النص كمعلمة إلى DbCommand الخاص بك مما يؤدي إلى أن يتم تلقائياً مهلة واستبدال "؟" في SQL.


يمكن أن يحدث الحقن في أي عبارة SQL لا تعمل بشكل صحيح.

على سبيل المثال ، لنفترض أن جدول التعليقات يحتوي على حقلين ، ومعرّف صحيح وسلسلة التعليقات. لذلك عليك INSERT ما يلي:

 INSERT INTO COMMENTS VALUES(122,'I like this website');

خذ بعين الاعتبار شخص ما يدخل التعليق التالي:

'); DELETE FROM users; --

إذا قمت فقط بوضع سلسلة التعليق في SQL دون أي معالجة ، فقد يؤدي ذلك إلى تحويل INSERT الخاص بك إلى العبارات التالية متبوعًا بتعليق:

INSERT INTO COMMENTS VALUES(123,''); DELETE FROM users; -- ');

هذا من شأنه حذف كل شيء من جدول users لديك. وهناك أشخاص على استعداد لقضاء كل يوم في العثور على tablename الصحيح لتفريغ باستخدام التجربة والخطأ والحيل المختلفة. فيما يلي وصف لكيفية تنفيذ هجوم SQL Injection.

تحتاج إلى استخدام عبارات SQL ذات معلمات لمنع هذا.

وهذا ليس فقط لأسباب أمنية. على سبيل المثال ، إذا كنت تقوم بإنشاء عبارات SQL الخاصة بك بشكل ساذج بالتعليق التالي:

I'm just loving this website

يتسبب خطأ في بناء جملة SQL بسبب الفاصلة العليا التي يتم تفسيرها بواسطة SQL كإقتباس الإغلاق.


يمكن أن يحدث حقنة SQL في أي وقت تقوم فيه بتمرير استعلام إلى قاعدة البيانات. وهنا مظاهرة بسيطة:

شرح حقن SQL

المفتاح ، داخل. NET ، هو أن يفعل كما أعطى ديف ويب. سيؤدي ذلك إلى منع محاولة الحقن عن طريق تضمين السلسلة بأكملها كمعلمة واحدة ليتم إرسالها ، مع معالجة كافة الأحرف التي قد يتم تفسيرها بواسطة SQL Server لتغيير الاستعلام أو إلحاق أوامر إضافية.

وتجدر الإشارة إلى أن حقن SQL يمكن أن يحدث على أي تطبيق ، وليس تطبيقات الويب فقط. وأن الهجوم الداخلي عادة ما يكون الأكثر تكلفة بالنسبة للمنظمة. لا يمكن للمرء أن يفترض بأمان أن الهجوم لن ينشأ من الداخل.





sql-injection