|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我觉得这个学习方法很重要。初学者应该跟我一样有同样一个毛病。那就是急于求成。很想就自己做出个小小的系统来。可真要动手,却又茫然而不知所措。为什么会这样呢?因为我们没有耐心去学习基础知识。写根本看不到什么效果的测试代码。serv-u|在线 因为一样平常事情的必要,单元利用Serv-U架设了一个FTP服务器,但是自从接办以后发明存在着一个十分严峻的成绩,这个FTP服务器是对外公然的,竟然良多用户都没有设置暗码。假如强迫请求一切人设置暗码又必需在服务器上设,如许岂不是要一切人都把本人的暗码告知办理员吗,究竟良多人习气于用统一个暗码的。怎样办呢?最好的举措固然是可以供应一个Web页面来供应暗码的修正功效。
说干就干,在网上查了一下,有一种办法是利用Serv-U本身供应的ODBC功效,用数据库来存储暗码,经由过程间接对数据库举行操纵来完成暗码的修正功效,但经由测验这类办法其实不太可行。由于这个FTP服务器已运转了一年之久,内里已有快要六十个用户,要将这些用户从Ini文件移植到数据库呈现毛病的概率仍是对照高的,还不如间接对INI文件举行操纵来得爽性。
起首是要弄分明Serv-U的用户信息在INI文件中是怎样保留的,暗码又是怎样加密的。INI文件的布局对照复杂,修正暗码的话只需找到以[User=@UserID|1]节,并修正其下的Password键的值便可。@UserID指的是用户的登录ID。
1[GLOBAL]
2Version=6.1.0.5
3PacketTimeOut=300
4
5
6
7[Domain1]
8User1=
9User2=
10User3=
11
12
13
14[USER=abc|1]
15Password=niE383DC3710266ECAE04A6B3A18A2966D
16HomeDir=D:
17AlwaysAllowLogin=1
18ChangePassword=1
19TimeOut=600
20Note1="Wizardgeneratedaccount"
21Access1=D:
22
23
用户暗码的加密办法能够在Ser-U官方网站的常识库查到
http://rhinosoft.com/KBArticle.asp?RefNo=1177&prod=su
ManuallyEnteringEncryptedPasswordsintotheServUDaemon.iniFile
Togenerateanencryptedpassword,firsttworandomcharacters(thesalt-intherangea..z,A..Z)areaddedtothebeginningoftheclear-textpassword.ThisisthenhashedusingMD5andtheresultinghashishex-encoded.Theresultofthisiswrittenasplain-textstartingwiththe2saltcharactersfollowedbythehex-encodedhash.
Forauseraccountinthe.inifile,thiswilllooklike:
Password=cb644FB1F31184F8D3D169B54B3D46AB1A
Thesaltisthestring"cb",theMD5hashis"644FB1F31184F8D3D169B54B3D46AB1A".
Whenverifyingauserspassword,Serv-Uwilldothesame.Itparsesthesaltfromtheusersstoredpassword(ie."cb"inthiscase),prependsitthepasswordtheusersenttoitbytheclient,MD5hashesit,andcomparestheresultwiththestoredhash.Ifthevaluesareequal,thentheenteredpasswordiscorrect.
加密的办法也就是随机天生两个字母,然后将字母和暗码举行拼接,再求它们的MD5值,最初将随机字母放在MD5值的后面即是加密后的暗码。
接上去就能够依据以上的剖析编写程序来完成在线修正了。
1/**////<summary>
2///猎取指定字符串的MD5值
3///</summary>
4///<paramname="strContent"></param>
5///<returns></returns>
6publicStringMD5(StringstrContent)
7{
8System.Security.Cryptography.MD5md5=newSystem.Security.Cryptography.MD5CryptoServiceProvider();
9byte[]bytes=System.Text.Encoding.UTF8.GetBytes(strContent);
10bytes=md5.ComputeHash(bytes);
11md5.Clear();
12stringret="";
13for(inti=0;i<bytes.Length;i++)
14{
15ret+=Convert.ToString(bytes,16).PadLeft(2,0);
16}
17returnret.PadLeft(32,0).ToUpper();
18}
19
20
21/**////<summary>
22///天生任意字符串,字符串长度为2
23///</summary>
24///<returns></returns>
25publicstringGetRandomString()
26{
27stringstrReturn="";
28Randomran=newRandom();
29strReturn+=Convert.ToChar(ran.Next(26)+a).ToString();
30strReturn+=Convert.ToChar(ran.Next(26)+a).ToString();
31returnstrReturn;
32}
33
34//由指定的随机字母和登录暗码天生加密后的暗码
35publicstringCreateCryPassword(stringstrFrontChars,stringstrPassword)
36{
37returnstrFrontChars+MD5(strFrontChars+strPassword).ToUpper().Trim();
38}
39
40/**////<summary>
41///“修正暗码”的点击事务,在此事务中对暗码举行修正
42///</summary>
43///<paramname="sender"></param>
44///<paramname="e"></param>
45privatevoidbtnModifyPwd_Click(objectsender,System.EventArgse)
46{
47stringstrUserID=txtLoginID.Text;
48if(strUserID==String.Empty)
49{
50controlMessage.InnerHtml="用户名不克不及为空";
51return;
52}
53
54//判别两次暗码输出是不是不异
55if(txtNewPassword.Text!=txtConfirmPassword.Text)
56{
57controlMessage.InnerHtml="两次输出的暗码纷歧致,请从头输出";
58return;
59}
60
61IniFileini=newIniFile(_strServUDaemonPath);
62stringstrSectionValue="USER="+strUserID.Trim()+"|1";
63
64//经由过程读取指定用户的HomeDir来断定是不是存在该用户
65if(ini.ReadString(strSectionValue,"HomeDir","")=="")
66{
67controlMessage.InnerHtml="指定的用户不存在";
68return;
69}
70
71//入手下手判别暗码是不是准确
72stringstrPassword=ini.ReadString(strSectionValue,"Password","");
73
74stringstrPasswordFrontTwoChars;
75boolbPasswordRight=false;
76if(strPassword.Length>2)
77{
78//读取暗码中包括的随机字母
79strPasswordFrontTwoChars=strPassword.Substring(0,2);
80if(CreateCryPassword(strPasswordFrontTwoChars,txtOldPassword.Text)==strPassword)
81{//暗码切合
82bPasswordRight=true;
83}
84else
85{//暗码不符
86bPasswordRight=false;
87}
88}
89elseif(strPassword==txtOldPassword.Text)//原暗码为空
90{
91bPasswordRight=true;
92}
93else
94{
95bPasswordRight=false;
96}
97
98if(bPasswordRight)
99{
100//暗码准确,写进新的暗码,并设置主动加载新的设置,以便下一次变动时仍无效
101ini.WriteString(strSectionValue,"Password",CreateCryPassword(GetRandomString(),txtNewPassword.Text));
102controlMessage.InnerHtml="完成暗码修正";
103}
104else
105{
106controlMessage.InnerHtml="原暗码毛病";
107}
108
109}
以上代码中的_strServUDaemonPath变量用于保留ServUDaemon.ini文件地点的路径,该值能够在PageLoad事务中经由过程Web.Config设置获得。
但事变并没有就此停止。经由测试,发明在存在一个严峻的成绩:修正暗码后只要重启Serv-U才干使修正后的暗码失效。那不是即是没甚么用嘛,办理员总不成能没事老在那边重启服务器来使暗码修正失效吧。
再次返来Serv-U的官方常识库,查到了以下一条内容:
ManuallyUpdatingtheServUDaemon.iniFile
WheneverchangesaremadedirectlytotheServUDaemon.inifile,addthefollowinglineundertheGlobalareaintheINIfile.
ReloadSettings=True
Serv-UregularlycheckstheINIfileforthissetting.Ifitispresent,Serv-Uwillrefreshallstoredsettingsforeverydomainontheserver.ThisallowsServ-Utorecognizethechangeswithouthavingtoberestarted.
AfterServ-Uloadsthechanges,itremovesthe"ReloadSettings=True"entry.Thisallowsyoutoenteritagainnexttimeanychangesaremade.
也就是说,只需在INI文件的GLOBAL节增加键ReloadSettings并设置它的值为True即可以完成修正暗码后主动更新了。因而只需修正原代码,在101行和102行之间拔出以下一句代码便可:
ini.WriteString("GLOBAL","ReloadSettings","True");
到这里,一个在线修正Serv-U暗码的网页就全体完成了。
程序中的IniFile是一个封装了API对INI文件操纵的类,仅必要完成对字符串的读取和写进便可。
听03很多师兄说主讲老师杭城方讲课很差就连旁听也没有去了) |
|