بسم الله الرحمن الرحيم ...
من الأمور المهمة في لغة ASP.NET 2.0 ملف الـ Web.Config و الذي يقوم بتخزين التعريفات المهمة لتطبيق الويب.
و من أشهر و أهم المعلومات التي تخزن فيه هي الـ ConnectionString و التي يخزن بداخلها اسم المستخدم و كلمة مرور قواعد البيانات و عنوان سيفر قاعدة البيانات. كما أنه من الأمور المهمة التي تخزن في ملف الـ Web.Config معلومات الـ SMTP Server.
و بالرغم من أن الـ ASP.NET يتكفل بحماية ملف الـ Web.Config و لكن ماذا لو نسينا أن تغلق وصول الـ anonymous للـ FTP مثلاً؟!! سوف يصل بشكل مباشر إلى الـ Web.Config و يقرأه عن طريق الـ Notepad و سوف يجد جميع معلوماتنا الفيمة بداخله.
لذلك كان من أفضل التطبيقات في حماية ملف Web.Config هو تشفير الأجزاء المهمه.
سوف ننشئ الـ Methods التالية لتشفير و فك تشفير هذه الاجزاء بلغة السي#.
private void ProtectSection(string sectionName, string provider)
{
Configuration config =
WebConfigurationManager.
OpenWebConfiguration(Request.ApplicationPath);
ConfigurationSection section =
config.GetSection(sectionName);
if (section != null &&
!section.SectionInformation.IsProtected)
{
section.SectionInformation.ProtectSection(provider);
config.Save();
}
}
private void UnProtectSection(string sectionName)
{
Configuration config =
WebConfigurationManager.
OpenWebConfiguration(Request.ApplicationPath);
ConfigurationSection section =
config.GetSection(sectionName);
if (section != null &&
section.SectionInformation.IsProtected)
{
section.SectionInformation.UnprotectSection();
config.Save();
}
}
في الدالة ProtectSection تأخذ هذه الدالة قيمتين هي sectionName و provider.
الـ sectionName تأخذ القسم المراد تشفيره مثلاً "appSettings" و المتغير الثاني provider يأخذ طريقة التشفير و يوجد عندنا طريقتين هما:
فالنوع الأول يقوم بالتشفير بناءً على مفتاح الجهازmachine key و لذلك عند نقل الكود إلى جهاز آخر لن يصبح التشفير فعال.
و النوع الآخر يستخدم مفتاح الـ RSA و هنا سوف استخدم النوع الأول و لاستخدام الـ RSA يمكنك البحث في Google.
الآن لنضع 2 Buttons في صفحة الـ ASP.NET. و نكتب بداخلها الكود التالي للتشفير:
ProtectSection("appSettings","DataProtectionConfigurationProvider");
و لفك التشفير:
UnProtectSection("appSettings");
فلو فرضنا انه يوجد لدينا هذا الجزء في ملف الـ Web.Config:
و الذي يحتوي على سم المستخدم و كلمة المرور.
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="userName" value="myUser" />
<add key="password" value="myPass" />
</appSettings>
<system.web>
و الآن و بعد التشفير سوف يكون شكل الملف:
<?xml version="1.0"?>
<configuration>
<appSettings configProtectionProvider="DataProtectionConfigurationProvider">
<EncryptedData>
<CipherData>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAeqpnrspy5EWNYcNck7YWEgQAAAACAAAAAAADZgAAqAAAABAAAAA12J8TxeAXP5oTR3FRwzTUAAAAAASAAACgAAAAEAAAAD35nzw5BzWwX4kb/ba0k+/oAAAAWrmf/KLUkGMXbc24Un8GXU/q3BLDnuzemCXU2ooqlXVVRCJdOSxU/A34EajaAmPZH/hJY1lDHoqSL2yv69R7Ld2ebIMyA94+gpGJ+5BttQhaUrD8yi19D7j29JOtX1gZ+6dkLVLANI4zU4i46orH7Syy+DOdwaeJ5ZNrj60hu7bSzwMgq5QEKXJ0G/D8XwJY7LD2pdpzls+P7fheqYH5OXFevJKoJWUco+isMdrppE5zPnIF9zD2pmLFU6bUH0maBDjbBnP3QCu+9R3SlQ5ELVQAKx+ThCj3xBvh5P1cUBMaaFZtEaX3EBQAAABl+Fga/ikPCJAGBh1NQNICVKh3Yg==</CipherValue>
</CipherData>
</EncryptedData>
</appSettings>
<system.web>
و لابد من العلم أن الأجزاء التالية لا يمكن تشفيرها في الـ Web.Config:
processModel
runtime
mscorlib
startup
system.runtime.remoting
configProtectedData
satelliteassemblies
cryptographySettings
cryptoNameMapping
cryptoClasses
طبعاً الجزء الأجمل أنه عندما تريد قراءة قيمة معينة في ملف الـ Web.Config مثلاً الـ connectionString لن تقوم بفك التشفير و لكن الـ ASP.NET سوف يقوم به نيابة عنك و لن تضطر لتغيير الكود.
أما لكيفية تشفير أجزاء ملف الـ Web.Config عن طريق الـ .NET Command Line يمكنك الرجوع إلى هذا الرابط في MSDN.
مع تمنايتي لكم بالتوفيق...
طلال السبيعي.