动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > ASP.NET技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ ASP.NET技巧 ]的信息



本月文章推荐
.自动处理过长字符串显示的Web控件.
.Asp.net Ajax 1.0 异步回调时,服.
.关于脏字典过滤问题-用正则表达.
..NET3.5和VS2008中的ASP.NET AJAX.
..net中错误日志的写入.
.Asp.net url分页的用户控件 .
.ASP.NET 2.0 Treeview Checkboxe.
.创建完全可编辑的 DataGrid.
.一段比较经典的多线程学习代码.
.数据采集程序(网页小偷)点滴心得.
..NET框架2.0里的aspnet_compiler.
.XML 自定义串行化.
.ASP.net生成文字图片.
.实现.NET应用程序的自动更新 .
.ASP.NET如何存取SQL Server数据库.
.ASP.NET中实现Flash与.NET的紧密.
.解决错误:sql_variant is incom.
.在asp.net中为Web用户控件添加属.
.学习使用ASP.NET 2.0的本地化.
.ASP.NET Atlas对JavaScript的扩展.

为Serv-U提供在线修改密码功能

发表日期:2006-1-16 |


       由于日常工作的需要,单位使用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="Wizard generated account"
21Access1=D:\
22
23
       用户密码的加密方法可以在Ser-U官方网站的知识库查到
       http://rhinosoft.com/KBArticle.asp?RefNo=1177&prod=su
Manually Entering Encrypted Passwords into the ServUDaemon.ini File
To generate an encrypted password, first two random characters (the 'salt' - in the range a..z, A..Z) are added to the beginning of the clear-text password. This is then hashed using MD5 and the resulting hash is hex-encoded. The result of this is written as plain-text starting with the 2 salt characters followed by the hex-encoded hash.

For a user account in the .ini file, this will look like:

Password=cb644FB1F31184F8D3D169B54B3D46AB1A

The salt is the string "cb", the MD5 hash is "644FB1F31184F8D3D169B54B3D46AB1A".

When verifying a user's password, Serv-U will do the same. It parses the salt from the user's stored password (ie. "cb" in this case), prepends it the password the user sent to it by the client, MD5 hashes it, and compares the result with the stored hash. If the values are equal, then the entered password is correct.
 

加密的方法也就是随机生成两个字母,然后将字母和密码进行拼接,再求它们的MD5值,最后将随机字母放在MD5值的前面便是加密后的密码。
       接下来就可以根据以上的分析编写程序来实现在线修改了。
  1        /**//// <summary>
  2        /// 获取指定字符串的MD5值
  3        /// </summary>
  4        /// <param name="strContent"></param>
  5        /// <returns></returns>
  6        public String MD5( String strContent )
  7        {
  8            System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
  9            byte[] bytes = System.Text.Encoding.UTF8.GetBytes( strContent );
 10            bytes = md5.ComputeHash( bytes );
 11            md5.Clear();
 12            string ret = "";
 13            for(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        /**//// <summary>
 22        /// 生成随便字符串,字符串长度为2
 23        /// </summary>
 24        /// <returns></returns>
 25        public string GetRandomString()
 26        {           
 27            string strReturn = "";
 28            Random ran = new Random();
 29            strReturn += Convert.ToChar( ran.Next( 26 ) + 'a' ).ToString();
 30            strReturn += Convert.ToChar( ran.Next( 26 ) + 'a' ).ToString();
 31            return strReturn;           
 32        }
 33
 34        //由指定的随机字母和登录密码生成加密后的密码
 35        public string CreateCryPassword( string strFrontChars, string strPassword )
 36        {
 37            return strFrontChars + MD5( strFrontChars + strPassword ).ToUpper().Trim();
 38        }
 39
 40        /**//// <summary>
 41        /// “修改密码”的点击事件,在此事件中对密码进行修改
 42        /// </summary>
 43        /// <param name="sender"></param>
 44        /// <param name="e"></param>
 45        private void btnModifyPwd_Click(object sender, System.EventArgs e)
 46        {
 47            string strUserID = txtLoginID.Text;
 48            if( strUserID == String.Empty )
 49            {
 50                controlMessage.InnerHtml = "用户名不能为空";
 51                return;
 52            }
 53
 54            //判断两次密码输入是否相同
 55            if( txtNewPassword.Text != txtConfirmPassword.Text )
 56            {
 57                controlMessage.InnerHtml = "两次输入的密码不一致,请重新输入";
 58                return;
 59            }
 60
 61            IniFile ini = new IniFile( _strServUDaemonPath );
 62            string strSectionValue = "USER=" + strUserID.Trim() + "|1";
 63
 64            //通过读取指定用户的HomeDir来确定是否存在该用户
 65            if( ini.ReadString( strSectionValue, "HomeDir", "" ) == "" )
 66            {
 67               controlMessage.InnerHtml = "指定的用户不存在";
 68                return;
 69            }
 70
 71            //开始判断密码是否正确
 72            string strPassword = ini.ReadString( strSectionValue, "Password", "" );
 73
 74            string strPasswordFrontTwoChars;
 75            bool bPasswordRight = false;
 76            if( strPassword.Length > 2 )
 77            {
 78                //读取密码中包含的随机字母
 79                strPasswordFrontTwoChars = strPassword.Substring( 0, 2 );
 80                if( CreateCryPassword( strPasswordFrontTwoChars, txtOldPassword.Text ) == strPassword )
 81                {//密码符合
 82                    bPasswordRight = true;
 83                }
 84                else
 85                {//密码不符
 86                    bPasswordRight = false;
 87                }
 88            }
 89            else if( strPassword == txtOldPassword.Text )  //原密码为空
 90            {
 91                bPasswordRight = true;
 92            }
 93            else
 94            {
 95                bPasswordRight = false;
 96            }
 97
 98            if( bPasswordRight )
 99            {
100                //密码正确,写入新的密码,并设置自动加载新的设置,以便下一次更改时仍有效
101                ini.WriteString( strSectionValue, "Password", CreateCryPassword( GetRandomString(), txtNewPassword.Text ) );
102                            controlMessage.InnerHtml = "完成密码修改";
103            }
104            else
105            {
106                controlMessage.InnerHtml = "原密码错误";
107            }
108
109        } 
        以上代码中的_strServUDaemonPath变量用于保存ServUDaemon.ini文件所在的路径,该值可以在PageLoad事件中通过Web.Config设置取得。
       但事情并没有就此结束。经过测试,发现在存在一个严重的问题:修改密码后只有重启Serv-U才能使修改后的密码生效。那不是等于没什么用嘛,管理员总不可能没事老在那里重启服务器来使密码修改生效吧。
        再次回来Serv-U的官方知识库,查到了如下一条内容:
Manually Updating the ServUDaemon.ini File
Whenever changes are made directly to the ServUDaemon.ini file, add the following line under the Global area in the INI file.

ReloadSettings=True

Serv-U regularly checks the INI file for this setting. If it is present, Serv-U will refresh all stored settings for every domain on the server. This allows Serv-U to recognize the changes without having to be restarted.

After Serv-U loads the changes, it removes the "ReloadSettings=True" entry. This allows you to enter it again next time any changes are made.
也就是说,只要在INI文件的GLOBAL节添加键ReloadSettings并设置它的值为True便可以实现修改密码后自动更新了。于是只要修改原代码,在101行和102行之间插入如下一句代码即可:
ini.WriteString( "GLOBAL", "ReloadSettings", "True" );
        到这里,一个在线修改Serv-U密码的网页就全部完成了。
        程序中的IniFile是一个封装了API对INI文件操作的类,仅需要实现对字符串的读取和写入即可。


上一篇:在IIS6.0下ASP .NET 的版本冲突问题 人气:8530
下一篇:如何在调用线程的时候传递参数 人气:7231
浏览全部Serv-U的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-5 360安全卫士 V4.2.0.1004
2008-7-5 PHPDug v2.0 多国语言版
2008-7-5 乘风电影程序 v3.69 (SQL)
2008-7-5 乘风电影程序 v3.69
2008-7-5 wfTextImage文字图像组件 v1.5
2008-7-5 ZY music! v1.1.0705
2008-7-5 FavShop网店系统 v1.0
2008-7-4 天空网络电影系统SKYUC v2.5.1 B
2008-7-4 Drupal v7.x-dev Build 080704
2008-7-5 AgileMessenger即时通讯工具 v1.
2008-7-5 GoodCalculator2.0版固件计算器
2008-7-5 RepoName源地址搜索工具 v1.21b
2008-7-5 AgileMessenger即时通讯工具 v1.
2008-7-5 TouchCopy多媒体管理软件 v3.13完
2008-7-5 VideosTone视频铃声 v1.1汉化破解
2008-7-5 TouchPad触摸板 v4.44破解版
2008-7-5 VideosTone破解补丁 v1.0
2008-7-5 Feeds GoogleReader客户端 v0.4.3


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報