سؤال

إذا من استعلام SQL أنا إزالة جميع الشخصيات, هل هناك طريقة أخرى للقيام هجوم حقن SQL على قاعدة البيانات ؟

كيف يمكن أن يتم ذلك ؟ يمكن لأي شخص أن تعطيني الأمثلة ؟

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

المحلول

نعم ، هناك.مقتطفات من ويكيبيديا

"SELECT * FROM data WHERE id = " + a_variable + ";"

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

1;DROP TABLE users

سيتم إسقاط (حذف) "المستخدمين" الجدول من قاعدة البيانات ، منذ SQL سيكون المقدمة على النحو التالي:

SELECT * FROM DATA WHERE id=1;DROP TABLE users;

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

نصائح أخرى

نعم, اعتمادا على البيان الذي تستخدمه.كنت أفضل حالا حماية نفسك إما باستخدام الإجراءات المخزنة أو على الأقل parameterised الاستعلامات.

انظر ويكيبيديا للوقاية العينات.

نعم ، فمن نهائيا ممكن.

إذا كان لديك شكل حيث تتوقع عدد صحيح أن تجعل النظام الخاص بك المقبل SELECT ثم يمكنك إدخال أي شيء مماثل:

حدد * من thingy حيث attributeID=

  • 5 (إجابة جيدة, لا مشكلة)
  • 5;إسقاط الجدول users;(سيء...)

الموقع التالي مزيد من التفاصيل الكلاسيكية حقن SQL التقنيات: حقن SQL ورقة الغش.

باستخدام parametrized استفسارات أو الإجراءات المخزنة ليس أي أفضل.هذه مجرد مسبقة الصنع الاستعلامات باستخدام المعلمات التي تم تمريرها ، والتي يمكن أن تكون مصدر الحقن فقط كذلك.كما هو موضح في هذه الصفحة: مهاجمة الإجراءات المخزنة في SQL.

الآن, إذا كنت تقمع بسيطة اقتباس لمنع فقط مجموعة معينة من الهجوم.ولكن ليس كل منهم.

كما هو الحال دائما, لا تثق البيانات القادمة من الخارج.تصفية لهم في هذه 3 مستويات:

  • واجهة مستوى الأشياء واضحة (المنسدلة اختر القائمة هو أفضل من حقل النص الحر)
  • المستوى المنطقي على الشيكات المتعلقة البيانات الطبيعة (int, string, طول) ، الأذونات (يمكن هذا النوع من البيانات المستخدمة من قبل هذا المستخدم في هذه الصفحة)...
  • الوصول إلى قاعدة بيانات على مستوى (الهروب بسيطة اقتباس...).

المتعة و لا تنسى للتحقق من ويكيبيديا للحصول على إجابات.

/Vey

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

قانون إنشاء ثم شيئا مثل:

' Not Tested
var sql = "SELECT * FROM data WHERE id = @id";
var cmd = new SqlCommand(sql, myConnection);
cmd.Parameters.AddWithValue("@id", request.getParameter("id"));

إذا كان لديك اسم مثل الألغام مع ' في ذلك.أنه أمر مزعج جدا أن جميع '-الشخصيات إزالة أو وضع علامة على أنها غير صالحة.

كما أنك قد ترغب في النظر في هذا ستاكوفيرفلوو سؤال حول حقن SQL.

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

ستلاحظ أنني الحديث تحديدا عن "معلمات" الإجراءات المخزنة.ببساطة استخدام إجراء مخزن لا يكفي أما إذا كان يمكنك العودة إلى وصل الإجراء مرت المعلمات معا.وبعبارة أخرى, تغليف نفس الضعيفة SQL في الإجراء المخزن لا يجعله أكثر أمانا.تحتاج إلى استخدام المعلمات في الإجراء المخزن مثلما تفعل مع مضمنة SQL.

أيضا - حتى لو كنت لا مجرد إلقاء نظرة على الفاصلة ، كنت لا ترغب في إزالته.تريد الهروب ذلك.يمكنك القيام بذلك عن طريق استبدال كل الفاصلة مع فاصلتين.

ولكن استعلامات بمعلمات/الإجراءات المخزنة هي أفضل بكثير.

لأن هذا نسبيا في السن السؤال ، وأنا لن يكلف نفسه عناء كتابة كاملة وشاملة الإجابة لأن معظم جوانب هذا الجواب وقد ذكرت هنا من قبل ملصق واحد أو آخر.
أجد أنه من الضروري أن طرح مسألة أخرى لم تطرق من قبل أي شخص هنا - SQL التهريب.في حالات معينة ، فمن الممكن أن "تهريب" الاقتباس حرف ' في الاستعلام الخاص بك حتى لو حاولت إزالته.في الواقع ، قد يكون هذا ممكنا حتى إذا كنت تستخدم السليم الأوامر, المعلمات, الإجراءات المخزنة ، إلخ.

تحقق من كامل ورقة بحثية في http://www.comsecglobal.com/FrameWork/Upload/SQL_Smuggling.pdf (الإفصاح كنت الأولية الباحث على هذا) أو جوجل فقط "SQL التهريب".

...اه عن 50000000 طرق أخرى

ربما شيء مثل 5; drop table employees; --

مما أدى sql قد يكون شيئا مثل:select * from somewhere where number = 5; drop table employees; -- and sadfsf

(-- يبدأ التعليق)

نعم على الاطلاق:اعتمادا على SQL اللهجة و هناك العديد من الطرق لتحقيق الحقن التي لا تستخدم الفاصلة العليا.

الوحيد الموثوق به الدفاع ضد هجمات حقن SQL باستخدام SQL بمعلمات الدعم التي تقدمها قاعدة البيانات الخاصة بك واجهة.

بدلا من أن تحاول معرفة أي الحروف لتصفية كنت عصا parametrized الاستفسارات بدلا من ذلك ، وإزالة المشكلة تماما.

ذلك يعتمد على كيفية كنت وضعت معا الاستعلام ولكن في جوهرها نعم.

على سبيل المثال ، في جافا إذا كنت تفعل هذا (عمدا الفظيعة سبيل المثال):

 String query = "SELECT name_ from Customer WHERE ID = " + request.getParameter("id");

ثم هناك فرصة جيدة كنت فتح نفسك تصل إلى حقنة الهجوم.

جافا بعض الأدوات المفيدة لحماية ضد مثل PreparedStatements (حيث كنت تمر في مثل سلسلة "حدد name_ من العملاء حيث ID = ؟" JDBC طبقة مقابض يهرب حين استبدال ؟ الرموز بالنسبة لك) ، ولكن بعض اللغات الأخرى ليست مفيدة جدا لهذا.

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

\;.*--\

نصف القولون تستخدم قبل الأوان إنهاء حقيقية بيان بعض حقن SQL تليها مزدوجة واصلة إلى تعليق خارج زائدة SQL الأصلي حقيقية البيان.الواصلات يجوز حذف في الهجوم.

ولذلك فإن الجواب هو:لا, ببساطة إزالة الفواصل العليا لا الضمان لك السلامة من حقن SQL.

لا أستطيع إلا أن أكرر ما قاله الآخرون.Parametrized SQL هو الطريق للذهاب.بالتأكيد, انها قليلا من الألم في بعقب الترميز ذلك - ولكن مرة واحدة كنت قد فعلت ذلك مرة واحدة ، ثم فإنه ليس من الصعب قص ولصق هذا الرمز ، وإجراء التعديلات التي تحتاج إليها.لدينا الكثير من .صافي التطبيقات التي تسمح زوار موقع ويب تحديد مجموعة من معايير البحث ، التعليمات البرمجية SQL Select على الطاير - ولكن كل ما يمكن إدخاله من قبل المستخدم يذهب إلى المعلمة.

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

إذا كنت من أي وقت مضى تلقي id = "مرحبا" عندما كنت متوقع id = 1044, فمن الأفضل دائما أن عودة مفيدة خطأ للمستخدم بدلا من السماح قاعدة البيانات بإرجاع خطأ.

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