keko
19/12/2003, 10:29
كيف نتعامل مع كلمة السر في ملفات اكسيس
كما نعرف، بالنسبة ل ADO يجب تحديد صيغة التوصيل Connection String التي تتضمّن خصائصا مثل وسيط محرك قواعد البيانات و اسم قاعدة البيانات نفسها ثم أية خصائص أخرى تكون لازمة للربط مع قاعدة البيانات و فتحها مثل كلمة السرّ إذا كانت مطلوبة.
اذا افترضنا ان لدينا مكوّن ADOConnection1 ، فاننا عادة ما نأتي الى خاصّية ConnectionString لبناء جملة أو صيغة التوصيل من خلال نافذة Data Link Propertis .
بالنسبة لقاعدة بيانات اكسيس عادة ما يكون الوسيط أو المقدّم provider لمحرك قاعدة البيانات هو: Microsoft.Jet.OLEDB.4.0 Provider، ثم نقوم بتحديد مكان و اسم قاعدة البيانات الذي سنفترض انها : C:\Db.mdb كما هو موضح في الشكل التالي.
نفترض ان اسم المستخدم هو الاسم الافتراضي الذي يعطى عند تكوين قاعدة بيانات اكسيس ، و الذي يظهر آليا في النافذة.
الآن نأتي لكلمة السرّ. لو كانت قاعدة البيانات خالية من كلمة سرّ فان صيغة التوصيل تكون قد اكتملت عند هذا الحدّ ، و يمكن التأكّد من ذلك من خلال الضغط على زرّ اختبار التوصيل Test Connection. أما لو كان لقاعدة البيانات كلمة سرّ فان الاختبار سيفشل معلنا عن عدم صلاحية كلمة السرّ.
لتحديد كلمة السرّ في صيغة التوصيل - وعكس ما هو متوقع - لن نحددّها في خانة Password في نفس الصفحة، بل نتركها كما هي و ننتقل الى صفحة All و التي بها كافة الخصائص التي يمكن توصيفها لصيغة التوصيل.
في هذه الصفحة سنجد الخاصية: Jet OLEDB:Database Password ؛ و فيها يتم تحديد كلمة السرّ. نضع المؤشر على هذه الخاصّية كما في الشكل أعلاه ، ثم نضغط على زرّ كتابة القيمة Edit Value . هنا ستظهر نافذة كما في الشكل التالي لكتابة قيمة الخاصية أو كلمة السر ، و لتكن abc .
بعد تحديد كلمة السرّ، يمكننا العودة الى صفحة Connection و اعادة اختبار التوصيل. ثم الموافقة على صيغة التوصيل التي تمّ بناؤها و العودة الى نافذة الخصائص في دلفي. سنلاحظ أن جملة التوصيل تم وضعها أمام خاصية ConnectionString .
التعامل مع كلمة السر داخل التوليف:
أحيانا قد تحتاج الى تحديد جملة التوصيل بكاملها أو احدى أو بعض خصائصها أثناء تشفيل البرنامج و ليس عند التصميم، كأن تريد أن تلتقط مسار و اسم قاعدة البيانات من ملف خارجي، أو أن تتحصلّ على اسم المستخدم أو كلمة السر من المستخدم.
لو اقتربنا من جملة التوصيل Connection String في النافذة السابقة (تأكد من أن خاصية Connected قيمتها سالبة) و شاهدناها كاملة ستكون غالبا بالصيغة التالية:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Db.mdb;Persist Security Info=False;Jet OLEDB:Database Password= abc
و إذا قسّمناها حسب أجزائها ستكون كما يلي:
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:\Db.mdb;
Persist Security Info=False;
Jet OLEDB:Database Password= abc
لذلك يمكننا تقديم جملة التوصيل داخل التوليف كما يلي:
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOConnection1.Connected := false;
ADOConnection1.ConnectionString :=
'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=C:\Db.mdb;' +
'Jet OLEDB:Database Password=abc';
ADOConnection1.Connected := true;
end;
أو ربّما تقوم بتحديد صيغة التوصيل في زمن التصميم دون تحديد كلمة السر، و يتم تقديم كلمة السر عند محاولة فتح التوصيل أثناء التشغيل، بحيث يتم تحديد خاصية كلمة السرّ فقط كالتالي:
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOConnection1.Connected := false;
ADOConnection1.Properties[
'Jet OLEDB:Database Password'].Value := 'abc';
ADOConnection1.Connected := true;
end;
مكان آخر أكثر مركزية يمكن فيه تحديد جملة التوصيل أو إحدى خصائص التوصيل، و هو حدث BeforeConnect التابع لمكون ADOConnection. هذا الحدث يطرأ مباشرة قبل قيام المكون بفتح التوصيل،
procedure TForm1.ADOConnection1BeforeConnect(Sender: TObject);
begin
ADOConnection1.Properties[
'Jet OLEDB:Database Password'].Value := 'abc';
end;
نعيد التذكير بأنه يمكن تحديد أية خاصية بصورة منفردة من خلال خاصية Properties التابعة لمكوّن ADOConnection، مثلا يمكن تحديد خاصية مورد البيانات Data Source كالتالي:
ADOConnection1.Properties['Data Source'].Value := 'C:\Db.mdb';
كلمة أخيرة:
تخصيص كلمة سرّ لقاعدة البيانات يراد به قصر فتح قاعدة البيانات و الاطلاع على محتوياتها على من هم مخوّل لهم بذلك. و برغم أن حماية كلمة السرّ غير مضمونة أمام محاولات المتطفلّين لكشفها خاصة في ملفات اكسيس؛ فإن هذا لا يمنعنا من جعل هذا الأمر أكثر صعوبة. لذلك فان الأمر يتطلب مزيدا من الحماية على مستوى التوليف نفسه. لماذا؟ لأنك لو قمت بفتح نسخة الملف التنفيذي (EXE) لبرنامجك بواسطة أي محررّ نصوص و قمت بالبحث فيه عن كلمة السرّ ستجدها واضحة و يمكن لأي شخص بقليل من الاحتراف أن يجدها، لأن التوليف المحوّل من قبل دلفي يبقي على الجمل النصيّة كما هي، حتى لو قمت بتفكيكها إلى أحرفها أو خصّصتها في متغيّر في اجرائية غير الاجرائية التي يتم فيها التعامل مع جملة التوصيل.
لذلك يستحسن دائما ترميز كلمة السرّ و الاحتفاظ بها داخل التوليف بصورة مشفّرة، و أن تقوم بفتح شفرتها عند القيام بفتح قاعدة البيانات.
كما نعرف، بالنسبة ل ADO يجب تحديد صيغة التوصيل Connection String التي تتضمّن خصائصا مثل وسيط محرك قواعد البيانات و اسم قاعدة البيانات نفسها ثم أية خصائص أخرى تكون لازمة للربط مع قاعدة البيانات و فتحها مثل كلمة السرّ إذا كانت مطلوبة.
اذا افترضنا ان لدينا مكوّن ADOConnection1 ، فاننا عادة ما نأتي الى خاصّية ConnectionString لبناء جملة أو صيغة التوصيل من خلال نافذة Data Link Propertis .
بالنسبة لقاعدة بيانات اكسيس عادة ما يكون الوسيط أو المقدّم provider لمحرك قاعدة البيانات هو: Microsoft.Jet.OLEDB.4.0 Provider، ثم نقوم بتحديد مكان و اسم قاعدة البيانات الذي سنفترض انها : C:\Db.mdb كما هو موضح في الشكل التالي.
نفترض ان اسم المستخدم هو الاسم الافتراضي الذي يعطى عند تكوين قاعدة بيانات اكسيس ، و الذي يظهر آليا في النافذة.
الآن نأتي لكلمة السرّ. لو كانت قاعدة البيانات خالية من كلمة سرّ فان صيغة التوصيل تكون قد اكتملت عند هذا الحدّ ، و يمكن التأكّد من ذلك من خلال الضغط على زرّ اختبار التوصيل Test Connection. أما لو كان لقاعدة البيانات كلمة سرّ فان الاختبار سيفشل معلنا عن عدم صلاحية كلمة السرّ.
لتحديد كلمة السرّ في صيغة التوصيل - وعكس ما هو متوقع - لن نحددّها في خانة Password في نفس الصفحة، بل نتركها كما هي و ننتقل الى صفحة All و التي بها كافة الخصائص التي يمكن توصيفها لصيغة التوصيل.
في هذه الصفحة سنجد الخاصية: Jet OLEDB:Database Password ؛ و فيها يتم تحديد كلمة السرّ. نضع المؤشر على هذه الخاصّية كما في الشكل أعلاه ، ثم نضغط على زرّ كتابة القيمة Edit Value . هنا ستظهر نافذة كما في الشكل التالي لكتابة قيمة الخاصية أو كلمة السر ، و لتكن abc .
بعد تحديد كلمة السرّ، يمكننا العودة الى صفحة Connection و اعادة اختبار التوصيل. ثم الموافقة على صيغة التوصيل التي تمّ بناؤها و العودة الى نافذة الخصائص في دلفي. سنلاحظ أن جملة التوصيل تم وضعها أمام خاصية ConnectionString .
التعامل مع كلمة السر داخل التوليف:
أحيانا قد تحتاج الى تحديد جملة التوصيل بكاملها أو احدى أو بعض خصائصها أثناء تشفيل البرنامج و ليس عند التصميم، كأن تريد أن تلتقط مسار و اسم قاعدة البيانات من ملف خارجي، أو أن تتحصلّ على اسم المستخدم أو كلمة السر من المستخدم.
لو اقتربنا من جملة التوصيل Connection String في النافذة السابقة (تأكد من أن خاصية Connected قيمتها سالبة) و شاهدناها كاملة ستكون غالبا بالصيغة التالية:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Db.mdb;Persist Security Info=False;Jet OLEDB:Database Password= abc
و إذا قسّمناها حسب أجزائها ستكون كما يلي:
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:\Db.mdb;
Persist Security Info=False;
Jet OLEDB:Database Password= abc
لذلك يمكننا تقديم جملة التوصيل داخل التوليف كما يلي:
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOConnection1.Connected := false;
ADOConnection1.ConnectionString :=
'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=C:\Db.mdb;' +
'Jet OLEDB:Database Password=abc';
ADOConnection1.Connected := true;
end;
أو ربّما تقوم بتحديد صيغة التوصيل في زمن التصميم دون تحديد كلمة السر، و يتم تقديم كلمة السر عند محاولة فتح التوصيل أثناء التشغيل، بحيث يتم تحديد خاصية كلمة السرّ فقط كالتالي:
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOConnection1.Connected := false;
ADOConnection1.Properties[
'Jet OLEDB:Database Password'].Value := 'abc';
ADOConnection1.Connected := true;
end;
مكان آخر أكثر مركزية يمكن فيه تحديد جملة التوصيل أو إحدى خصائص التوصيل، و هو حدث BeforeConnect التابع لمكون ADOConnection. هذا الحدث يطرأ مباشرة قبل قيام المكون بفتح التوصيل،
procedure TForm1.ADOConnection1BeforeConnect(Sender: TObject);
begin
ADOConnection1.Properties[
'Jet OLEDB:Database Password'].Value := 'abc';
end;
نعيد التذكير بأنه يمكن تحديد أية خاصية بصورة منفردة من خلال خاصية Properties التابعة لمكوّن ADOConnection، مثلا يمكن تحديد خاصية مورد البيانات Data Source كالتالي:
ADOConnection1.Properties['Data Source'].Value := 'C:\Db.mdb';
كلمة أخيرة:
تخصيص كلمة سرّ لقاعدة البيانات يراد به قصر فتح قاعدة البيانات و الاطلاع على محتوياتها على من هم مخوّل لهم بذلك. و برغم أن حماية كلمة السرّ غير مضمونة أمام محاولات المتطفلّين لكشفها خاصة في ملفات اكسيس؛ فإن هذا لا يمنعنا من جعل هذا الأمر أكثر صعوبة. لذلك فان الأمر يتطلب مزيدا من الحماية على مستوى التوليف نفسه. لماذا؟ لأنك لو قمت بفتح نسخة الملف التنفيذي (EXE) لبرنامجك بواسطة أي محررّ نصوص و قمت بالبحث فيه عن كلمة السرّ ستجدها واضحة و يمكن لأي شخص بقليل من الاحتراف أن يجدها، لأن التوليف المحوّل من قبل دلفي يبقي على الجمل النصيّة كما هي، حتى لو قمت بتفكيكها إلى أحرفها أو خصّصتها في متغيّر في اجرائية غير الاجرائية التي يتم فيها التعامل مع جملة التوصيل.
لذلك يستحسن دائما ترميز كلمة السرّ و الاحتفاظ بها داخل التوليف بصورة مشفّرة، و أن تقوم بفتح شفرتها عند القيام بفتح قاعدة البيانات.