سؤال

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

المنطقة الوحيدة من القلق هو أن اسم قاعدة البيانات نفسها متسلسلة في SQL التي نمر إلى CallableStatement على هذا النحو:

"{call [" + dbName + ".dbo." + procName + "(?, ?, ?)}"

procName هو ترميز-الثابت في فصول الأطفال باستخدام قالب نمط طريقة لذلك هو أن سلسلة مضمونة آمنة.

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

يجب تعيين التالية لإنتاج SQL التالية المكالمات (الجدول proc تم تغيير الاسم لحماية الأبرياء):

securitytest].nx_proc()};delete from poor_victim_table;

يصبح

{call [securitytest].nx_proc()};delete from poor_victim_table;].dbo.proper_proc_name()}

و

securitytest].nx_proc()};exec('delete from poor_victim_table');

يصبح

{call [securitytest].nx_proc()};exec('delete from poor_victim_table');].dbo.proper_proc_name(?,?,?,?,?,?,?)}

النتائج في Incorrect syntax near ')'. و poor_victim_table لا يزال لديه الصفوف.لقد استخدمت truncate table, drop table و drop database وعندما لم يفلح أنا تحولت إلى بسيطة delete لاستبعاد إعدادات الأمان.

إذا كنت تستخدم proc أن يأخذ ربط المعلمات ، أنا دائما الحصول على تطابق بين عدد من المتوقع المعلمات تزويد المعلمات مثل The index 1 is out of range..

securitytest]};exec('delete from poor_victim_table');

يصبح

{call [securitytest]};exec('delete from poor_victim_table');].dbo.proper_proc_name(?,?,?,?,?,?,?)}

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

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

بعد البحث هذا أفضل من تعاملت معه هذا ستاكوفيرفلوو السؤال: حقن SQL - لا خطر على stored procedure call (على iSeries)?.يبدو أن الدعم باستخدام CallableStatement لأنه يحميك من حقن SQL إلا إذا كان بروك رمز في حد ذاته يجعل SQL ديناميكية من معلمة الإدخال.

لذا سؤالي إلى المجتمع ، على افتراض SQL البرمجية في proc آمنة باستخدام CallableStatement في JDBC حقا منع حقن SQL?أو برنامج تشغيل SQL Server تحليل السلسلة بطريقة تمنع ذلك ، ولكن برامج أخرى قد لا ؟ أو أنا لا أحاول من الصعب بما فيه الكفاية ؟

إذا كان ذلك آمنا ، كيف يكون هذا الضمان ؟ هل هو بسبب جملة مجردة من استخدام { call blah(?) } التي ليست حقيقية SQL, ولكن تحصل على ترجمتها إلى SQL ؟

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

المحلول

لك يجب أن تكون آمنة ، ولكن مثلك, أنا لا أثق في ذلك ، وخاصة إذا كنت التواصل إلى مختلف قواعد البيانات باستخدام مختلف JDBC.... الخ

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

نصائح أخرى

تحقق من اتصال db url, أعتقد أن هذا هو الرجوع ثابت db, حتى إذا كنت كتابة db اسم في للاستدعاء بيان سيؤدي هذا إلى إنشاء مشكلة كلما db اسم تغيير التعليمات البرمجية مثل الموت (معظم الأماكن للتغيير) لا تستخدم db اسم في الاستعلام ولكن يمكنك إنشاء كائنات مختلفة لمختلف db اتصال أو مختلف فئات المساعد على ذلك.

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