Debido a las necesidades del trabajo diario, la unidad utilizó Serv-U para configurar un servidor FTP. Sin embargo, después de hacerse cargo, se descubrió que había un problema muy grave. Este servidor FTP estaba abierto al público y a muchos usuarios. no estableció contraseñas. Si es obligatorio que todos establezcan una contraseña y debe establecerse en el servidor, ¿no significa que todos deben decirle al administrador su contraseña? Después de todo, muchas personas están acostumbradas a usar la misma contraseña. ¿Qué hacer? La mejor manera es, por supuesto, proporcionar una página web que proporcione la función de modificación de contraseña.
Simplemente continúe y verifíquelo en línea. Un método es usar la función ODBC proporcionada por el propio Serv-U, usar la base de datos para almacenar contraseñas y operar directamente la base de datos para realizar la función de modificación de contraseña. Sin embargo, después de probar este método No muy. factible. Debido a que este servidor FTP ha estado funcionando durante un año y tiene casi 60 usuarios, la probabilidad de errores al trasplantar a estos usuarios del archivo INI a la base de datos sigue siendo relativamente alta. Es más fácil operar el archivo INI.
Lo primero es descubrir cómo se guarda la información del usuario de Serv-U en el archivo INI y cómo se cifra la contraseña. La estructura del archivo INI es relativamente simple. Para modificar la contraseña, simplemente busque la sección que comienza con [Usuario=@UserID|1] y modifique el valor de la clave de Contraseña debajo de ella. @UserID se refiere al ID de inicio de sesión del usuario.
1[MUNDIAL]
2Versión=6.1.0.5
3Tiempo de salida del paquete = 300
4
5
6
7[Dominio1]
8Usuario1=
9Usuario2=
10Usuario3=
11
12
13
14[USUARIO=abc|1]
15Contraseña=niE383DC3710266ECAE04A6B3A18A2966D
16DirInicio=D:
17AlwaysAllowLogin=1
18Cambiar contraseña=1
19Tiempo de espera=600
20Note1="Cuenta generada por el asistente"
21Acceso1=D:
Veintidós
veintitrés
El método de cifrado de la contraseña del usuario se puede encontrar en la base de conocimientos del sitio web oficial de Ser-U.
http://rhinosoft.com/KBArticle.asp?RefNo=1177&prod=su
Ingresar manualmente contraseñas cifradas en el archivo ServUDaemon.ini
Para generar una contraseña cifrada, primero se agregan dos caracteres aleatorios (la 'sal', en el rango a..z, A..Z) al principio de la contraseña de texto sin cifrar. Luego se aplica un hash usando MD5 y el resultado.
hash
codificado en hexadecimal.
Para una cuenta de usuario en el archivo .ini, esto se verá así:
Contraseña=cb644FB1F31184F8D3D169B54B3D46AB1A.
es la cadena "cb", el hash MD5 es "644FB1F31184F8D3D169B54B3D46AB1A.
Al verificar la contraseña de un usuario, Serv-U hará lo mismo. Analiza la sal de la contraseña almacenada del usuario (es decir, "cb" en este caso), antepone. es la contraseña que el usuario le envió por el cliente, MD5 la codifica y compara el resultado con el hash almacenado. Si los valores son iguales, entonces la contraseña ingresada es correcta.
El método de cifrado consiste en generar dos letras aleatoriamente, luego unir las letras y la contraseña, y luego encontrar sus valores MD5. Finalmente, coloque las letras aleatorias delante del valor MD5 para obtener la contraseña cifrada.
A continuación, puede escribir un programa basado en el análisis anterior para implementar modificaciones en línea.
1 /**//// <resumen>
2 /// Obtener el valor MD5 de la cadena especificada
3 /// </summary>
4 /// <param nombre="strContent"></param>
5 /// <devoluciones></devoluciones>
6 cadena pública MD5 (cadena strContent)
7 {
8 System.Security.Cryptography.MD5 md5 = nuevo System.Security.Cryptography.MD5CryptoServiceProvider();
9 bytes[] bytes = System.Text.Encoding.UTF8.GetBytes( strContent );
10 bytes = md5.ComputeHash(bytes);
11 md5.Borrar();
12 cuerdas ret = "";
13 para(int i=0; i<bytes.Longitud; i++)
14 {
15 ret += Convert.ToString(bytes[i],16).PadLeft(2,'0');
16}
17 retorno ret.PadLeft(32,'0').ToUpper();
18}
19
20
21 /**//// <resumen>
22 /// Genera una cadena aleatoria, la longitud de la cadena es 2
23 /// </summary>
24 /// <devoluciones></devoluciones>
25 cadena pública GetRandomString()
26 {
27 cadena strReturn = "";
28 Ejecución aleatoria = nueva Aleatoria();
29 strReturn += Convert.ToChar( ran.Next( 26 ) + 'a' ).ToString();
30 strReturn += Convert.ToChar( ran.Next( 26 ) + 'a' ).ToString();
31 retorno strReturn;
32}
33
34 //Generar una contraseña cifrada a partir de las letras aleatorias especificadas y la contraseña de inicio de sesión
35 cadena pública CreateCryPassword (cadena strFrontChars, cadena strPassword)
36 {
37 return strFrontChars + MD5( strFrontChars + strPassword ).ToUpper().Trim();
38 }
39
40 /**//// <resumen>
41 /// Evento de clic de “Cambiar Contraseña”, en el que se modifica la contraseña.
42 /// </summary>
43 /// <param nombre="remitente"></param>
44 /// <param nombre="e"></param>
45 privado vacío btnModifyPwd_Click (remitente del objeto, System.EventArgs e)
46 {
47 cadena strUserID = txtLoginID.Text;
48 si (strUserID == String.Empty)
49 {
50 controlMessage.InnerHtml = "El nombre de usuario no puede estar vacío";
51 regreso;
52 }
53
54 //Determinar si las dos entradas de contraseña son iguales
55 si (txtNuevaContraseña.Texto! = txtConfirmPassword.Texto)
56 {
57 controlMessage.InnerHtml = "Las contraseñas ingresadas dos veces no son consistentes, vuelva a ingresarlas";
58 regresan;
59 }
60
61 IniFile ini = nuevo IniFile( _strServUDaemonPath );
62 cadena strSectionValue = "USER=" + strUserID.Trim() + "|1";
63
64 //Determine si el usuario existe leyendo el HomeDir del usuario especificado
65 si( ini.ReadString( strSectionValue, "HomeDir", "" ) == "" )
66 {
67 controlMessage.InnerHtml = "El usuario especificado no existe";
68 regresan;
69 }
70
71 //Comience a determinar si la contraseña es correcta
72 cadena strPassword = ini.ReadString( strSectionValue, "Contraseña", "" );
73
74 cadenas strPasswordFrontTwoChars;
75 bool bContraseñaDerecha = falso;
76 si(cadenaContraseña.Longitud > 2)
77 {
78 //Leer las letras aleatorias contenidas en la contraseña
79 strPasswordFrontTwoChars = strPassword.Substring(0, 2);
80 if( CreateCryPassword( strPasswordFrontTwoChars, txtOldPassword.Text ) == strPassword )
81 {//Coincidencias de contraseña
82 bContraseñaDerecha = verdadero;
83}
84 más
85 {//La contraseña no coincide
86 bContraseñaDerecha = falso;
87 }
88}
89 else if( strPassword == txtOldPassword.Text) //La contraseña original está vacía
90 {
91 bContraseñaDerecha = verdadero;
92 }
93 más
94 {
95 bContraseñaDerecha = falso;
96 }
97
98 si (bContraseñaDerecha)
99 {
100 //La contraseña es correcta, escriba una nueva contraseña y configúrela para cargar automáticamente nuevas configuraciones para que sigan siendo válidas la próxima vez que se cambien.
101 ini.WriteString( strSectionValue, "Contraseña", CreateCryPassword( GetRandomString(), txtNewPassword.Text ) );
102 controlMessage.InnerHtml = "Cambio de contraseña completado";
103}
104 más
105 {
106 controlMessage.InnerHtml = "La contraseña original es incorrecta";
107 }
108
109 }
La variable _strServUDaemonPath en el código anterior se usa para guardar la ruta donde se encuentra el archivo ServUDaemon.ini. Este valor se puede obtener a través de la configuración Web.Config en el evento PageLoad.
Pero no terminó ahí. Después de las pruebas, se descubrió que hay un problema grave: después de cambiar la contraseña, la contraseña cambiada solo puede surtir efecto al reiniciar Serv-U. ¿No significa eso que es inútil? El administrador no siempre puede reiniciar el servidor para que el cambio de contraseña surta efecto.
Volviendo nuevamente a la base de conocimientos oficial de Serv-U, encontré el siguiente contenido:
Actualización manual del archivo ServUDaemon.ini
Siempre que se realicen cambios directamente en el archivo ServUDaemon.ini, agregue la siguiente línea en el área Global del archivo INI.
ReloadSettings=True
Serv-U verifica periódicamente el archivo INI para ver si está presente, Serv-U se actualizará. todas las configuraciones almacenadas para cada dominio en el servidor. Esto permite que Serv-U reconozca los cambios sin tener que reiniciarlo.
Después de que Serv-U carga los cambios, elimina la entrada "ReloadSettings=True". la próxima vez que se realice algún cambio.
En otras palabras, siempre que agregue la clave ReloadSettings en la sección GLOBAL del archivo INI y establezca su valor en Verdadero, podrá actualizar automáticamente la contraseña después de cambiarla. Así que simplemente modifique el código original e inserte el siguiente código entre las líneas 101 y 102:
ini.WriteString( "GLOBAL", "ReloadSettings", "True");
En este punto, se completa una página web para cambiar la contraseña de Serv-U en línea.
IniFile en el programa es una clase que encapsula la operación de la API en archivos INI. Solo necesita implementar la lectura y escritura de cadenas.