سؤال

أود أن أعرف إذا أنا آمنة ضد حقن SQL عند استخدام شيء من هذا القبيل مع PostgresSQL:

CREATE or REPLACE FUNCTION sp_list_name( VARCHAR )
RETURNS SETOF v_player AS '
   DECLARE
      v_start_name ALIAS FOR $1;
      r_player  v_player%ROWTYPE;
      v_temp VARCHAR;
   BEGIN
      v_temp := v_start_name || ''%'';
      FOR r_player IN
         SELECT first_name, last_name FROM v_player WHERE last_name like v_temp
      LOOP
         RETURN NEXT r_player;
      END LOOP;
      RETURN;
   END;
' LANGUAGE 'plpgsql' VOLATILE;

أريد أن استخدام هذه الوظيفة إلى قائمة اسم اللاعب بداية مع رسالة.

select * from sp_list_name( 'A' );

يعطيني اللاعبين مع اسم الماضي بداية مع أ.

حاولت أن حقن sql مع

select * from sp_list_name( 'A; delete from t_player;--' );
select * from sp_list_name( '''; delete from t_player;--' );

هل أنا آمن ؟

هذه الحالة لا يمكن أن يكون حقن ؟

تحياتي

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

المحلول

من حيث الإجراء الخاص بك تبدو آمنة متغير في SP لن يكون توسعت في رمز ، ولكن يمكنك لا تزال تعرض نفسك إذا كنت لا تستخدم استعلام ذي معلمات مثل "SELECT * FROM sp_list_name(?);"في أببليكيشن رمز.شيء من هذا القبيل "SELECT * FROM sp_list_name('$start_name');"يمكن تخريب من قبل المستخدم تمرير البداية اسم "');delete from t_player where last_name NOT IN ('".وذلك باستخدام استعلام ذي معلمات أو التعقل التحقق من المدخلات الخاصة بك في البرنامج.

ملحوظة:: إلى الآخرين ، يرجى ملاحظة أن المتغير في إجراء مخزن سوف لا التوسع في كود حتى إذا كان يحتوي على ' أو ;, (باستثناء يمر إلى تنفيذ, التي سوف تستخدمها quote_literal, وليس يدويا replace وظائف) حتى استبدال ;أو ' لا لزوم لها تماما (في الإجراء المخزن التطبيق باستخدام هذا هو قصة مختلفة ، طبعا) سوف تمنعك من دائما إيجاد "tl;dr"أو "O'Grady"فرق.

ليو مور ، كارل ، LFSR الاستشارات: v_temp_name في الإجراء المخزن لا التوسع في كود في ولاية ساو باولو (لا تنفيذ) ، تحقق من أن تحتاج إلى القيام به ن التطبيق ، لا SP (أو المرجع فقط يمكن استخدام استعلام ذي معلمات في تطبيقاتهم البرمجية بدلا من ذلك).الآخرين ما يوحي يشبه القلق

my $bar = "foo; unlink('/etc/password');"; 
my $baz = $bar;

في الواقع تشغيل ربط في غياب التقييم.

نصائح أخرى

والمادة رقم 1 لمنع ضد حقن SQL: عقم كل المدخلات التي تأتي من شخص / شيء لا يمكن أن نثق / ليس لديهم السيطرة عليها.

والمشكلة نفسها لا تكمن ضمن رمز قاعدة البيانات، ولكن من التطبيق الذي تم تنفيذ تلك التصريحات.

الطريقة الصحيحة للحماية من حقن SQL عبر القائمة البيضاء* - طويلة وقصيرة هو مجموعة الأحرف التي أنت ذاهب إلى قبول مرشح منهم.

غير طريقة القائمة السوداء - الأسود على قائمة الشخصيات ليست مقبولة سوف يؤدي إلى مشكلة ، لأن لا يمكنك مواكبة مع المهاجمين.هناك طرق حول القوائم السوداء عبر ASCII الجداول أحرف الهروب وليس ما.

أيضا, وهنا لطيفة ورقة الغش لمحاولة الخروج على موقع الويب الخاص بك.تشغيل بعض الاختبارات في محاولة للحصول على الأشياء أن تفشل.

* في التطبيق ، لا DB (بفضل جيمس)

وأنت لم توليد SQL لنفسك، لذلك هذا يبدو آمنا (بالنسبة لي).

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

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

وكنت أعمل لعميل معين التي سمحت اسم المستخدم / كلمة المرور إلى الموارد المحمية (التي يمكن أن تحصل في النهاية على الوصول تنتقل إلى أجزاء آمنة من مطار!). هل يمكن الالتفاف مجال تسجيل الدخول عن طريق إدخال 'ثم بناء استعلامات SQL من هناك لاسترداد حسابات المستخدمين وكلمات المرور.

وكانت المشكلة قد العميل في مهب بالفعل 200K £ بناء الموقع مع البائع الذي على ما يبدو لم تفعل تطوير الشبكة من قبل. كان الإصلاح على مزيد من 60K £ الذي كان ظائفها التحقق من صحة () أن تتحرى فقط للوحدة، حدد، بعد أن وآخرون الكلمات الرئيسية. وردا على سؤال حول ما فعلوه لcanicolisation / الترميز (الذي كان لي أن أشرح ذلك الوقت) أن الوقت قد حان tumbleweed.

والمنزل ديف ومشروع (مكلفة) حصلت المعلبة.

هل يمكن أن تنظر التحقق من صحة محتوى

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

إذا لم تكن مألوفة مع عرافة في SQL حقن فيما يلي مقدمات سريعة

HTTP: // شبكة الاتصالات العالمية .arejae.com / بلوق / باستخدام-T-SQL SQL-حقن هجوم و-hexadecimal.html

http://www.securityfocus.com/infocus/1768

DECLARE
      v_start_name ALIAS FOR $1;
      r_player  v_player%ROWTYPE;
      v_temp VARCHAR;
   BEGIN
      --  new pseudo code here
      if v_start_name has bad chars exit with error message
      -- end pseudo code here
      v_temp := v_start_name || ''%'';
      FOR r_player IN
         SELECT first_name, last_name FROM v_player WHERE last_name like v_temp
      LOOP
         RETURN NEXT r_player;
      END LOOP;
      RETURN;
   END;

والتحيات كارل

ولا مجرد استبدال في v_start_name الخاص بك للتخلص من "،" الخ أي

v_clean_name VARCHAR;
Select v_clean_name = Replace(v_start_name,';','');

وهذا سيحل محل. مع الفراغات إحباط هجوم حقن SQL

لمزيد من التفاصيل انظر وظائف سلسلة في PostgresSQL

وكما علق LFSR استشارات أيضا. فمن الأفضل أن القائمة البيضاء (أي لا معالجة أي مساهمة مع أحرف غير صالحة مثل هذا '؛'). بدلا من القائمة السوداء (أي محاولة لتنظيف البيانات كما يمكن للمستخدم القيام هجوم حقن SQL على هاتفك استبدال جدا)

لمزيد من المعلومات إلقاء نظرة على الموقع هجمات SQL حقن

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