IT猫扑网:您身边最放心的安全下载站! 最新更新| 软件分类| 专题汇总| 手机版

您当前所在位置:IT猫扑网 > 服务器 > FTP服务器 > 让Proftpd 的数据库模块支持MD5验证

让Proftpd 的数据库模块支持MD5验证

时间:2015-06-28 00:00 来源:IT猫扑网|http://www.itmop.com/ 作者:网管联盟 我要评论(0)

    这个是笔者对论坛主机的FTP服务进行注册用户验证,论坛采用的是VBB,看了看VBB的密码加密方式,MD5,FAINT。

    PROFTPD的MOD_SQL模块并不支持MD5。VBB是直接调用MYSQL的MD5()函数进行密码加密。怎么办?HACK!笔者用的PROFTPD是最新的Proftpd 1.2.8,mod_sql 版本是 4.10,查了一下 mod_sql.c 文件,发现增加一种验证方式还是很简单的,当然这个要归功mod_sql.c的程序架构设计得不错。

    下面是笔者修改后得mod_sql.c的部分代码,有中文的地方是笔者加的。

 

#include &conf.h& #include &privs.h& #include &mod_sql.h& #define _MOD_VERSION &mod_sql/4.10& #ifdef HAVE_CRYPT_H #include #endif #ifdef HAVE_LIMITS_H #include #endif /**************/ /* 引入md5头文件 */ #include /**************/ /* Uncomment the following define to allow OpenSSL hashed password checking; * you@#ll also need to link with OpenSSL@#s crypto library ( -lcrypto ) */ /* #define HAVE_OPENSSL */ #ifdef HAVE_OPENSSL #include #endif /* default information for tables and fields */ #define MOD_SQL_DEF_USERTABLE &users& #define MOD_SQL_DEF_USERNAMEFIELD &userid& #define MOD_SQL_DEF_USERUIDFIELD &uid& #define MOD_SQL_DEF_USERGIDFIELD &gid& #define MOD_SQL_DEF_USERPASSWORDFIELD &password& #define MOD_SQL_DEF_USERSHELLFIELD &shell& #define MOD_SQL_DEF_USERHOMEDIRFIELD &homedir& #define MOD_SQL_DEF_GROUPTABLE &groups& #define MOD_SQL_DEF_GROUPNAMEFIELD &groupname& #define MOD_SQL_DEF_GROUPGIDFIELD &gid& #define MOD_SQL_DEF_GROUPMEMBERSFIELD &members& /* default minimum id / default uid / default gid info. * uids and gids less than MOD_SQL_MIN_USER_UID and * MOD_SQL_MIN_USER_GID, respectively, get automatically * mapped to the defaults, below. These can be * overridden using directives */ #define MOD_SQL_MIN_USER_UID 999 #define MOD_SQL_MIN_USER_GID 999 #define MOD_SQL_DEF_UID 65533 #define MOD_SQL_DEF_GID 65533 #define MOD_SQL_BUFSIZE 32 /* Named Query defines */ #define SQL_SELECT_C &SELECT& #define SQL_INSERT_C &INSERT& #define SQL_UPDATE_C &UPDATE& #define SQL_FREEFORM_C &FREEFORM& /* authmask defines */ #define SQL_AUTH_USERS (1<<0) #define SQL_AUTH_GROUPS (1<<1) #define SQL_AUTH_USERS_DEFINITIVE (1<<2) #define SQL_AUTH_GROUPS_DEFINITIVE (1<<3) #define SQL_AUTH_USERSET (1<<4) #define SQL_AUTH_GROUPSET (1<<5) #define SQL_FAST_USERSET (1<<6) #define SQL_FAST_GROUPSET (1<<7) #define SQL_GROUPS (cmap.authmask & SQL_AUTH_GROUPS) #define SQL_USERS (cmap.authmask & SQL_AUTH_USERS) #define SQL_GROUPSET (cmap.authmask & SQL_AUTH_GROUPSET) #define SQL_USERSET (cmap.authmask & SQL_AUTH_USERSET) #define SQL_FASTGROUPS (cmap.authmask & SQL_FAST_GROUPSET) #define SQL_FASTUSERS (cmap.authmask & SQL_FAST_USERSET) #define SQL_GROUPGOD (cmap.authmask & SQL_AUTH_GROUPS_DEFINITIVE) #define SQL_USERGOD (cmap.authmask & SQL_AUTH_USERS_DEFINITIVE) /* * externs, function signatures.. whatever necessary to make * the compiler happy.. */ extern pr_response_t *resp_list,*resp_err_list; static char *_sql_where(pool *p, int cnt, ...); MODRET cmd_getgrent(cmd_rec *); MODRET cmd_setgrent(cmd_rec *); pool *sql_pool; /* * cache typedefs */ #define CACHE_SIZE 13 typedef struct cache_entry { struct cache_entry *list_next; struct cache_entry *bucket_next; void *data; } cache_entry_t; /* this struct holds invariant information for the current session */ static struct { /* * info valid after getpwnam */ char *authuser; /* current authorized user */ struct passwd *authpasswd; /* and their passwd struct */ /* * generic status information */ int status; /* is mod_sql on? */ int authmask; /* authentication mask. * see set_sqlauthenticate for info */ /* * user table and field information */ char *usrtable; /* user info table name */ char *usrfield; /* user name field */ char *pwdfield; /* user password field */ char *uidfield; /* user uid field */ char *gidfield; /* user gid field */ char *homedirfield; /* user homedir field */ char *shellfield; /* user login shell field */ char *userwhere; /* users where clause */ /* * group table and field information */ char *grptable; /* group info table name */ char *grpfield; /* group name field */ char *grpgidfield; /* group gid field */ char *grpmembersfield; /* group members field */ char *groupwhere; /* groups where clause */ /* * other information */ array_header *authlist; /* auth handler list */ char *defaulthomedir; /* default homedir if no field specified */ int buildhomedir; /* create homedir if it doesn@#t exist? */ uid_t minid; /* users UID must be this or greater */ uid_t minuseruid; /* users UID must be this or greater */ gid_t minusergid; /* users UID must be this or greater */ uid_t defaultuid; /* default UID if none in database */ gid_t defaultgid; /* default GID if none in database */ cache_entry_t *curr_group; /* next group in group array for getgrent */ cache_entry_t *curr_passwd; /* next passwd in passwd array for getpwent */ int group_cache_filled; int passwd_cache_filled; unsigned char negative_cache; /* cache negative as well as positive lookups */ /* * mod_ratio data -- someday this needs to be removed from mod_sql */ char *sql_fstor; /* fstor int(11) NOT NULL DEFAULT @#0@#, */ char *sql_fretr; /* fretr int(11) NOT NULL DEFAULT @#0@#, */ char *sql_bstor; /* bstor int(11) NOT NULL DEFAULT @#0@#, */ char *sql_bretr; /* bretr int(11) NOT NULL DEFAULT @#0@#, */ char *sql_frate; /* frate int(11) NOT NULL DEFAULT @#5@#, */ char *sql_fcred; /* fcred int(2) NOT NULL DEFAULT @#15@#, */ char *sql_brate; /* brate int(11) NOT NULL DEFAULT @#5@#, */ char *sql_bcred; /* bcred int(2) NOT NULL DEFAULT @#150000@#, */ /* * precomputed strings */ char *usrfields; char *grpfields; } cmap; /* * cache functions */ typedef unsigned int ( * val_func ) ( const void * ); typedef int ( * cmp_func ) ( const void *, const void * ); typedef struct { /* memory pool for this object */ pool *pool; /* cache buckets */ cache_entry_t *buckets[ CACHE_SIZE ]; /* cache functions */ val_func hash_val; cmp_func cmp; /* list pointers */ cache_entry_t *head; /* list size */ unsigned int nelts; } cache_t; cache_t *group_name_cache; cache_t *group_gid_cache; cache_t *passwd_name_cache; cache_t *passwd_uid_cache; static cache_t *make_cache( pool *p, val_func hash_val, cmp_func cmp ) { cache_t *res; if ( ( p == NULL ) || ( hash_val == NULL ) || ( cmp == NULL ) ) return NULL; res = ( cache_t * ) pcalloc( p, sizeof( cache_t ) ); res->pool = p; res->hash_val = hash_val; res->cmp = cmp; res->head = NULL; res->nelts = 0; return res; } static cache_entry_t *cache_addentry( cache_t *cache, void *data ) { cache_entry_t *entry; int hashval; if ( ( cache == NULL ) || ( data == NULL ) ) return NULL; /* create the entry */ entry = ( cache_entry_t * ) pcalloc( cache->pool, sizeof( cache_entry_t ) ); entry->data = data; /* deal with the list */ if ( cache->head == NULL ) { cache->head = entry; } else { entry->list_next = cache->head; cache->head = entry; } /* deal with the buckets */ hashval = cache->hash_val( data ) % CACHE_SIZE; if ( cache->buckets[ hashval ] == NULL ) { cache->buckets[ hashval ] = entry; } else { entry->bucket_next = cache->buckets[ hashval ]; cache->buckets[ hashval ] = entry; } cache->nelts++; return entry; } static void *cache_findvalue( cache_t *cache, void *data ) { cache_entry_t *entry; int hashval; if ( ( cache == NULL ) || ( data == NULL ) ) return NULL; hashval = cache->hash_val( data ) % CACHE_SIZE; entry = cache->buckets[ hashval ]; while ( entry != NULL ) { if ( cache->cmp

关键词标签:

相关阅读 Linux下FTP的配置与应用 什么是ftp及ftp服务器 FTP出错解决和分析 proftp 安装设定文档 使用Win 2003搭建安全文件服务器 让Proftpd 的数据库模块支持MD5验证

文章评论
发表评论

热门文章 使用Win 2003搭建安全文件服务器 使用Win 2003搭建安全文件服务器 linux服务samba的详细配置 linux服务samba的详细配置 图解Windows xp—FTP服务器配置 图解Windows xp—FTP服务器配置 Linux文件传送命令SCP(Secure Copy) Linux文件传送命令SCP(Secure Copy) 在Windows 2003下搭建FTP服务器 在Windows 2003下搭建FTP服务器 IIS6.0打造FTP服务器完全图文详解 IIS6.0打造FTP服务器完全图文详解

相关下载

人气排行 vsftp配置大全---超完整版 IIS6.0打造FTP服务器完全图文详解 使用Win 2003搭建安全文件服务器 图解Windows xp—FTP服务器配置 linux服务samba的详细配置 在Windows 2003下搭建FTP服务器 FTP登陆错误详解 Windows内置FTP服务器高级配置 Windows XP系统下架设FTP服务器的步骤 不用工具也可以修改Serv-u默认43958端口 使用CesarFTP架设FTP服务器 FTP空间不足 Windows 系统性能监控来报警