منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
كيف احمي موقعي من الـ sql enjection - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم برمجة وتطوير المواقع (http://vb4arb.com/vb/forumdisplay.php?fid=51)
+--- قسم : قسم ASP.NET (http://vb4arb.com/vb/forumdisplay.php?fid=52)
+---- قسم : قسم اسئلة ASP.NET (http://vb4arb.com/vb/forumdisplay.php?fid=53)
+---- الموضوع : كيف احمي موقعي من الـ sql enjection (/showthread.php?tid=8549)

الصفحات: 1 2


كيف احمي موقعي من الـ sql enjection - سعود - 20-04-13

كيف احمي موقعي من الـ sql enjection

ارجو النقاش للفائدة فالمخربين يتعاونون للتخريب Smile ونحن هنا يدا بيد للمساعدة بالحماية.
بارك الله فيكم جميعا من اولكم لاخركم


كيف احمي موقعي من الـ sql enjection - ربيع - 20-04-13

نحمده ونصلي على رسوله الكريم

باستخدام الـ stored procedures و parameters، تستطيع تفادي ذلك إن شاء الله....


كيف احمي موقعي من الـ sql enjection - سعود - 20-04-13

طيب اخي الكريم .. مارايك حول الكلمات الممنوعة هل يجدي نفعا ام لا.
مثلا نقوم بتعبئة ملف نصي بتلك الكلمات مثل dim,public,script الى اخره ثم نتفحص المكتوب بمربع النص هل يحتوي احدى هذه الكلمات..هل هذا يفيد ام لا؟
ايضا الاستغلال هل هو من خلال الرابط بحيث تضاف له قيمة سواء علامة تنصيص او غيرها ام من الادوات ؟
وهل هذهالثغرة لم تسد؟ هل يعقل انها موجودة حتى بـ sql server 2008 r2 ؟
كنت اظن ان الحماية منها تتطلب اجراءات وملفات ودوال كثيرة..
طيب سؤال آخر:
كيف الى معرفة كافة القيم الموجودة بالرابط اقصد QueryString جربت الكود التالي ولم يفلح
كود :
If Request.QueryString.ToString.Contains("'") Then            
Response.Write("<div align=center><h2>لقد كتبت قيمة ممنوعة بالرابط</h2></div>")
        End If


بارك الله فيكم جميعا.


كيف احمي موقعي من الـ sql enjection - سعود - 20-04-13

لقد تذكرت موضوع
[h=1]{ معلومة} .. معلومات Request[/h]هل التحقق من المعلومات هذه مثل
Request.Url.PathAndQuery
ذو فائدة؟


كيف احمي موقعي من الـ sql enjection - سعود - 20-04-13

كتبت بملف نصي
كود :
dimpublic
script
function
'
"
get
post
item
وبحدث تحميل الصفحة كتبت
كود :
Dim sf As String = ""        sf = My.Computer.FileSystem.ReadAllText(Server.MapPath("~/pat/tt.txt"))
        For Each st In Request.Url.PathAndQuery.ToString.Split("?")
            For Each t In sf
                If st.ToString.Contains(t) Then
                    Response.Write("<div align=center><h2>لقد كتبت قيمة ممنوعة بالرابط</h2></div>")
                End If
            Next
        Next
اريد ان يطبع رسالة الخطا مرة فكيف ذلك؟


كيف احمي موقعي من الـ sql enjection - سعود - 20-04-13

عدلت قليلا
كود :
Dim sf As String = ""        sf = My.Computer.FileSystem.ReadAllText(Server.MapPath("~/pat/tt.txt"))
        For Each st In Request.Url.PathAndQuery.ToString.Split("?")
            For Each t In sf
                If st(1).ToString.Contains(t) Then
                    Response.Write("<div align=center><h2>لقد كتبت قيمة ممنوعة بالرابط</h2></div>")
                End If
            Next
        Next



كيف احمي موقعي من الـ sql enjection - سعود - 20-04-13

بالنسبة لمربع النص
كود :
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click        
lbl.Visible = False
        lbl.Text = ""




        For Each st In TextBox1.Text
            For Each t In sf
                If st.ToString.Contains(t) Then
                    lbl.Text = "توجد قيمة منوعة"
                    lbl.ForeColor = Drawing.Color.Red
                    lbl.Visible = True
                End If
            Next
        Next




    End Sub
ارجو ابداء الاراء


كيف احمي موقعي من الـ sql enjection - ربيع - 20-04-13

الثغرة ما زالت موجودة، وستبقى دائما، ولتفاديها نستخدم: الـ stored procedures أو parameters أو linq.

لو افترضنا ان تطبيقنا (تطبيق سطح مكتب أو تطبيق ويب)، به نموذج لتسجيل الدخول، وكان كود الاستعلام كـ:

كود :
[align=left]"select * from users where uname like '" & textbox.text & "' pass like '" & textbox2.text & "'"
[/align]

ثم أدخل المستخدم في مربع النص الأول كلمة: user، مثلا، ثم في مربع النص الثاني حقن هذه الجملة:
كود :
[align=left]123' or 'd' = 'd
[/align]

سوف تصبح جملة الاستعلام هكذا:
كود :
[align=left]"select * from users where username like 'user' pass like '123' or 'd' = 'd'"
[/align]

النتيجة:
كود :
[align=left]messagebox.show("تم تسجيل الدخول بنجاح")
[/align]

الاستعلامات المخزنة stored procedures، تتعامل مع وسيطات يتم استخدامها كنصوص وليس كأوامر sql....
جملة الاستعلام السابقة تصبح:
كود :
[align=left]create procedure login(@un nvarchar(), @pas nvarchar())
as
select * from users where uname = @un and pass = @pas
[/align]

الـ QueryString:
كود :
[align=left]For Each qs As String In Request.QueryString.AllKeys
    If Request.QueryString(qs).Contains("'") Then
        Response.Write("<div align=center><h2>لقد كتبت قيمة ممنوعة بالرابط</h2></div>")
        Exit For
    End If
Next qs
[/align]



كيف احمي موقعي من الـ sql enjection - سعود - 20-04-13

بارك الله فيك وزادك قدرا وفضلا وعلما ينفعك دنيا واخرى.


كيف احمي موقعي من الـ sql enjection - سعود - 20-04-13

طيب اخي كيف اعدل على التالي ليكون استعلام مخزن
كود :
Dim cm As New OleDbCommand("select un,ps from tb where un=@un and ps=@ps", con)        cm.Parameters.AddWithValue("@un", OleDbType.VarChar).Value = un.Text
        cm.Parameters.AddWithValue("@ps", OleDbType.VarChar).Value = ps.Text