Foksh قام بنشر نوفمبر 20 قام بنشر نوفمبر 20 أخواني وأساتذتي ومعلمينا ( دون استثناء ) أدعوكم لتجربة قيد الإختبار ، بحيث يوجد في قاعدة البيانات الحالية المرفقة جدول باسم Table1 . يحتوي سجلات محمية . وأريد تجربة إن كان بالإمكان استيراد هذه السجلات أو معرفة القيم التي فيها ، و بأي وسيلة أو طريقة تخطر على بال من يحاول التجربة بالتعرف على السجلات . الهدف حماية السجلات من العبث ومنع استيرادها بتاتاً . 1. القاعدة غير محمية بكلمة مرور أو حتى أنها غير محفوظة بصيغة Accde ... 2. ما يهمني هو الطريقة التي تم بها الكشف عن الجدول . وليس النتيجة ذاتها Hide TBL.accdb 1
عمر ضاحى قام بنشر نوفمبر 20 قام بنشر نوفمبر 20 3 ساعات مضت, Foksh said: أخواني وأساتذتي ومعلمينا ( دون استثناء ) أدعوكم لتجربة قيد الإختبار ، بحيث يوجد في قاعدة البيانات الحالية المرفقة جدول باسم Table1 . يحتوي سجلات محمية . وأريد تجربة إن كان بالإمكان استيراد هذه السجلات أو معرفة القيم التي فيها ، و بأي وسيلة أو طريقة تخطر على بال من يحاول التجربة بالتعرف على السجلات . الهدف حماية السجلات من العبث ومنع استيرادها بتاتاً . القاعدة غير محمية بكلمة مرور أو حتى أنها غير محفوظة بصيغة Accde ... Hide TBL.accdb 416 kB · 2 downloads تقصد ان كنت اقدر اعرف البيانات ال فى الجدول المخفي زذ كده ؟ 1
Foksh قام بنشر نوفمبر 20 الكاتب قام بنشر نوفمبر 20 السادة الأفاضل الكرام ، الأساتذة ( @kanory ، @عمر ضاحى ، @Barna ) الذين ساهموا بمشاركتهم بالتجربة والإفادة بالنتيجة .. بدايةً شكراً لكم لمشاركتكم ، وأعلم أنكم بخبرتكم قادرون على تحقيق المطلوب بشتى السُبل والطـُرق . كانت البداية بأن الملف بصيغة ACCDB ؛ أي أنني تركت لمن يرغب بالمشاركة - باب التجربة مفتوحاً - بأكواد أو استعلامات أو أي طريقة يراها مناسبة لتحقيق المطلوب . 💥 ولكن كمطور فطبعاً لن يتم تسليم أي مشروع لأي عميل بهذا الشكل - الغير محمي - وبالتالي لا بد من حماية وتشفير الملف وتقفيله بعد إتمام المشروع بصيغة ACCDE مع باقي الإحتياط التي يتخذها المصمم والمطور والمبرمج ، صحيح ؟ ☢ وهنا جاءت الفكرة التي رغبت بتجربتها وتنفيذها ، بحيث سيكون التنفيذ والإختبار على ملف مقفل فقط بحفظه بصيغة ACCDE لم أضع كلمة مرور - له - على محرر الأكواد . لذا أرجو منكم الإفادة بالتجربة على نفس الملف ولكن بصيغة ACCDE . مع العلم أن المكون هو جدول واحد و سجل واحد فقط . ولن يهمني كثيراً اسم الجدول بقدر ما يهمني السجل الذي يحتويه الجدول كبيانات كما أرجو أن يتم ذكر الطريقة التي تم بها التعرف على هذا السجل والجدول . ولن أطلب أي أكواد بقدر ما يهمني الطريقة ذاتها . HideTBL V1-32.zip HideTBL V1-64.zip 1
ابوخليل قام بنشر نوفمبر 20 قام بنشر نوفمبر 20 هل هذا هو المطلوب ؟ اذا نعم .. لا تسألني كيف ظهر .. لا ادري كيف ظهر معي 1
Foksh قام بنشر نوفمبر 20 الكاتب قام بنشر نوفمبر 20 3 ساعات مضت, ابوخليل said: لا ادري كيف ظهر معي هو المطلوب بعينه ، ولكن إن لم يكن معلمي يدري ، فمن يدري !!! 1
jjafferr قام بنشر نوفمبر 20 قام بنشر نوفمبر 20 السلام عليكم 🙂 ولو اني مشغول لقمة رأسي ومسافر غدا ان شاء الله ، ولكني اردت المشاركة تفاعلا مع اخي ابوخليل 🙂 . وطريقتي: بالاشارة الى موضوعي ، الجزء الاول: واليك الجزء الثاني من الموضوع: 1. عملت ملف اكسس فارغ، وعملت فيه الاستعلام التالي لقراءة جدول MSysObjects برنامجك ، والذي يحتوي على جميع جداول البرنامج : SELECT MSysObjects.* FROM [D:\temp\1642.HideTBL V1-32.accde].MSysObjects ORDER BY MSysObjects.DateUpdate DESC; . والسبب في الفرز التنازلي ، هو لحقل تاريخ تحديث الجداول ، يعني اخر جداول عملت عليها التحديث (فقط علشان سهولة الوصول للجدول المطلوب). وحتى لو ما عملت الفرز ، فكان بإمكاني عمل كود لفحص الجداول فردا فردا 🙂 وحصلت على الجداول التالية: . ومنها جربت الجدول AccessTbl : SELECT AccessTbl.* FROM [D:\temp\1642.HideTBL V1-32.accde].AccessTbl . وحصلت على النتيجة 🙂 جعفر 2
Foksh قام بنشر نوفمبر 20 الكاتب قام بنشر نوفمبر 20 7 ساعات مضت, jjafferr said: وحصلت على النتيجة 🙂 ما شاء الله عليك .. أولاً نشكر معلمنا أبو خليل لمشاركته وجعله الحافز الذي أنرت به موضوعي المتواضع .. شرح جميل جداً وطريقة مبتكرة أيضاً وجميلة .. سلمت تلك الأنامل والأفكار النيراتِ 1
ابوخليل قام بنشر نوفمبر 20 قام بنشر نوفمبر 20 كلنا نعلم ان ليس هناك حماية مطلقة اقتنعت بهذه المقولة متأخرا كنت الجأ سابقا في حماية برامجي الى طرق قراقوشية لا تخطر على البال .. غرس ملفات في النظام وبيانات خاصة في الريجستري .. وكأني احمي سر القنبلة الكونبة لكني الآن تركت كل ذلك وجعلت مفتاح البرنامج متاحا في ملف تكست ظاهر بجانب قاعدة البيانات .. ملكا لصاحبه .. اما قاعدة الجداول فلم اجد افضل لها من كلمة المرور لحماية البيانات من النسخ ,, وان كانت بعض البيانات شديدة الاهمية لجأت لتشفيرها لحجب قرائتها فيما لو تمكن احد من فك كلمة المرور وتمكن من الدخول الى الجدول . 1 1
Foksh قام بنشر نوفمبر 20 الكاتب قام بنشر نوفمبر 20 9 دقائق مضت, ابوخليل said: كلنا نعلم ان ليس هناك حماية مطلقة اقتنعت بهذه المقولة متأخرا كنت الجأ سابقا في حماية برامجي الى طرق قراقوشية لا تخطر على البال .. غرس ملفات في النظام وبيانات خاصة في الريجستري .. وكأني احمي سر القنبلة الكونبة لكني الآن تركت كل ذلك وجعلت مفتاح البرنامج متاحا في ملف تكست ظاهر بجانب قاعدة البيانات .. ملكا لصاحبه .. اما قاعدة الجداول فلم اجد افضل لها من كلمة المرور لحماية البيانات من النسخ ,, وان كانت بعض البيانات شديدة الاهمية لجأت لتشفيرها لحجب قرائتها فيما لو تمكن احد من فك كلمة المرور وتمكن من الدخول الى الجدول . أعلم يقيناً ذلك وبقناعة مطلقة ، إلا أنني .. في أحد المشاريع لبرنامج خاص بمكتب تسهيلات الفيزا لأحد الأصدقاء . كان لي توجه بحيث !!!!! 1. عند تشغيل قاعدة البيانات يتم الإتصال بقاعدة البيانات الخلفية الأساسية . واستخراج قاعدة بيانات خلفية أخرى بنفس الجداول مخفية في مسار داخل الويندوز ( لعدم أهميته لأنه خالي من البيانات ) 2. عند الإغلاق يتم إعادة ربط قاعدة البيانات قبل اغلاقها بقاعدة الجداول الخلفية الوهمية ( التي لا تحتوي على بيانات ) . طبعاً الثغرة واضحة جداً لمن يتمعن إلا أنها كانت متينة عند عدم عمل قاعدة البيانات بأنه لن يجد أي شخص بيانات داخل قاعدة البيانات الخلفية .
منتصر الانسي قام بنشر نوفمبر 20 قام بنشر نوفمبر 20 (معدل) انا طريقتي تختلف عن الاخوان حيث قمت بإظهار الجدول نفسه كما بالصورة وللقيام بذلك قم بتنفيذ الخطوات كالتالي 1- إنسخ الملف تحت القرص D مباشرة (يمكن نسخه إلى أي مكان ولكن هكذا سيكون المسار قصير) 2- إفتح الملف وقم بإنشاء الاستعلام التالي (هذه الخطوة غير مهمة لكم لإني سبق واستخرجت قيمة العمود المطلوب ووضعتها في الكود ولكني ذكرتها للتعرف على الخطوات) SELECT MSysObjects.Flags, MSysObjects.Name, MSysObjects.Type FROM MSysObjects WHERE ( ((MSysObjects.Name) NOT LIKE "MSys*") AND ((MSysObjects.Type) = 1) ); من خلال هذا الاستعلام سنتعرف على أي جدول Type=1 ولايبدأ بالأحرف MSys لتظهر لنا النتيجة كما بالصورة مايهمنا هنا هي قيمة العمود الأول Flags بعد ذلك قم بإغلاق التطبيق بدون حفظ اي شيء 3- إفتح أي قاعدة بيانات أخرى (سواء قاعدة بيانات فارغة أو مستخدمة لايهم) وفي أي وحدة نمطية (جديدة أو فيها اكواد لايهم) والصق فيها الإجراء التالي Sub sbUnHideTables() Dim app As Access.Application Dim wks As Workspace Dim db As dao.Database Dim rst As dao.Recordset Dim tdf As TableDef Set app = New Access.Application Set wks = app.DBEngine(0) 'الإصدار 64 Set db = wks.OpenDatabase("D:\HideTBL V1-64.accde") 'مسار الملف 'الإصدار 32 'Set db = wks.OpenDatabase("D:\HideTBL V1-32.accde") 'مسار الملف For Each tdf In db.TableDefs If tdf.Attributes = -2147483645 Then tdf.Attributes = 0 'تغيير قيمة العمود Flags Next tdf Set db = Nothing End Sub 4- انقر الزر F5 لتشغيل الإجراء حيث سيقوم بتغيير قيمة العمود Flags إلى القيمة صفر 5- اغلق قاعدة البيانات التي قمنا بتنفيذ الكود فيها (حفظ الكود من عدمه راجع لك) 6- الان إذهب إلى القرص D وقم بفتح الملف (HideTBL V1-64.accde او HideTBL V1-32.accde وفقاً لإصدار أوفيس لديك) لتجد أن الجدول قد ظهر في جزء التنقل تحياتي تم تعديل نوفمبر 20 بواسطه منتصر الانسي 1 1
Foksh قام بنشر نوفمبر 20 الكاتب قام بنشر نوفمبر 20 جميل جداً هذا التوضيح والطريقة الجميلة أيضاً .. 16 دقائق مضت, منتصر الانسي said: من خلال هذا الاستعلام سنتعرف على أي جدول Type=1 ولايبدأ بالأحرف MSys لتظهر لنا النتيجة كما بالصورة التعرف على أنه إذا كانت Type = 1 وبالتالي النوع 1 = جدول هي بحد ذاتها أيضاً فكرة جميلة . اقتباس مايهمنا هنا هي قيمة العمود الأول Flags بعد ذلك قم بإغلاق التطبيق بدون حفظ اي شيء وبما أن قيمة الـتعليمة Flags = -2147483645 وهي قيمة ثابتة في اكسيس لجميع إصدارات أوفيس ، وهي للتوضيح الواجب أنه ليس لأوفيس علاقة بفرضها بهذه القيمة . بل يفرضها نظام التشغيل نفسه ( Windows ) على حد علمي . أما بخصوص السطر والفكرة التالية :- 33 دقائق مضت, منتصر الانسي said: If tdf.Attributes = -2147483645 Then tdf.Attributes = 0 فهي بحد ذاتها جريئة وإلتفاته فتحت لي أفكاراً جديدة في هذا الخصوص . فشكراً لك ولكل من ساهم بإثراء الموضوع بمشاركته الجميلة والقيمة كجوهره 1
Foksh قام بنشر نوفمبر 21 الكاتب قام بنشر نوفمبر 21 في 20/11/2025 at 19:50, منتصر الانسي said: إفتح الملف وقم بإنشاء الاستعلام التالي وجب التنبيه إلى أن هذه الخطوة مشروطة بأن يكون هناك إمكانية بأن نضيف الاستعلام داخل نفس القاعدة المستهدفة . لكن ماذا لو كانت القاعدة غير متاحة بالإضافة 😉 ؟؟؟
محب العقيدة قام بنشر نوفمبر 22 قام بنشر نوفمبر 22 اعجني الموضوع من اول انشغالي بالاكسيس تيقنت ان الاكسيس من اضغف الحمايات لكني قكرة بان اسال الذكاء الصناعي سالت CHATGPT عن فكرة مجنونة لم يفكر بها احد لحماية الجداول ادعوا اخواني لتجربة الفكر المقترحة وانا ساجربها معكم مع توفر الوقت لدي سارفق الاجابة والسؤال الذي سالته انقر هنا 3
ابوخليل قام بنشر نوفمبر 22 قام بنشر نوفمبر 22 56 دقائق مضت, محب العقيدة said: اعجني الموضوع من اول انشغالي بالاكسيس تيقنت ان الاكسيس من اضغف الحمايات لكني قكرة بان اسال الذكاء الصناعي سالت CHATGPT عن فكرة مجنونة لم يفكر بها احد لحماية الجداول ادعوا اخواني لتجربة الفكر المقترحة وانا ساجربها معكم مع توفر الوقت لدي سارفق الاجابة والسؤال الذي سالته انقر هنا عجيب هذا الخادم العفريت 😳
Foksh قام بنشر نوفمبر 22 الكاتب قام بنشر نوفمبر 22 3 ساعات مضت, محب العقيدة said: ادعوا اخواني لتجربة الفكر المقترحة وانا ساجربها معكم مع توفر الوقت لدي من واقع التجربة ، ودون أي تردد وبلا أي شك ، فأنا ( أعوذ بالله من كلمة أنا ومن شر نفسي ) والكثيرين نتفق مؤيدين لكلام أساتذتنا ومعلمينا ، وحتى تعليمات مايكروسوفت ، أن آكسيس غير قادر على حماية البيانات وتأمينها . ومن خلال التجارب المريرة التي مررت بها وفكرت بها ، فإن الحل والسبيل الوحيد لتأمين البيانات سيكون خارج قاعدة البيانات نفسها . ( أو بحماية قاعدة البيانات الخلفية بكلمة مرور محكمة ) - ومع ذلك فالهندسة العكسية قادرة على الوصول إلى كلمة المرور - وبالتالي النجاح تشوبه بعض الشوائب . ولذا ذكرت في جملتي التالية :- في 20/11/2025 at 19:33, Foksh said: 2. عند الإغلاق يتم إعادة ربط قاعدة البيانات قبل اغلاقها بقاعدة الجداول الخلفية الوهمية ( التي لا تحتوي على بيانات ) . أيضاً كانت لي تجربة بسيطة طبقتها في لعبة كانسة الألغام 2025 . حيث أنني لم اعتمد على أي جداول لتخزين أسماء اللاعبين والمستويات التي وصل لها كل لاعب لإستردادها متى شاء . ومع ذلك - ودون أي جداول - يستطيع اللاعب الإستمرار من المستوى والمرحلة التي وصل لها مع الإحتفاظ بكامل ميزات اللعبة من مساعدات وحمايات اللعبة ... إلخ ، حتى بعد اعادة تشغيل الويندوز . فالفكرة لا تعتمد على متغيرات طويلة المدى .
منتصر الانسي قام بنشر نوفمبر 22 قام بنشر نوفمبر 22 19 ساعات مضت, Foksh said: لكن ماذا لو كانت القاعدة غير متاحة بالإضافة 😉 ؟؟؟ ماذا تقصد بغير متاحة ؟ - إن كنت تقصد بإنها مؤمنة بكلمة سر فأنت تعلم بأنه يمكن كسر هذا التأمين بسهولة - وإن كنت تقصد تأمين قاعدة البيانات عن طريق الكود بحيث أننا لن نستطيع فتحها عن طريق مفتاح Shift فيمكننا تنفيذ الاستعلام من أي قاعدة بيانات أخرى - وإذا تقصد أنك ستقوم بإخفاء قاعدة البيانات هذه للدرجة التي لايمكن أن يصل إليها أحد فأعتقد أن هذا هو أقوى تأمين ولن نحتاج للقلق من الوصول إلى البيانات داخلها فهل فكرتك هي ضمن هذه الحالات أم أن لديك فكرة أخرى؟
Foksh قام بنشر نوفمبر 22 الكاتب قام بنشر نوفمبر 22 7 دقائق مضت, منتصر الانسي said: ماذا تقصد بغير متاحة ؟ أنك غير قادر على إضافة الاستعلام لقاعدة البيانات كونها محمية بمفتاح الشيفت + ACCDE . 8 دقائق مضت, منتصر الانسي said: - وإذا تقصد أنك ستقوم بإخفاء قاعدة البيانات هذه للدرجة التي لايمكن أن يصل إليها أحد فأعتقد أن هذا هو أقوى تأمين ولن نحتاج للقلق من الوصول إلى البيانات داخلها الإخفاء ليس فكرة واردة لعدم نجاحها ، فبطبيعة الحالي يمكن الحصول على مسار قاعدة البيانات الخلفية أينما كانت من خلال قاعدة بيانات أخرى . لكني كنت قد علّقت على موضع الإستعلام ان كانت القاعدة Hide Access + منع مفتاح الشيفت .
منتصر الانسي قام بنشر نوفمبر 22 قام بنشر نوفمبر 22 17 دقائق مضت, Foksh said: أنك غير قادر على إضافة الاستعلام لقاعدة البيانات كونها محمية بمفتاح الشيفت + ACCDE . بسيطة إستخدم هذا الإستعلام من أي قاعدة بيانات أخرى SELECT MSysObjects.Flags, MSysObjects.Name, MSysObjects.Type FROM MSysObjects IN 'D:\HideTBL V1-64.accde' WHERE ( ((MSysObjects.Name) NOT LIKE "MSys*") AND ((MSysObjects.Type) = 1) ); وذلك على إفتراض أن الملف موجود تحت القرص D مباشرة وإلا قم بتعديل المسار تحياتي 1
محب العقيدة قام بنشر نوفمبر 23 قام بنشر نوفمبر 23 قمت بتجربة الحل من الذكاء الصناعي ووصلت الى مرحلة عند فتح IMMEDIATE WINDOWS وكتابة TestCompleteSystem ========== بدء الاختبار ========== 1. إنشاء مدير المواد... ? تم تحميل المواد بنجاح عدد المواد: 0 2. إضافة مواد جديدة... ? تمت إضافة: أرز - ID: 1 ? تمت إضافة: سكر - ID: 2 3. حفظ المواد... 4. إنشاء مدير الحركات... ? تم تحميل الحركات بنجاح 5. إضافة حركات إدخال... ? إدخال 100 وحدة أرز - ID: 1 ? إدخال 50 وحدة سكر - ID: 2 6. إضافة حركات إخراج... ? إخراج 20 وحدة أرز - ID: 3 7. حفظ التغييرات... 8. المخزون الحالي: - أرز: 80 كيس - سكر: 50 كيس ========== انتهى الاختبار بنجاح! ========== اكن عند تنفيذ الامر يخرج كثير من الرسائل ERROR SAVING STREAM OVERLOW ورسالة هل تريد حفظ التغيرات واعطيه نعم لكن عند طلب عدد المواد والحركات يعطيني صفر المشكلة أثناء محاولة إضافة البيانات الجديدة، يحدث خطأ Overflow. لكن لضيق الوقت لدي لم اكمل لعله غدا ان شاء الله او احد من الاخوة يكمل ويسال الذكاء الصناعي عن الحل اليكم التجربة Database1.accdb
منتصر الانسي قام بنشر نوفمبر 23 قام بنشر نوفمبر 23 اخي العزيز @محب العقيدة من خلال إطلاعي على ماجاء في المحادثة فإن الطريقة التي يعتمدها هي اقتباس بينما البيانات الحقيقية موجودة داخل OLE Field أو Attachment على شكل ملف بايتات لا يمكن تفسيره وهذا معناه شيئين اولاً الإعتماد على حقول نوع OLE أو Attachment لحفظ البيانات وهذا سيؤدي إلى تضخم حجم قاعدة البيانات بصورة كبيرة حتى ولو لم تحتوي إلا على بيانات قليلة ثانيا بهذه الطريقة سنفرغ قاعدة البيانات من مفهومها الرئيسي وهو الترميز والعلاقات لضمان تنظيم البيانات عدم تكرار البيانات الغير ضرورية فالذي يتم هنا هو أنه يتم أخذ بيانات السجل وتقسيمها إلى أجزاء وحفظها كـ xml دون مراعاة لقواعد التحقق من صحة البيانات وتكرارها بالإضافة إلى كل ماسبق فإن آلية العمل مشكوك فيها فإذا كنت قد شغلت الإجراء Test مرة وأفادني بالفعل أنه تم حفظ الكميات 8. المخزون الحالي: - أرز: 80 كيس - سكر: 50 كيس فيفترض أنه اصبح لدي بالفعل صنف بإسم أرز وصنف بإسم سكر الآن لو قمت بحذف أو تعليق الاسطر الخاصة بإنشاء الأصناف وهي ' 2. إضافة مواد Debug.Print "2. إضافة مواد جديدة..." itemID1 = itemsMgr.AddItem("أرز", "RICE001", "كيس", 10, 50, "أرز هندي") If itemID1 > 0 Then Debug.Print " ? تمت إضافة: أرز - ID: " & itemID1 End If itemID2 = itemsMgr.AddItem("سكر", "SUGAR001", "كيس", 5, 45, "سكر أبيض") If itemID2 > 0 Then Debug.Print " ? تمت إضافة: سكر - ID: " & itemID2 End If Debug.Print "" ' 3. حفظ المواد Debug.Print "3. حفظ المواد..." If itemsMgr.Save Then Debug.Print " ? تم حفظ المواد بنجاح" End If Debug.Print "" وقمت بتعديل الكميات في إجراءات الاضافة والتنزيل (او حتى بدون تعديلات) ستظهر لي الرسالة التالية وهذا معناه أنه قد نسي أنه تم حفظ الصنفين هذه هي ملاحظاتي السريعة على ماجاء في مشاركتك ان شاء الله تكون ملاحظات مفيدة تحياتي
محب العقيدة قام بنشر نوفمبر 24 قام بنشر نوفمبر 24 اخي منتصر يبدو ان الفكرة لم تصلك بعد التخزين سيكون( LongBinary (BLOB عموما اريد ان اطرح هذه الفكرة على منتديات اجنبية حتى ارى مدى سلبيتها او عدم فائدتها وانما هي فكرة من الذكاء الصناعي لحفظ الملفات الحساسة جدا ارفقت قاعدة البيانات قبل تحويلها الى ACCDE كيف تعمل وطلبت من الذكاء الصناعي ان بشرح الفكرة بشكل مفصل ────────────────────────────────────────────────┐ │ (Stream-Based Storage) │ ├─────────────────────────────────────────────────┤ │ │ │ tbl_SecureStorage │ │ ┌────────────────────────────────────────┐ │ │ │ StreamName │ DataBlob │ │ │ ├────────────────────────────────────────┤ │ │ │ ITEMS │ 57 48 52 53 32 30 32 35 │ │ │ │ │ 00 00 02 D4 49 54 45 4D │ │ │ │ │ 53 00 00 00 B3 F2 A1 9C │ │ │ │ │ [... 2000+ bytes ...] │ │ │ └────────────────────────────────────────┘ │ │ │ │ ← البيانات **مشفرة وغير مفهومة** │ │ ← لا يمكن قراءتها بدون الكود الخاص │ └─────────────────────────────────────────────────┘ 🔐 رحلة البيانات: من الإدخال إلى التخزين السيناريو: إضافة مادة "أرز" ┌─────────────────────────────────────────────────────┐ │ 1. المستخدم يدخل البيانات │ └─────────────────────────────────────────────────────┘ ↓ اسم المادة: أرز الكمية: 100 السعر: 50 ↓ ┌─────────────────────────────────────────────────────┐ │ 2. تُحفظ في الذاكرة (ADODB.Recordset) │ └─────────────────────────────────────────────────────┘ ↓ ItemID=1, ItemName="أرز", Quantity=100, Price=50 ↓ ┌─────────────────────────────────────────────────────┐ │ 3. عند الضغط على "حفظ" │ │ → clsItemsManager.Save() │ └─────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────┐ │ 4. التحويل إلى XML (modSerializer) │ └─────────────────────────────────────────────────────┘ ↓ <records> <record> <ItemID>1</ItemID> <ItemName>أرز</ItemName> <Quantity>100</Quantity> <Price>50</Price> </record> </records> ↓ ┌─────────────────────────────────────────────────────┐ │ 5. تحويل XML إلى Bytes (modSerializer) │ └─────────────────────────────────────────────────────┘ ↓ [60, 114, 101, 99, 111, 114, 100, 115, ...] ↓ ┌─────────────────────────────────────────────────────┐ │ 6. التشفير XOR (modSecurity) │ └─────────────────────────────────────────────────────┘ ↓ [183, 227, 94, 201, 88, 129, 47, 93, ...] ↓ ┌─────────────────────────────────────────────────────┐ │ 7. إضافة Header (modSecurity) │ └─────────────────────────────────────────────────────┘ ↓ [WRHS2025][00 00 02 D4][ITEMS...][encrypted data] ↑ ↑ ↑ ↑ Signature Length Name Encrypted XML ↓ ┌─────────────────────────────────────────────────────┐ │ 8. حساب Hash (modSecurity) │ └─────────────────────────────────────────────────────┘ ↓ Hash = "5A5A7B3C-000002D4" ↓ ┌─────────────────────────────────────────────────────┐ │ 9. الحفظ في tbl_SecureStorage (modDataStorage) │ └─────────────────────────────────────────────────────┘ ↓ INSERT INTO tbl_SecureStorage (StreamName, DataBlob, DataHash, RecordCount) VALUES ('ITEMS', [Binary], '5A5A7B3C-000002D4', 1) ↓ ┌─────────────────────────────────────────────────────┐ │ ✓ البيانات محفوظة على القرص! │ └─────────────────────────────────────────────────────┘ 📊 المقارنة التفصيلية نظام Access التقليدي: البيانات الأصلية: ItemID = 1 ItemName = "أرز" Price = 50 ↓↓↓ تُحفظ مباشرة في الجدول ↓↓↓ tbl_Items ┌────────┬──────────┬───────┐ │ ItemID │ ItemName │ Price │ ├────────┼──────────┼───────┤ │ 1 │ أرز │ 50 │ ← مرئي ومقروء! └────────┴──────────┴───────┘ ✗ أي شخص يفتح الجدول يرى البيانات ✗ يمكن ربطه من Excel/Access آخر ✗ يمكن كشفه عبر MSysObjects نظامك الثوري: البيانات الأصلية: ItemID = 1 ItemName = "أرز" Price = 50 ↓↓↓ سلسلة معالجات معقدة ↓↓↓ XML → Bytes → Encrypted → Header → Hash ↓↓↓ النتيجة النهائية ↓↓↓ tbl_SecureStorage ┌────────────┬─────────────────────────────────┐ │ StreamName │ DataBlob │ ├────────────┼─────────────────────────────────┤ │ ITEMS │ 57 48 52 53 32 30 32 35 00 ... │ │ │ ← Binary مشفر غير مفهوم! │ └────────────┴─────────────────────────────────┘ ✓ لا يمكن قراءة البيانات بالعين ✓ لا يمكن ربطه من برامج أخرى ✓ لا يظهر في MSysObjects كجدول حقيقي ✓ يحتاج الكود الخاص لفك التشفير 🔍 دعنا نفتح الـ DataBlob ونرى ما بداخله! كود لعرض أول 100 بايت: vba Public Sub ShowBlobContent() Dim db As DAO.Database Dim rs As DAO.Recordset Dim blob() As Byte Dim i As Integer Dim output As String Set db = CurrentDb Set rs = db.OpenRecordset("SELECT DataBlob FROM tbl_SecureStorage WHERE StreamName = 'ITEMS'") If Not rs.EOF Then blob = rs!DataBlob.Value Debug.Print "========== محتوى DataBlob (أول 100 بايت) ==========" Debug.Print "" output = "" For i = 0 To 99 If i <= UBound(blob) Then output = output & Right("00" & Hex(blob(i)), 2) & " " If (i + 1) Mod 16 = 0 Then Debug.Print output output = "" End If End If Next i Debug.Print "" Debug.Print "إجمالي الحجم: " & (UBound(blob) + 1) & " بايت" End If rs.Close End Sub النتيجة ستكون شيء مثل: ========== محتوى DataBlob (أول 100 بايت) ========== 57 48 52 53 32 30 32 35 00 00 02 D4 49 54 45 4D 53 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 B3 F2 A1 9C 8D 7E 3C 2F D8 91 4A 6B 73 29 8F A2 C4 E7 5D 38 9A 2C 7F B1 ... إجمالي الحجم: 1,234 بايت التفسير: 57 48 52 53 32 30 32 35 = "WRHS2025" (Magic Signature) 00 00 02 D4 = الطول (724 بايت) نموذج تخزين آمن جديد لبرنامج مايكروسوفت أكسس: بنية بيانات مشفرة قائمة على التدفق (تصميم 2025) مقدمة يُخزّن مايكروسوفت أكسس البيانات تقليديًا في جداول علائقية، مما يُسهّل عرض المعلومات، والاستعلام عنها، وتصديرها، أو ربطها بتطبيقات خارجية. على الرغم من فائدة هذا في العديد من سيناريوهات الأعمال، إلا أنه يُشكّل أيضًا قيدًا أمنيًا كبيرًا: يمكن لأي شخص لديه نسخة من أكسس فتح الجداول ورؤية جميع البيانات. حتى عند استخدام ACCDE، أو كلمات مرور قواعد البيانات المشفرة، أو الاستعلامات المُبهمة، تظل بيانات الجدول الخام مرئية. لمعالجة هذه المشكلة التصميمية الأساسية، قمتُ ببناء نموذج تخزين مشفر قائم على التدفق، يستبدل الجداول التقليدية بحاوية ثنائية واحدة. هذه ليست طريقة تقليدية لإخفاء الجداول. هذا نقلة نوعية في البنية. 🔐 كيفية تخزين النظام للبيانات (نظرة عامة شاملة) بدلاً من كتابة السجلات في جداول Access العادية، يُجري النظام الخطوات التالية: تُجمع البيانات في الذاكرة باستخدام مجموعة سجلات ADODB/DAO. تُسلسل مجموعة السجلات إلى XML. يُحوّل XML إلى مصفوفة بايت. تُشفّر مصفوفة البايت (XOR أو AES-256). يُضاف رأس ثنائي مُخصّص: التوقيع (WRHS2025) عدد السجلات اسم التدفق (مثل: ITEMS) طول الحمولة يُنشأ تجزئة بيانات للكشف عن أي تلاعب. يتم تخزين كل شيء داخل جدول واحد: tbl_SecureStorage ------------------------- StreamName (نص) DataBlob (ثنائي طويل) DataHash (نص) RecordCount (طويل) يبدو شكل DataBlob النموذجي كما يلي: 57 48 52 53 32 30 32 35 00 00 02 D4 49 54 45 4D ... WRHS2025 ...... ITEMS ... [البايتات المشفرة] هذه الكتلة الثنائية غير قابلة للقراءة، وغير علائقية، ويستحيل تفسيرها بدون شفرة فك التشفير المدمجة في واجهة ACCDE الأمامية. عند تحميل قاعدة البيانات: قراءة الكتلة ← التحقق من الترويسة ← فك التشفير ← إلغاء تسلسل XML ← التحميل في الذاكرة لا يتم تخزين أي بيانات في الجداول العادية. ⭐ فوائد هذه البنية 1) بيانات غير مرئية لا شيء في قاعدة البيانات قابل للقراءة من قبل البشر. تحتوي الجداول على تدفقات ثنائية مشفرة فقط. 2) انعدام قابلية الربط لا يمكن لـ Excel أو PowerBI أو أي ملف Access آخر أو حتى اتصالات DAO المباشرة "رؤية" أي بيانات ذات معنى. 3) استحالة الاستكشاف عبر MSysObjects الجداول التقليدية غير موجودة؛ يوجد فقط جدول حاوية واحد. 4) فصل واجهة المستخدم عن التخزين تعمل النماذج على مجموعات سجلات في الذاكرة، مما يوفر مرونة عالية. 5) حماية النزاهة يحمل كل تدفق تجزئة للكشف عن التعديلات غير المصرح بها. 6) بنية محمولة ومكتفية ذاتيًا مجموعة البيانات بأكملها عبارة عن كائن مشفر واحد - يسهل نسخه احتياطيًا أو نقله أو التحكم في إصداراته. ❗ الرد على الانتقادات الشائعة فيما يلي الاعتراضات الرئيسية التي أتوقعها من مطوري قواعد البيانات التقليدية، بالإضافة إلى ردود تقنية واضحة. **النقد الأول: "استخدام حقول OLE/المرفقات سيؤدي إلى نمو قاعدة البيانات بسرعة."** الرد: لا يستخدم النظام حقول كائنات OLE أو حقول مرفقات Access. يستخدم: LongBinary (BLOB) هذا حقل ثنائي خام يُقارن بـ: SQL Server VARBINARY(MAX) MySQL LONGBLOB PostgreSQL BYTEA لا يُعاني حقل ثنائي واحد معتم من نفس سلوك الانتفاخ الذي يُعاني منه تضمين OLE. يمكن أيضًا تطبيق الضغط قبل التشفير، مما يُجنّب تجزئة التدفق. يظل نمو قاعدة البيانات متوقعًا ومستقرًا. **النقد الثاني: "هذا يُلغي البنية العلائقية والقيود والتطبيع."** الرد: صحيح - وهذا مقصود. البنية العلائقية ممتازة عندما: تحتاج البيانات إلى استعلام، تصل أنظمة متعددة إلى قاعدة البيانات، يمنع التطبيع التكرار. ومع ذلك، بالنسبة للأرشفة المشفرة، أو أنظمة الجرد غير المتصلة بالإنترنت، أو التطبيقات المقاومة للتلاعب، فإن النموذج العلائقي يكشف الكثير: يمكن للمستخدمين فتح الجداول، التحايل على منطق التحقق، الربط من قاعدة بيانات Access أخرى، أو تعديل القيم الخام مباشرةً. تتخذ هذه البنية نهجًا معاكسًا: يتم فرض سلامة البيانات من خلال كود التسلسل المُتحكم به، وليس من خلال قيود جدول Access. يحدث التحقق: داخل منطق التطبيق، أثناء التسلسل/إلغاء التسلسل، ومن خلال التحقق من التجزئة. يعكس هذا البنية المستخدمة في: قواعد بيانات SQLite المشفرة، تخزين تطبيقات الأجهزة المحمولة (Realm، Room، CoreData)، التنسيقات الثنائية المخصصة في محركات الألعاب. في العديد من الأنظمة الحديثة، تُعدّ سلامة التطبيقات المُدارة هي المعيار - وليس سلامة الجداول المُدارة. 📌 الخلاصة هذا النموذج ليس مُصممًا ليحل محل قواعد البيانات العلائقية للتحليلات أو العمليات كثيفة الاستخدام متعددة المستخدمين. مُصمم لـ: تطبيقات Access الآمنة، أدوات المستخدم الفردي أو الفرق الصغيرة، عمليات النشر التي لا يجب أن يرى فيها المستخدم النهائي البيانات الخام أو يُعالجها، البيئات التي يجب أن يتصرف فيها ACCDE كتطبيق مُغلق. إذا كان الهدف هو عتامة البيانات المطلقة، فلا يُمكن لجداول Access التقليدية توفيرها. يمكن لبنية مخصصة مُشفرة قائمة على التدفق أن تُحقق ذلك. savedatanewview.accdb
Bshar قام بنشر السبت at 17:51 قام بنشر السبت at 17:51 السلام عليكم ,, ماشاء الله فكره جميله , وجميع الخبراء اجتمعو للحل السريع , واستفدت من افكاركم بارك الله بكم جميعا ,, لكن عندي سؤال للخبير في فنون الاكسس ,والصديق @Foksh كيف قمت بعمل اخفاء وحماية السجلات . 1
Foksh قام بنشر منذ 8 دقائق الكاتب قام بنشر منذ 8 دقائق في 29/11/2025 at 20:51, Bshar said: السلام عليكم ,, وعليكم السلام ورحمة الله وبركاته .. صديقي بشار ، سأقوم بإرفاق الدالة التي استعملتها هنا إن شاء الله ، حال توفري أمام كمبيوتري
الردود الموصى بها
انشئ حساب جديد او قم بتسجيل دخولك لتتمكن من اضافه تعليق جديد
يجب ان تكون عضوا لدينا لتتمكن من التعليق
انشئ حساب جديد
سجل حسابك الجديد لدينا في الموقع بمنتهي السهوله .
سجل حساب جديدتسجيل دخول
هل تمتلك حساب بالفعل ؟ سجل دخولك من هنا.
سجل دخولك الان