منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : نقاش : هل نستخدم oop ونجعل البرنامج عرضه للأختراق ( SQL INJECTION)
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم اخواني Smile

قبل وضع استفساري سأقوم بتعريف بسيط عن كيفيه أختراق البرنامج من خلال جمل الاستعلام ( SQL INJECTION)
حتي يستفاد من ليس لديه معرفه بهذا الموضوع المهم
مثلا لو كتبت جمله استعلام بسيطه بهذا الشكل
كود :
SELECT * FROM users WHERE name = ' + userName + '
يمكن لمستخدم برنامجك حقن جمله الاستعلام بكل سهوله فكل ما عليه ان يكتب بدلا من الاسم
كود :
a' or 't'='t
فتصبح جمله الاستعلام بعد ادخال القيمه من المستخدم بهذا الشكل
كود :
SELECT * FROM users WHERE name = 'a' OR 't'='t'
وللمزيد عن هذا الموضوع اطلع علي wikipedia

طبعا يمكن تفادي هذه المشكله اما بأستخدام الاجراءات المخزنه(Stored procedure) او استخدام البارمترات ( parameters )

الي هنا سنبدأ في النقاش فرضا انني استخدم قاعده بيانات اكسس وبالتالي سنفقد امكانيه استخدام الاجراء المخزن (Stored procedure)
لم يتبقي لي الاطريقه البارمترات ( parameters )

فرضا انني احببت الاستفاده من oop لعمل فانكشن للحذف والاضافه والتعديل يمكن استخدامها في جميع برامجي
وقمت بأنشاء كلاس وكتبت به الداله
كود :
Public Function pross(ByVal sql As String) As Boolean
        cmd.Connection =cn
        cmd.CommandType = CommandType.Text
        cmd.CommandText = sql
        connect.opendb()
        Try
            cmd.ExecuteNonQuery()
            connect.closedb()
            Return True
        Catch ex As Exception
            connect.closedb()
            MsgBox(ex.Message)
            Return False

        End Try
    End Function

وهكذا يمكن تنفيذ الحذف اوالاضافه اوالتعديل بكود بسيط
كود :
Dim p As New Class1
        Dim sql As String
        sql = String.Format("insert into tb values({0} ,'{1}' ,'{2}')", TextBox1.Text, TextBox2.Text, TextBox3.Text)
        If p.pross(sql) = True Then
            MsgBox("done", MsgBoxStyle.Information, "INS")
        End If

ولكن هنا نعود من جديد الي مشكله ( SQL INJECTION) حيث يفقد البرنامج حمايته ويمكن اختراقه

اعتذر عن الاطاله ولكن لها ضروره في هذا الموضوع المهم

ما هي الاقتراحات حتي نجمع بين oop وحمايه جمل الاستعلام من الحقن ؟؟؟
ليست هكذا تستخدم oop فأنت تتعامل علي أن كل كلاس خاص بنفسه عموما لي مثال سوف ارفعه لتوضيح الأمر
شكرا لك اخي amgadtamer علي اثراء الموضوع بمعلوماتك القيمه
بارك الله فيك ...

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

لا يوجد لدي مشكله في استخدام الطبقات ( N_Tier)
ولكن اكون مضطر لأعاده البرمجه من جديد مع كل برنامج وتحويل كل حقل الي خاصيه (Property) وهكذا

سأوضح لك الامر اكثر
مثلا لدي جدولين في قاعده البيانات الجدول الاول مكون من 3 حقول
والجدول الثاني مكون من 5 حقول واريد ان اكتب اجراء واحد للأضافه يمكن استخدامه مع الجدولين
سنواجه هنا مشكله اختلاف عدد البارمترات ( parameters ) بين الجدولين
ولكن بالطريقه الخاصه بي الموجوده في الاعلي يمكن عمل هذا ولكن الطريقه ضعيفه Sad
... هل يوجد طريقه او حل لهذه المشكله ???
السلام عليكم

اخي العزيز استخدمSqlCommandBuilder  لتفادي مشكلة الباراميترات حيث يقوم هذا الامر بعمل أوامر update,delete,insert تلقائي خاص لكل جدول

انظر الى هذه الروابط
http://www.dotnetperls.com/sqlcommandbuilder
http://www.java2s.com/Code/CSharp/Data**...uilder.htm
http://msdn.microsoft.com/en-us/library/...ilder.aspx

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

PHP كود :
Pubblic class customertable

نضع هنا كل ما يتعلق بهذا الجدول 
End 
class 
وبالتالى يتحقق مبدأ OOP
مثل Encapsulation
فالفئة تحتوى على جميع خصائصها
وأيضا Abstraction
وهى الواقعيه مثل أن العميل له اسمه عنوانه وهكذا
وأيضا Polymorphism و inheritance
فالمشاريع يتم برمجتها بهذه الطريقه
فئة لل connection وفئة لل security وفئة لل validation وهكذا .....

عموما سوف أضع للك مثال بنفس فكرتك وحاول حقنه بنفس الطريقة التى ذكرتها :o
هذا مثال يوضح الطريقتين سواء التى تستطيع حقنها أم الأخرى التى لا يمكن حقنها
شكرا لك اخي sajad علي الروابط المفيده
بالفعل هذه الطريقه رائعه ويوجد بها مميزات كثيره مثل التراجع عن التعديلات بسهوله
ولكن لن تتناسب معي لاني يمكن ان اتعامل مع عده جداول في نفس جمله الاستعلام
وحتي اطلق العنان لخيالي في جمل الاستعلام Smile

اخي amgadtamer بارك الله فيك يناسبني مثالك جدا لتنفيذ فكرتي
سأدمج الداله validatinput مع طريقتي وبأذن المولي تنتهي المشكله
وان شاء الله سأعمل علي تطوير الفكره ...
والي هذا الوقت سأظل استخدم (Stored procedure)

وفقكم الله ،،
اخي الكريم ممكن اعطيك فكرة تساعدك قليلا ركز ممعي::
عندما تمرر مصفوفة البارميترات واسم الجدول ونوع العملية وتقوم بعمل ملف temp وتتكتب فيه
create proc tablename_Insert
حيث تابل نيم هو اسم الجدول
وتقوم بتمرير البارمترات بشكل عادي لملف
pram int,parm2 int
ثم بعد التمرير تكتب as
وبعدها يتم اضافة
insert into tablename(filed) values(prms)
هنا تجبر نفس على ان تكون البرامترات نفس اسم الحقول حتي تستطيع اختصار الكود
ومن ثم تحفظ الكود فى ملف
وتقوم قرائته فى sqlcommand
وتقوم بتنفيذه ويتم عمل استورد بروسيجر
___________________
هذه الطريقة كانت فى الفريم ورك الخاص بي لما كان فيرشن 2 ولكن قريبا سوف ارفعه للمنتدي ليستفيدو من هذه النسخة ولكن سيكون نسخة تنفيذية فقط
تحياتي
الفقير الى ربه
سامر عبد الله