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

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

قام بنشر

S1.png.b94d949126a2c6e59bab9ec56849dab2.png

أخواني وأساتذتي ومعلمينا ( دون استثناء )

أدعوكم لتجربة قيد الإختبار ، بحيث يوجد في قاعدة البيانات الحالية المرفقة جدول باسم Table1 . يحتوي سجلات محمية . وأريد تجربة إن كان بالإمكان استيراد هذه السجلات أو معرفة القيم التي فيها ، و بأي وسيلة أو طريقة تخطر على بال من يحاول التجربة بالتعرف على السجلات .

 

الهدف حماية السجلات من العبث ومنع استيرادها بتاتاً .

 

05.png

1. القاعدة غير محمية بكلمة مرور أو حتى أنها غير محفوظة بصيغة Accde ...

2. ما يهمني هو الطريقة التي تم بها الكشف عن الجدول . وليس النتيجة ذاتها :cool: 

Hide TBL.accdb

  • Like 1
قام بنشر
3 ساعات مضت, Foksh said:

S1.png.b94d949126a2c6e59bab9ec56849dab2.png

أخواني وأساتذتي ومعلمينا ( دون استثناء )

أدعوكم لتجربة قيد الإختبار ، بحيث يوجد في قاعدة البيانات الحالية المرفقة جدول باسم Table1 . يحتوي سجلات محمية . وأريد تجربة إن كان بالإمكان استيراد هذه السجلات أو معرفة القيم التي فيها ، و بأي وسيلة أو طريقة تخطر على بال من يحاول التجربة بالتعرف على السجلات .

 

الهدف حماية السجلات من العبث ومنع استيرادها بتاتاً .

 

05.png

القاعدة غير محمية بكلمة مرور أو حتى أنها غير محفوظة بصيغة Accde ...

 

Hide TBL.accdb 416 kB · 2 downloads

تقصد ان كنت اقدر اعرف البيانات ال فى الجدول المخفي 

image.png.c50002db4e904c694f0a427e30263284.png
زذ كده ؟

  • Like 1
قام بنشر

السادة الأفاضل الكرام ،

الأساتذة ( @kanory ، @عمر ضاحى ، @Barna ) الذين ساهموا بمشاركتهم بالتجربة والإفادة بالنتيجة ..

 

بدايةً شكراً لكم لمشاركتكم :wub: ، وأعلم أنكم بخبرتكم قادرون على تحقيق المطلوب بشتى السُبل والطـُرق . كانت البداية بأن الملف بصيغة ACCDB ؛ أي أنني تركت لمن يرغب بالمشاركة - باب التجربة مفتوحاً - بأكواد أو استعلامات أو أي طريقة يراها مناسبة لتحقيق المطلوب .

💥 ولكن كمطور فطبعاً لن يتم تسليم أي مشروع لأي عميل بهذا الشكل - الغير محمي - وبالتالي لا بد من حماية وتشفير الملف وتقفيله بعد إتمام المشروع بصيغة ACCDE مع باقي الإحتياط التي يتخذها المصمم والمطور والمبرمج ، صحيح ؟

وهنا جاءت الفكرة التي رغبت بتجربتها وتنفيذها ، بحيث سيكون التنفيذ والإختبار على ملف مقفل فقط بحفظه بصيغة ACCDE لم أضع كلمة مرور - له - على محرر الأكواد .

لذا أرجو منكم الإفادة بالتجربة على نفس الملف ولكن بصيغة ACCDE . مع العلم أن المكون هو جدول واحد و سجل واحد فقط . ولن يهمني كثيراً اسم الجدول بقدر ما يهمني السجل الذي يحتويه الجدول كبيانات :biggrin:

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

 

 

HideTBL V1-32.zip HideTBL V1-64.zip

  • Like 1
قام بنشر
3 ساعات مضت, ابوخليل said:

لا ادري كيف ظهر معي 

 

هو المطلوب بعينه ، ولكن إن لم يكن معلمي يدري ، فمن يدري :yes: !!!

  • Thanks 1
قام بنشر

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

 

ولو اني مشغول لقمة رأسي ومسافر غدا ان شاء الله ، ولكني اردت المشاركة تفاعلا مع اخي ابوخليل 🙂

 

image.png.95913053ea2a54faa2500af4aedbf37f.png

.

وطريقتي:

 

بالاشارة الى موضوعي ، الجزء الاول:

 

واليك الجزء الثاني من الموضوع:

1. عملت ملف اكسس فارغ، وعملت فيه الاستعلام التالي لقراءة جدول MSysObjects برنامجك ، والذي يحتوي على جميع جداول البرنامج :

SELECT MSysObjects.*
FROM [D:\temp\1642.HideTBL V1-32.accde].MSysObjects
ORDER BY MSysObjects.DateUpdate DESC;

.

والسبب في الفرز التنازلي ، هو لحقل تاريخ تحديث الجداول ، يعني اخر جداول عملت عليها التحديث (فقط علشان سهولة الوصول للجدول المطلوب).

وحتى لو ما عملت الفرز ، فكان بإمكاني عمل كود لفحص الجداول فردا فردا 🙂

 

وحصلت على الجداول التالية:

image.png.0a5fa85c8a22e10d609f87ab8705f520.png

.

ومنها جربت الجدول AccessTbl :

SELECT AccessTbl.*
FROM [D:\temp\1642.HideTBL V1-32.accde].AccessTbl

.

وحصلت على النتيجة 🙂

 

جعفر

  • Like 2
قام بنشر
7 ساعات مضت, jjafferr said:

وحصلت على النتيجة 🙂

 

ما شاء الله عليك .. أولاً نشكر معلمنا أبو خليل لمشاركته وجعله الحافز الذي أنرت به موضوعي المتواضع :wub: ..

شرح جميل جداً وطريقة مبتكرة أيضاً وجميلة ..

سلمت تلك الأنامل والأفكار النيراتِ :fff:

  • Thanks 1
قام بنشر

كلنا نعلم ان ليس هناك حماية مطلقة

اقتنعت بهذه المقولة متأخرا

كنت الجأ سابقا في حماية برامجي الى طرق قراقوشية لا تخطر على البال .. غرس ملفات في النظام وبيانات خاصة في الريجستري .. وكأني احمي سر القنبلة الكونبة :cool2:

لكني الآن تركت كل ذلك وجعلت مفتاح البرنامج متاحا في ملف تكست ظاهر بجانب قاعدة البيانات .. ملكا لصاحبه ..

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

 

  • Like 1
  • Haha 1
قام بنشر
9 دقائق مضت, ابوخليل said:

كلنا نعلم ان ليس هناك حماية مطلقة

اقتنعت بهذه المقولة متأخرا

كنت الجأ سابقا في حماية برامجي الى طرق قراقوشية لا تخطر على البال .. غرس ملفات في النظام وبيانات خاصة في الريجستري .. وكأني احمي سر القنبلة الكونبة :cool2:

لكني الآن تركت كل ذلك وجعلت مفتاح البرنامج متاحا في ملف تكست ظاهر بجانب قاعدة البيانات .. ملكا لصاحبه ..

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

 

أعلم يقيناً ذلك وبقناعة مطلقة ، إلا أنني ..

في أحد المشاريع لبرنامج خاص بمكتب تسهيلات الفيزا لأحد الأصدقاء . كان لي توجه بحيث !!!!!

1. عند تشغيل قاعدة البيانات يتم الإتصال بقاعدة البيانات الخلفية الأساسية . واستخراج قاعدة بيانات خلفية أخرى بنفس الجداول مخفية في مسار داخل الويندوز ( لعدم أهميته لأنه خالي من البيانات )

2. عند الإغلاق يتم إعادة ربط قاعدة البيانات قبل اغلاقها بقاعدة الجداول الخلفية الوهمية ( التي لا تحتوي على بيانات ) .

طبعاً الثغرة واضحة جداً لمن يتمعن إلا أنها كانت متينة عند عدم عمل قاعدة البيانات بأنه لن يجد أي شخص بيانات داخل قاعدة البيانات الخلفية .

قام بنشر (معدل)

انا طريقتي تختلف عن الاخوان حيث قمت بإظهار الجدول نفسه كما بالصورة

Untitled.jpg.7937730c93224d9b0eac30ea7958027d.jpg

وللقيام بذلك قم بتنفيذ الخطوات كالتالي

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 لتظهر لنا  النتيجة كما بالصورة

11.jpg.f7cfd0a81a515e80e5ca5b1c1e767392.jpg

مايهمنا هنا هي قيمة العمود الأول 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 وفقاً لإصدار أوفيس لديك) لتجد أن الجدول قد ظهر في جزء التنقل

تحياتي

 

 

تم تعديل بواسطه منتصر الانسي
  • Like 1
قام بنشر

جميل جداً هذا التوضيح والطريقة الجميلة أيضاً .. 

16 دقائق مضت, منتصر الانسي said:

 من خلال هذا الاستعلام سنتعرف على أي جدول Type=1 ولايبدأ بالأحرف MSys لتظهر لنا  النتيجة كما بالصورة

 

التعرف على أنه إذا كانت Type = 1 وبالتالي النوع 1 = جدول هي بحد ذاتها أيضاً فكرة جميلة . 

 

اقتباس

مايهمنا هنا هي قيمة العمود الأول Flags بعد ذلك قم بإغلاق التطبيق بدون حفظ اي شيء

وبما أن قيمة الـتعليمة Flags = -2147483645 وهي قيمة ثابتة في اكسيس لجميع إصدارات أوفيس ، وهي للتوضيح الواجب أنه ليس لأوفيس علاقة بفرضها بهذه القيمة . بل يفرضها نظام التشغيل نفسه ( Windows ) على حد علمي .

 

أما بخصوص السطر والفكرة التالية :-

33 دقائق مضت, منتصر الانسي said:
If tdf.Attributes = -2147483645 Then tdf.Attributes = 0	

فهي بحد ذاتها جريئة وإلتفاته فتحت لي أفكاراً جديدة في هذا الخصوص .

 

:wub: فشكراً لك ولكل من ساهم بإثراء الموضوع بمشاركته الجميلة والقيمة كجوهره :wub:

  • Like 1
قام بنشر
في 20‏/11‏/2025 at 19:50, منتصر الانسي said:

إفتح الملف وقم بإنشاء الاستعلام التالي

وجب التنبيه إلى أن هذه الخطوة مشروطة بأن يكون هناك إمكانية بأن نضيف الاستعلام داخل نفس القاعدة المستهدفة .

لكن ماذا لو كانت القاعدة غير متاحة بالإضافة 😉 ؟؟؟

قام بنشر

اعجني الموضوع
من اول انشغالي بالاكسيس تيقنت ان الاكسيس من اضغف الحمايات
لكني قكرة بان اسال الذكاء الصناعي
سالت CHATGPT عن فكرة مجنونة لم يفكر بها احد لحماية الجداول
 ادعوا اخواني لتجربة الفكر المقترحة وانا ساجربها معكم مع توفر الوقت لدي
سارفق الاجابة والسؤال الذي سالته
انقر هنا
 

  • Like 2
قام بنشر
56 دقائق مضت, محب العقيدة said:

اعجني الموضوع
من اول انشغالي بالاكسيس تيقنت ان الاكسيس من اضغف الحمايات
لكني قكرة بان اسال الذكاء الصناعي
سالت CHATGPT عن فكرة مجنونة لم يفكر بها احد لحماية الجداول
 ادعوا اخواني لتجربة الفكر المقترحة وانا ساجربها معكم مع توفر الوقت لدي
سارفق الاجابة والسؤال الذي سالته
انقر هنا
 

عجيب هذا الخادم العفريت  😳

قام بنشر
3 ساعات مضت, محب العقيدة said:

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

من واقع التجربة ، ودون أي تردد وبلا أي شك ، فأنا ( أعوذ بالله من كلمة أنا ومن شر نفسي ) والكثيرين نتفق مؤيدين لكلام أساتذتنا ومعلمينا ، وحتى تعليمات مايكروسوفت ، أن آكسيس غير قادر على حماية البيانات وتأمينها .
ومن خلال التجارب المريرة التي مررت بها وفكرت بها ، فإن الحل والسبيل الوحيد لتأمين البيانات سيكون خارج قاعدة البيانات نفسها .

( أو بحماية قاعدة البيانات الخلفية بكلمة مرور محكمة ) - ومع ذلك فالهندسة العكسية قادرة على الوصول إلى كلمة المرور - وبالتالي النجاح تشوبه بعض الشوائب . ولذا ذكرت في جملتي التالية :-

في 20‏/11‏/2025 at 19:33, Foksh said:

2. عند الإغلاق يتم إعادة ربط قاعدة البيانات قبل اغلاقها بقاعدة الجداول الخلفية الوهمية ( التي لا تحتوي على بيانات ) .

 

 

أيضاً كانت لي تجربة بسيطة طبقتها في لعبة كانسة الألغام 2025 . حيث أنني لم اعتمد على أي جداول لتخزين أسماء اللاعبين والمستويات التي وصل لها كل لاعب لإستردادها متى شاء . ومع ذلك - ودون أي جداول - يستطيع اللاعب الإستمرار من المستوى والمرحلة التي وصل لها مع الإحتفاظ بكامل ميزات اللعبة من مساعدات وحمايات اللعبة ... إلخ ، حتى بعد اعادة تشغيل الويندوز . فالفكرة لا تعتمد على متغيرات طويلة المدى :biggrin: .

قام بنشر
19 ساعات مضت, Foksh said:

لكن ماذا لو كانت القاعدة غير متاحة بالإضافة 😉 ؟؟؟

ماذا تقصد بغير متاحة ؟

- إن كنت تقصد بإنها مؤمنة بكلمة سر فأنت تعلم بأنه يمكن كسر هذا التأمين بسهولة

- وإن كنت تقصد تأمين قاعدة البيانات عن طريق الكود بحيث أننا لن نستطيع فتحها عن طريق مفتاح Shift فيمكننا تنفيذ الاستعلام من أي قاعدة بيانات أخرى

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

فهل فكرتك هي ضمن هذه الحالات أم أن لديك فكرة أخرى؟

قام بنشر
7 دقائق مضت, منتصر الانسي said:

ماذا تقصد بغير متاحة ؟

 

أنك غير قادر على إضافة الاستعلام لقاعدة البيانات كونها محمية بمفتاح الشيفت + ACCDE .

8 دقائق مضت, منتصر الانسي said:

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

 

الإخفاء ليس فكرة واردة لعدم نجاحها ، فبطبيعة الحالي يمكن الحصول على مسار قاعدة البيانات الخلفية أينما كانت من خلال قاعدة بيانات أخرى .

 

لكني كنت قد علّقت على موضع الإستعلام ان كانت القاعدة Hide Access + منع مفتاح الشيفت .

قام بنشر
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 مباشرة وإلا قم بتعديل المسار

تحياتي

  • Like 1
قام بنشر

قمت بتجربة الحل من الذكاء الصناعي
ووصلت الى مرحلة

عند فتح

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

قام بنشر

اخي العزيز @محب العقيدة من خلال إطلاعي على ماجاء في المحادثة فإن الطريقة التي يعتمدها هي 

اقتباس

بينما البيانات الحقيقية موجودة داخل 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 ""

وقمت بتعديل الكميات في إجراءات الاضافة والتنزيل (او حتى بدون تعديلات) ستظهر لي الرسالة التالية

Untitled2.jpg.d5af8906b65855fe08facad60fc0c78b.jpg

وهذا معناه أنه قد نسي أنه تم حفظ الصنفين

هذه هي ملاحظاتي السريعة على ماجاء في مشاركتك ان شاء الله تكون ملاحظات مفيدة

تحياتي

 

قام بنشر

اخي منتصر 
يبدو ان الفكرة لم تصلك بعد 
التخزين سيكون( 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

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

يجب ان تكون عضوا لدينا لتتمكن من التعليق

انشئ حساب جديد

سجل حسابك الجديد لدينا في الموقع بمنتهي السهوله .

سجل حساب جديد

تسجيل دخول

هل تمتلك حساب بالفعل ؟ سجل دخولك من هنا.

سجل دخولك الان
×
×
  • اضف...

Important Information