نظرًا لاحتياجات العمل اليومي، استخدمت الوحدة Serv-U لإعداد خادم FTP، ومع ذلك، بعد توليها المهمة، تم اكتشاف أن هناك مشكلة خطيرة للغاية كان خادم FTP مفتوحًا للجمهور والعديد من المستخدمين لم يتم تعيين كلمات المرور. إذا كان تعيين كلمة مرور إلزاميًا للجميع ويجب تعيينها على الخادم، ألا يعني ذلك أنه يجب على الجميع إخبار المسؤول بكلمة المرور الخاصة بهم، ففي النهاية، اعتاد الكثير من الأشخاص على استخدام نفس كلمة المرور. ما يجب القيام به؟ أفضل طريقة بالطبع هي توفير صفحة ويب لتوفير وظيفة تعديل كلمة المرور.
ما عليك سوى المتابعة والتحقق من ذلك عبر الإنترنت، إحدى الطرق هي استخدام وظيفة ODBC التي توفرها Serv-U نفسها، واستخدام قاعدة البيانات لتخزين كلمات المرور، وتشغيل قاعدة البيانات مباشرة لتحقيق وظيفة تعديل كلمة المرور ممكن. نظرًا لأن خادم FTP هذا يعمل منذ عام ويضم ما يقرب من 60 مستخدمًا، فإن احتمال حدوث أخطاء عند نقل هؤلاء المستخدمين من ملف INI إلى قاعدة البيانات لا يزال مرتفعًا نسبيًا، ومن الأسهل تشغيل ملف INI مباشرة.
أول شيء هو معرفة كيفية حفظ معلومات مستخدم Serv-U في ملف INI وكيفية تشفير كلمة المرور. بنية ملف INI بسيطة نسبيًا. لتعديل كلمة المرور، ما عليك سوى العثور على القسم الذي يبدأ بـ [User=@UserID|1] وتعديل قيمة مفتاح كلمة المرور الموجود أسفله. يشير @UserID إلى معرف تسجيل الدخول الخاص بالمستخدم.
1[عالمي]
2الإصدار=6.1.0.5
3PacketTimeOut=300
4
5
6
7[المجال1]
8المستخدم1=
9المستخدم2=
10مستخدم3=
11
12
13
14[USER=abc|1]
15كلمة المرور=niE383DC3710266ECAE04A6B3A18A2966D
16HomeDir=D:
17AlwaysAllowLogin=1
18تغيير كلمة المرور=1
19 مهلة = 600
20Note1="حساب تم إنشاؤه بواسطة المعالج"
21Access1=د:
إثنان وعشرون
ثلاثة وعشرين
يمكن العثور على طريقة تشفير كلمة مرور المستخدم في قاعدة المعرفة بموقع Ser-U الرسمي
http://rhinosoft.com/KBArticle.asp?RefNo=1177&prod=su
إدخال كلمات المرور المشفرة يدويًا في ملف ServUDaemon.ini
لإنشاء كلمة مرور مشفرة، تتم إضافة أول حرفين عشوائيين ('salt' - في النطاق a..z، A..Z) إلى بداية كلمة المرور ذات النص الواضح ثم يتم تجزئتها باستخدام MD5 والناتج يتم ترميز التجزئة كنص عادي يبدأ بالحرفين الملحيين متبوعًا بالتجزئة ذات الترميز السداسي
لحساب المستخدم في ملف .ini، سيبدو هذا كما يلي:
كلمة
المرور=cb644FB1F31184F8D3D169B54B3D46AB1A.
هي السلسلة "cb"، وتجزئة MD5 هي "644FB1F31184F8D3D169B54B3D46AB1A".
عند التحقق من كلمة مرور المستخدم، سيفعل Serv-U الشيء نفسه، فهو يقوم بتحليل الملح من كلمة المرور المخزنة للمستخدم (على سبيل المثال، "cb" في هذه الحالة). هي كلمة المرور التي أرسلها المستخدم إليها من قبل العميل، ويقوم MD5 بتجزئتها، ومقارنة النتيجة بالتجزئة المخزنة، وإذا كانت القيم متساوية، فإن كلمة المرور المدخلة صحيحة.
تتمثل طريقة التشفير في إنشاء حرفين بشكل عشوائي، ثم لصق الحروف وكلمة المرور، ثم العثور على قيم MD5 الخاصة بها، وأخيرًا، ضع الحروف العشوائية أمام قيمة MD5 للحصول على كلمة المرور المشفرة.
بعد ذلك، يمكنك كتابة برنامج بناءً على التحليل أعلاه لتنفيذ التعديل عبر الإنترنت.
1 /**//// <الملخص>
2 /// احصل على قيمة MD5 للسلسلة المحددة
3 /// </الملخص>
4 /// <param name="strContent"></param>
5 /// <returns></returns>
6 سلسلة عامة MD5 (سلسلة strContent)
7 {
8 System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
9 بايت[] بايت = System.Text.Encoding.UTF8.GetBytes( strContent );
10 بايت = md5.ComputeHash( بايت );
11 MD5.Clear();
12 سلسلة ret = "";
13 ل(int i=0;i<bytes.Length;i++)
14 {
15 ret += Convert.ToString(bytes[i],16).PadLeft(2,'0');
16}
17 return ret.PadLeft(32,'0').ToUpper();
18}
19
20
21 /**//// <الملخص>
22 /// أنشئ سلسلة عشوائية، طول السلسلة هو 2
23 /// </الملخص>
24 /// <returns></returns>
25 سلسلة عامة GetRandomString ()
26 {
27 سلسلة strReturn = "";
28 تشغيل عشوائي = new Random();
29 strReturn += Convert.ToChar( ran.Next( 26 ) + 'a' ).ToString();
30 strReturn += Convert.ToChar( ran.Next( 26 ) + 'a' ).ToString();
31 عودة strReturn؛
32}
33
34 //إنشاء كلمة مرور مشفرة من الأحرف العشوائية المحددة وكلمة مرور تسجيل الدخول
35 سلسلة عامة CreateCryPassword (سلسلة strFrontChars، سلسلة strPassword)
36 {
37 return strFrontChars + MD5( strFrontChars + strPassword ).ToUpper().Trim();
38 }
39
40 /**//// <الملخص>
41 /// انقر على حدث "تغيير كلمة المرور" الذي يتم فيه تعديل كلمة المرور.
42 /// </summary>
43 /// <param name="sender"></param>
44 /// <param name="e"></param>
45 btnModifyPwd_Click (مرسل الكائن، System.EventArgs e) باطل خاص
46 {
47 سلسلة strUserID = txtLoginID.Text;
48 إذا (strUserID == سلسلة. فارغة)
49 {
50 controlMessage.InnerHtml = "لا يمكن أن يكون اسم المستخدم فارغًا";
51 عودة؛
52 }
53
54 //تحديد ما إذا كان إدخالا كلمة المرور متماثلين
55 إذا(txtNewPassword.Text != txtConfirmPassword.Text)
56 {
57 controlMessage.InnerHtml = "كلمات المرور التي تم إدخالها مرتين غير متناسقة، يرجى إعادة الإدخال";
58 عودة؛
59 }
60
61 IniFile ini = new IniFile( _strServUDaemonPath );
62 سلسلة strSectionValue = "USER=" + strUserID.Trim() + "|1";
63
64 //تحديد ما إذا كان المستخدم موجودًا من خلال قراءة HomeDir الخاص بالمستخدم المحدد
65 إذا( ini.ReadString( strSectionValue, "HomeDir", "" ) == "" )
66 {
67 controlMessage.InnerHtml = "المستخدم المحدد غير موجود";
68 عودة؛
69 }
70
71 //ابدأ في تحديد ما إذا كانت كلمة المرور صحيحة
72 سلسلة strPassword = ini.ReadString( strSectionValue, "Password", "" );
73
74 سلسلة strPasswordFrontTwoChars؛
75 bool bPasswordRight = false;
76 إذا (strPassword.Length > 2)
77 {
78 //اقرأ الحروف العشوائية الموجودة في كلمة المرور
79 strPasswordFrontTwoChars = strPassword.Substring(0, 2);
80 إذا( CreateCryPassword( strPasswordFrontTwoChars, txtOldPassword.Text ) == strPassword )
81 {//مطابقات كلمة المرور
82 bPasswordRight = صحيح؛
83}
84 آخر
85 {//كلمة المرور غير متطابقة
86 bPasswordRight = false;
87 }
88}
89 آخر إذا (strPassword == txtOldPassword.Text) // كلمة المرور الأصلية فارغة
90 {
91 bPasswordRight = صحيح؛
92 }
93 آخر
94 {
95 bPasswordRight = false;
96 }
97
98 إذا (بباسووردرايت)
99 {
100 //كلمة المرور صحيحة، واكتب كلمة مرور جديدة، وقم بإعدادها لتحميل الإعدادات الجديدة تلقائيًا بحيث تظل صالحة في المرة التالية التي يتم فيها تغييرها.
101 ini.WriteString( strSectionValue, "Password", CreateCryPassword( GetRandomString(), txtNewPassword.Text ) );
102 controlMessage.InnerHtml = "اكتمل تغيير كلمة المرور";
103}
104 آخر
105 {
106 controlMessage.InnerHtml = "كلمة المرور الأصلية خاطئة";
107 }
108
109 }
يتم استخدام المتغير _strServUDaemonPath في التعليمات البرمجية أعلاه لحفظ المسار حيث يوجد الملف ServUDaemon.ini. ويمكن الحصول على هذه القيمة من خلال إعداد Web.Config في حدث PageLoad.
لكن الأمر لم ينته عند هذا الحد. بعد الاختبار، تبين أن هناك مشكلة خطيرة: بعد تغيير كلمة المرور، فقط إعادة تشغيل Serv-U يمكن أن تصبح كلمة المرور التي تم تغييرها نافذة المفعول. ألا يعني هذا أنه غير مجدي؟ لا يمكن للمسؤول دائمًا إعادة تشغيل الخادم لتفعيل تغيير كلمة المرور.
بالعودة إلى قاعدة المعرفة الرسمية لـ Serv-U مرة أخرى، وجدت المحتوى التالي:
تحديث ملف ServUDaemon.ini يدويًا
عندما يتم إجراء تغييرات مباشرة على ملف ServUDaemon.ini، قم بإضافة السطر التالي ضمن المنطقة العامة في ملف INI.
ReloadSettings=True
Serv-U يتحقق بانتظام من ملف INI لهذا الإعداد، إذا كان موجودًا، فسيتم تحديث Serv-U جميع الإعدادات المخزنة لكل مجال على الخادم، وهذا يسمح لـ Serv-U بالتعرف على التغييرات دون الحاجة إلى إعادة التشغيل.
بعد أن يقوم Serv-U بتحميل التغييرات، فإنه يزيل الإدخال "ReloadSettings=True"، مما يسمح لك بإدخاله مرة أخرى في المرة القادمة يتم إجراء أية تغييرات.
بمعنى آخر، طالما قمت بإضافة مفتاح ReloadSettings في القسم GLOBAL من ملف INI وقمت بتعيين قيمته على True، فيمكنك تحديث كلمة المرور تلقائيًا بعد تغييرها. لذلك فقط قم بتعديل الكود الأصلي وأدخل الكود التالي بين السطرين 101 و 102:
ini.WriteString( "GLOBAL"، "ReloadSettings"، "True" );
في هذه المرحلة، اكتملت صفحة الويب لتغيير كلمة مرور Serv-U عبر الإنترنت.
IniFile في البرنامج عبارة عن فئة تقوم بتغليف عملية واجهة برمجة التطبيقات (API) على ملفات INI، وهي تحتاج فقط إلى تنفيذ قراءة وكتابة السلاسل.