rey360 قام بنشر أبريل 3, 2020 قام بنشر أبريل 3, 2020 السلام عليكم أعضاء المنتدي الكرام في المثال أدناه طريقة فور لدخول المستخدم عن طريق recordset و sql ولكن هناك مشكلة في حالة وضع في login أو كلمة المرور كلمة مرور خاطئ ووضع أمامها 'or 1='1 يقوم بدخول الى الفورم وهذه المشكلة تدعى SQL injection هل هناك حل لها وشكرا test.accdb
jjafferr قام بنشر أبريل 3, 2020 قام بنشر أبريل 3, 2020 وعليكم السلام 🙂 انا ما فهمت السؤال ، ولكن وجدت خطأ في الكود 🙂 وعلشان تعرف وين الخطأ ، دائما استعين بـ 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 جعفر 2 1
صالح حمادي قام بنشر أبريل 3, 2020 قام بنشر أبريل 3, 2020 8 دقائق مضت, jjafferr said: If DCount("*", "test1", "login='" & Me.Texte1 & "'" & " and passe='" & Me.Texte3 & "'") > 0 Then أستاذ جعفر أعتقد هذا السطر يساوي 0 و ليس أكبر من 0 2
jjafferr قام بنشر أبريل 3, 2020 قام بنشر أبريل 3, 2020 4 دقائق مضت, صالح حمادي said: أعتقد هذا السطر يساوي 0 و ليس أكبر من 0 شكرا جزيلا 🙂 انا ارد على السؤال اثناء تناول الغداء ، فمعذور فالمعادلة الصحيحة تكون : If DCount("*", "test1", "login='" & Me.Texte1 & "'" & " and passe='" & Me.Texte3 & "'") = 0 Then جعفر 1 1
صالح حمادي قام بنشر أبريل 3, 2020 قام بنشر أبريل 3, 2020 5 دقائق مضت, jjafferr said: انا ارد على السؤال اثناء تناول الغداء ، فمعذور أنا قلت لحالي يمكن تعزمنا معاك على هذا الغداء 🥩🍌🍇
jjafferr قام بنشر أبريل 3, 2020 قام بنشر أبريل 3, 2020 هلا ومرحبا بيك ، وبأهلك ، وبالجمل اللي رحل بك 🙂 1
صالح حمادي قام بنشر أبريل 3, 2020 قام بنشر أبريل 3, 2020 2 دقائق مضت, jjafferr said: هلا ومرحبا بيك ، وبأهلك ، وبالجمل اللي رحل بك 🙂 خلاص أنا على الطريق قادم 🐪
أبوبسمله قام بنشر أبريل 3, 2020 قام بنشر أبريل 3, 2020 39 دقائق مضت, jjafferr said: شكرا جزيلا 🙂 انا ارد على السؤال اثناء تناول الغداء ، فمعذور فالمعادلة الصحيحة تكون : If DCount("*", "test1", "login='" & Me.Texte1 & "'" & " and passe='" & Me.Texte3 & "'") = 0 Then جعفر بالف هنا اخى ومعلمنا العزيز
rey360 قام بنشر أبريل 3, 2020 الكاتب قام بنشر أبريل 3, 2020 (معدل) شكرا لك أستاذ jjafferr و أستاذ صالح حمادي على هذه المشاركة ولك كان سؤال هو عند كتابة في مربع login اسم المستخدم صحيح وفي الخانة pass رقم سري خاطئ مع اضافة 'or 1='1 ل login يقوم بدخول اليه كما هو موضح في صورة هل هناك حل لهذه المشكلة حتي وان ستعملنا الدالة 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 تم تعديل أبريل 3, 2020 بواسطه rey360
rey360 قام بنشر أبريل 3, 2020 الكاتب قام بنشر أبريل 3, 2020 (معدل) فيما يخص الدالة 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 تم تعديل أبريل 3, 2020 بواسطه rey360 1
kha9009lid قام بنشر أبريل 3, 2020 قام بنشر أبريل 3, 2020 هذة ثغرة للاستعلامات البنيوية تمكن مستخدمها من الدخول على قواعد البيانات في حالات معينة وخطرها ليس فقط بامكانية تسجيل الدخول وانما يمكن تنفيذ اوامر 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 هذا والله اعلم 3
jjafferr قام بنشر أبريل 3, 2020 قام بنشر أبريل 3, 2020 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 جعفر 2
kha9009lid قام بنشر أبريل 3, 2020 قام بنشر أبريل 3, 2020 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 2
rey360 قام بنشر أبريل 3, 2020 الكاتب قام بنشر أبريل 3, 2020 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%
أفضل إجابة jjafferr قام بنشر أبريل 3, 2020 أفضل إجابة قام بنشر أبريل 3, 2020 يمكننا بهذه الطريقة التغلب على هذه الحركات في اسم المستخدم او كلمة السر ، بحيث نستبدل اشارة ' بـ _ ونقارن الكلمات بالجدول : 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 . جعفر 1 1
kha9009lid قام بنشر أبريل 3, 2020 قام بنشر أبريل 3, 2020 4 دقائق مضت, rey360 said: الكود شغال 100% الحمد لله ان الحل نفع معك علما باني قد تجاوزنة بالامر a' or 't'='t واعدت المحاولة بزيادة المسافة وايضا تم تجاوز كلمة المرور 3
rey360 قام بنشر أبريل 3, 2020 الكاتب قام بنشر أبريل 3, 2020 أستاذ jjafferr الطريقة شغالة و تم اغلاق الثغرة شكرا لك 1
rey360 قام بنشر أبريل 3, 2020 الكاتب قام بنشر أبريل 3, 2020 (معدل) أستاذ 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 . جعفر تم تعديل أبريل 3, 2020 بواسطه rey360 1
kha9009lid قام بنشر أبريل 3, 2020 قام بنشر أبريل 3, 2020 اخي الفاضل محمد انا كان ردي على كود الاستاذ جعفر 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, "'", "_") تقبل من اخيك اطيب ايات التقدير والاحترام 3
jjafferr قام بنشر أبريل 6, 2020 قام بنشر أبريل 6, 2020 السلام عليكم 🙂 جاء على بالي ، اذا كلمة السر هي (او حتى اسم المستخدم فيه العلامة/الاشارة) : 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 جعفر 4
kha9009lid قام بنشر أبريل 7, 2020 قام بنشر أبريل 7, 2020 (معدل) الله اكبر ولله الحمد تم تعديل أبريل 7, 2020 بواسطه kha9009lid
الردود الموصى بها
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.