اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

طريقة لحل مشكلة SQL injection في فورم دخول المستخدم


rey360
إذهب إلى أفضل إجابة Solved by jjafferr,

الردود الموصى بها

السلام عليكم أعضاء المنتدي الكرام في المثال أدناه طريقة فور لدخول المستخدم عن طريق recordset و sql ولكن هناك مشكلة في حالة وضع في login أو كلمة المرور كلمة مرور خاطئ ووضع أمامها

'or 1='1

يقوم بدخول الى الفورم وهذه المشكلة تدعى SQL injection هل هناك حل لها وشكرا 

test.accdb

رابط هذا التعليق
شارك

وعليكم السلام 🙂

 

انا ما فهمت السؤال ، ولكن وجدت خطأ في الكود 🙂

وعلشان تعرف وين الخطأ ، دائما استعين بـ Debug.print ، وفي حالتك :

    Debug.Print "login='" & Me.Texte1 & "'" & "and passe='" & Me.Texte3 & "'"

والنتيجة
login='mmm'and passe='bb'

.

وتلاحظ انه ما في مسافة قبل and

لهذا السبب ، الكود بعد التعديل يصير :

    Dim rs As dao.Recordset
    Set rs = CurrentDb.OpenRecordset("select * from test1", dbOpenDynaset)

'    If Not rs.EOF Then rs.MoveFirst
    Debug.Print "login='" & Me.Texte1 & "'" & " and passe='" & Me.Texte3 & "'"
    rs.FindFirst ("login='" & Me.Texte1 & "'" & " and passe='" & Me.Texte3 & "'")

    If rs.NoMatch = True Then
        MsgBox "????"
    Else
        DoCmd.OpenForm "test2", acNormal
        DoCmd.Close acForm, Me.Name, acSaveNo
    End If
    
    rs.close
    Set rs = Nothing
    

.

وتستطيع ان تستعمل كود اخف :

    If DCount("*", "test1", "login='" & Me.Texte1 & "'" & " and passe='" & Me.Texte3 & "'") > 0 Then
        MsgBox "????"
    Else
        DoCmd.OpenForm "test2", acNormal
        DoCmd.Close acForm, Me.Name, acSaveNo
    End If

.

 

ولكن هذين الكودين يعتمدون على المعيار ، لذلك اعطيك طريقتي في عمل المعيار ، واللي يسهل عليك :

 

.

فيكون الكود في حالتك :

    Dim myWhere As String
    
    myWhere = "login='" & Me.Texte1 & "'"
    myWhere = myWhere & " and"                          '<اهم شيء هو ترك مسافة في البداية قبل and
    myWhere = myWhere & " passe='" & Me.Texte3 & "'"    '<اهم شيء هو ترك مسافة في البداية قبل passe
    
    rs.FindFirst myWhere
    
    او
    If DCount("*", "test1", myWhere) > 0 Then
    

 

جعفر

  • Like 2
  • Thanks 1
رابط هذا التعليق
شارك

8 دقائق مضت, jjafferr said:

    If DCount("*", "test1", "login='" & Me.Texte1 & "'" & " and passe='" & Me.Texte3 & "'") > 0 Then

 

أستاذ جعفر أعتقد هذا السطر يساوي 0 و ليس أكبر من 0

  • Like 2
رابط هذا التعليق
شارك

4 دقائق مضت, صالح حمادي said:

أعتقد هذا السطر يساوي 0 و ليس أكبر من 0

شكرا جزيلا 🙂

انا ارد على السؤال اثناء تناول الغداء ، فمعذور :biggrin:

 

فالمعادلة الصحيحة تكون :

If DCount("*", "test1", "login='" & Me.Texte1 & "'" & " and passe='" & Me.Texte3 & "'") = 0 Then

 

جعفر

  • Like 1
  • Haha 1
رابط هذا التعليق
شارك

5 دقائق مضت, jjafferr said:

انا ارد على السؤال اثناء تناول الغداء ، فمعذور :biggrin:

أنا قلت لحالي يمكن تعزمنا معاك على هذا الغداء 🥩🍌🍇

رابط هذا التعليق
شارك

39 دقائق مضت, jjafferr said:

شكرا جزيلا 🙂

انا ارد على السؤال اثناء تناول الغداء ، فمعذور :biggrin:

 

فالمعادلة الصحيحة تكون :


If DCount("*", "test1", "login='" & Me.Texte1 & "'" & " and passe='" & Me.Texte3 & "'") = 0 Then

 

جعفر

بالف هنا اخى ومعلمنا العزيز

رابط هذا التعليق
شارك

شكرا لك أستاذ jjafferr و أستاذ صالح حمادي على هذه المشاركة ولك كان سؤال هو عند كتابة في مربع login اسم المستخدم صحيح وفي الخانة pass رقم سري خاطئ مع اضافة 'or 1='1 ل login يقوم بدخول اليه كما هو موضح في صورة هل هناك حل لهذه المشكلة

2020-04-03_135801.png

حتي وان ستعملنا الدالة dlookup

If DLookup("id", "test1", "login='" & Me.Texte1 & " 'and passe='" & Me.Texte3 & "'") Then

   DoCmd.OpenForm "test2", acNormal
        DoCmd.Close acForm, Me.Name, acSaveNo
        
    Else
        
        MsgBox "????"
    End If

 

تم تعديل بواسطه rey360
رابط هذا التعليق
شارك

فيما يخص الدالة  dlookup استطعت بفضل الله أن أجد لها حل ولازلت أبحث حل بالنسبة ل recordset

On Error GoTo errouu
 If Me.Texte3 = DLookup("passe", "test1", "login='" & Me.Texte1 & "'") Then

   DoCmd.OpenForm "test2", acNormal
   DoCmd.Close acForm, Me.Name, acSaveNo
        
    Else
        
        MsgBox "????"
    End If
errouu :

حتى المعادلة الخاصة بأستاذ jjafferr لا يمكن اخترقها بهذه الطريقة

If DCount("*", "test1", "login='" & Me.Texte1 & "'" & " and passe='" & Me.Texte3 & "'") = 0 Then
        MsgBox "????"
    Else
        DoCmd.OpenForm "test2", acNormal
        DoCmd.Close acForm, Me.Name, acSaveNo
    End If

 

تم تعديل بواسطه rey360
  • Like 1
رابط هذا التعليق
شارك

هذة ثغرة للاستعلامات البنيوية تمكن مستخدمها من الدخول على قواعد البيانات في حالات معينة

وخطرها ليس فقط بامكانية تسجيل الدخول وانما يمكن تنفيذ اوامر sql مثل DROP TABLE وغيرها من الاوامر

يتم الدخول باستخدام

a' or 't'='t

' or '1'='1

' or 1='1

هل هي مقتصرة على قواعد البيانات

الحقيقة يمكن استخدامها مع تطبيقات php التي تستخدم قواعد البيانات  ولكن التوسع في مثل هذه الامور اجده غير نافع

في حالتك اخي جرب في كودك الاصلي ان تغيير تنسيق حقل الباس الى رقم عام ستجد ان الثغرة لن تعمل

مع ذلك من الافضل ان تستخدم الكود الذي وضعه الاستاذ الفاضل @jjafferr

    If DCount("*", "test1", "login='" & Me.Texte1 & "'" & " and passe='" & Me.Texte3 & "'") > 0 Then
        MsgBox "????"
    Else
        DoCmd.OpenForm "test2", acNormal
        DoCmd.Close acForm, Me.Name, acSaveNo
End If

هذا والله اعلم

  • Like 3
رابط هذا التعليق
شارك

2 ساعات مضت, kha9009lid said:

هذة ثغرة للاستعلامات البنيوية

شكرا جزيلا اخوي خالد 🙂

 

يا ريت اخوي محمد (rey360) اعطيتنا هذه التفاصيل من البداية 🙂

 

على العموم ، انا ارفقت لك هذا الكود في مشاركاتي السابقة ، فرجاء تجربه :

    Dim myWhere As String
    
    myWhere = "login='" & Me.Texte1 & "'"
    myWhere = myWhere & " and"                          '<اهم شيء هو ترك مسافة في البداية قبل and
    myWhere = myWhere & " passe='" & Me.Texte3 & "'"    '<اهم شيء هو ترك مسافة في البداية قبل passe
    Debug.Print myWhere

    If DCount("*", "test1", myWhere) = 0 Then
        MsgBox "????"
    Else
        DoCmd.OpenForm "test2", acNormal
        DoCmd.Close acForm, Me.Name, acSaveNo
    End If

 

جعفر

  • Like 2
رابط هذا التعليق
شارك

7 دقائق مضت, jjafferr said:

على العموم ، انا ارفقت لك هذا الكود في مشاركاتي السابقة ، فرجاء تجربه :

مرحبا اخي جعفر يمكن تجاوز كلمة المرور

الافضلاستخدام كودك التالي

    If DCount("*", "test1", "login='" & Me.Texte1 & "'" & " and passe='" & Me.Texte3 & "'") > 0 Then
        MsgBox "????"
    Else
        DoCmd.OpenForm "test2", acNormal
        DoCmd.Close acForm, Me.Name, acSaveNo
End If

 

تجاوز.PNG

' or '1'='2.PNG

  • Like 2
رابط هذا التعليق
شارك

19 دقائق مضت, jjafferr said:

شكرا جزيلا اخوي خالد 🙂

 

يا ريت اخوي محمد (rey360) اعطيتنا هذه التفاصيل من البداية 🙂

 

على العموم ، انا ارفقت لك هذا الكود في مشاركاتي السابقة ، فرجاء تجربه :


    Dim myWhere As String
    
    myWhere = "login='" & Me.Texte1 & "'"
    myWhere = myWhere & " and"                          '<اهم شيء هو ترك مسافة في البداية قبل and
    myWhere = myWhere & " passe='" & Me.Texte3 & "'"    '<اهم شيء هو ترك مسافة في البداية قبل passe
    Debug.Print myWhere

    If DCount("*", "test1", myWhere) = 0 Then
        MsgBox "????"
    Else
        DoCmd.OpenForm "test2", acNormal
        DoCmd.Close acForm, Me.Name, acSaveNo
    End If

 

جعفر

الكود شغال 100%  :signthankspin:

رابط هذا التعليق
شارك

  • أفضل إجابة

يمكننا بهذه الطريقة التغلب على هذه الحركات في اسم المستخدم او كلمة السر ،

بحيث نستبدل اشارة ' بـ _ ونقارن الكلمات بالجدول :

    Dim u, p As String
    
    u = Replace(Me.Texte1, "'", "_")
    p = Replace(Me.Texte3, "'", "_")

 

والآن جربها على اي من الطرق التي اقترحتها :


    Dim rs As dao.Recordset
    Dim u, p As String
    
    u = Replace(Me.Texte1, "'", "_")
    p = Replace(Me.Texte3, "'", "_")
    
'    Set rs = CurrentDb.OpenRecordset("select * from test1", dbOpenDynaset)

'    If Not rs.EOF Then rs.MoveFirst
'    Debug.Print "login='" & u & "'" & " and passe='" & p & "'"
'    rs.FindFirst ("login='" & u & "'" & " and passe='" & p & "'")

'    If rs.NoMatch = True Then
'        MsgBox "????"
'    Else
'        DoCmd.OpenForm "test2", acNormal
'        DoCmd.Close acForm, Me.Name, acSaveNo
'    End If
'
'    Set rs = Nothing
    
    
'    If DCount("*", "test1", "login='" & u & "'" & " and passe='" & p & "'") = 0 Then
'        MsgBox "????"
'    Else
'        DoCmd.OpenForm "test2", acNormal
'        DoCmd.Close acForm, Me.Name, acSaveNo
'    End If
    
    Dim myWhere As String
    
    myWhere = "login='" & u & "'"
    myWhere = myWhere & " and"                          '<اهم شيء هو ترك مسافة في البداية قبل and
    myWhere = myWhere & " passe='" & p & "'"    '<اهم شيء هو ترك مسافة في البداية قبل passe
    Debug.Print myWhere
'    rs.FindFirst myWhere
'
'    او
    If DCount("*", "test1", myWhere) = 0 Then
        MsgBox "????"
    Else
        DoCmd.OpenForm "test2", acNormal
        DoCmd.Close acForm, Me.Name, acSaveNo
    End If
    

.

جعفر

  • Like 1
  • Thanks 1
رابط هذا التعليق
شارك

أستاذ kha9009lid الطريقتين يمكن اختراقهما بعدما عدلة كتابة كما في الصورة أدناه

If DCount("*", "test1", "login='" & Me.Texte1 & "'" & " and passe='" & Me.Texte3 & "'") = 0 Then
        MsgBox "????"
    Else
        DoCmd.OpenForm "test2", acNormal
        DoCmd.Close acForm, Me.Name, acSaveNo
    End If
  Dim myWhere As String
    
    myWhere = "login='" & Me.Texte1 & "'"
    myWhere = myWhere & " and"                          '<اهم شيء هو ترك مسافة في البداية قبل and
    myWhere = myWhere & " passe='" & Me.Texte3 & "'"    '<اهم شيء هو ترك مسافة في البداية قبل passe
    Debug.Print myWhere

    If DCount("*", "test1", myWhere) = 0 Then
        MsgBox "????"
    Else
        DoCmd.OpenForm "test2", acNormal
        DoCmd.Close acForm, Me.Name, acSaveNo
    End If

الا أنا الطريقة الاخيرة للاستاذ jjafferr لا يمكن اخترقها بهذه الكيفية 

34 دقائق مضت, jjafferr said:

يمكننا بهذه الطريقة التغلب على هذه الحركات في اسم المستخدم او كلمة السر ،

بحيث نستبدل اشارة ' بـ _ ونقارن الكلمات بالجدول :


    Dim u, p As String
    
    u = Replace(Me.Texte1, "'", "_")
    p = Replace(Me.Texte3, "'", "_")

 

والآن جربها على اي من الطرق التي اقترحتها :



    Dim rs As dao.Recordset
    Dim u, p As String
    
    u = Replace(Me.Texte1, "'", "_")
    p = Replace(Me.Texte3, "'", "_")
    
'    Set rs = CurrentDb.OpenRecordset("select * from test1", dbOpenDynaset)

'    If Not rs.EOF Then rs.MoveFirst
'    Debug.Print "login='" & u & "'" & " and passe='" & p & "'"
'    rs.FindFirst ("login='" & u & "'" & " and passe='" & p & "'")

'    If rs.NoMatch = True Then
'        MsgBox "????"
'    Else
'        DoCmd.OpenForm "test2", acNormal
'        DoCmd.Close acForm, Me.Name, acSaveNo
'    End If
'
'    Set rs = Nothing
    
    
'    If DCount("*", "test1", "login='" & u & "'" & " and passe='" & p & "'") = 0 Then
'        MsgBox "????"
'    Else
'        DoCmd.OpenForm "test2", acNormal
'        DoCmd.Close acForm, Me.Name, acSaveNo
'    End If
    
    Dim myWhere As String
    
    myWhere = "login='" & u & "'"
    myWhere = myWhere & " and"                          '<اهم شيء هو ترك مسافة في البداية قبل and
    myWhere = myWhere & " passe='" & p & "'"    '<اهم شيء هو ترك مسافة في البداية قبل passe
    Debug.Print myWhere
'    rs.FindFirst myWhere
'
'    او
    If DCount("*", "test1", myWhere) = 0 Then
        MsgBox "????"
    Else
        DoCmd.OpenForm "test2", acNormal
        DoCmd.Close acForm, Me.Name, acSaveNo
    End If
    

.

جعفر

 

 

2020-04-03_182343.png

تم تعديل بواسطه rey360
  • Like 1
رابط هذا التعليق
شارك

اخي الفاضل محمد

انا كان ردي على كود الاستاذ جعفر

Dim myWhere As String
    
    myWhere = "login='" & Me.Texte1 & "'"
    myWhere = myWhere & " and"                          '<اهم شيء هو ترك مسافة في البداية قبل and
    myWhere = myWhere & " passe='" & Me.Texte3 & "'"    '<اهم شيء هو ترك مسافة في البداية قبل passe
    Debug.Print myWhere

    If DCount("*", "test1", myWhere) = 0 Then
        MsgBox "????"
    Else
        DoCmd.OpenForm "test2", acNormal
        DoCmd.Close acForm, Me.Name, acSaveNo
    End If

ولم اجرب التعديلات الاخيرة في رد الاستاذ جعفر

لكونك وجدت ان الحل مناسب لك وهذا هو المطلوب

اما بخصوص الرد الاخير للاستاذ جعفر فهوا الحل المناسب

    Dim u, p As String
    
    u = Replace(Me.Texte1, "'", "_")
    p = Replace(Me.Texte3, "'", "_")
    

تقبل من اخيك اطيب ايات التقدير والاحترام :fff:

  • Like 3
رابط هذا التعليق
شارك

السلام عليكم 🙂

 

جاء على بالي ، اذا كلمة السر هي (او حتى اسم المستخدم فيه العلامة/الاشارة) :

kl;'';lk

 

لذا في الكود ، يجب تغيير كلمة السر مال الجدول ، بالاضافة الى تغيير كلمة السر التي تم ادخالها :

    
    'chr(39)= '
    'chr(95)= _

    u = Replace(Me.Texte1, Chr(39), Chr(95))
    p = Replace(Me.Texte3, Chr(39), Chr(95))

    myWhere = "Replace(login, chr(39), chr(95))='" & u & "'"
    myWhere = myWhere & " and"                                              '<اهم شيء هو ترك مسافة في البداية قبل and
    myWhere = myWhere & " Replace(passe, chr(39), chr(95))='" & p & "'"    '<اهم شيء هو ترك مسافة في البداية قبل passe
    Debug.Print myWhere

 

جعفر

  • Like 4
رابط هذا التعليق
شارك

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information