热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Debian系统安装ProFTPd并配置MySQL虚拟用户认证

1.查看是否已经安装proftpd软件(一般Debian5.0自带安装,通常为1.3.0以上的版本)查看是否安装proftpd,通过命令查看是否已经安装proftpd服务端(结果依据版本而定)apt-cachesearchproftpd2.安装proftpd-mysql整合模块aptitudeinstallproftp

1.       查看是否已经安装proftpd软件(一般Debian5.0自带安装,通常为1.3.0以上的版本)
查看是否安装proftpd,通过命令查看是否已经安装proftpd服务端(结果依据版本而定)


apt-cache search proftpd
 
2.       安装proftpd-mysql整合模块
aptitude install proftpd-mysql或者apt-get install proftpd-mysql(这个命令试过了很多源都更新不到)
Proftpd安装后会提示 inetd or standalone? 选择:standalone模式运行
 
3.       增加用户组和用户


groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser
 

4.       创建数据库表结构

mysql -u root -pcreate database ftp;

 

GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'ftp'@'localhost' IDENTIFIED BY 'password';

GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'ftp'@'localhost.localdomain' IDENTIFIED BY 'password';

FLUSH PRIVILEGES;

 

USE ftp;

CREATE TABLE ftpgroup (

groupname varchar(16) NOT NULL default '',

gid smallint(6) NOT NULL default '5500',

members varchar(16) NOT NULL default '',

KEY groupname (groupname)

) TYPE=MyISAM COMMENT='ProFTP group table';

 

CREATE TABLE ftpquotalimits (

name varchar(30) default NULL,

quota_type enum('user','group','class','all') NOT NULL default 'user',

per_session enum('false','true') NOT NULL default 'false',

limit_type enum('soft','hard') NOT NULL default 'soft',

bytes_in_avail int(10) unsigned NOT NULL default '0',

bytes_out_avail int(10) unsigned NOT NULL default '0',

bytes_xfer_avail int(10) unsigned NOT NULL default '0',

files_in_avail int(10) unsigned NOT NULL default '0',

files_out_avail int(10) unsigned NOT NULL default '0',

files_xfer_avail int(10) unsigned NOT NULL default '0'

) TYPE=MyISAM;

 

CREATE TABLE ftpquotatallies (

name varchar(30) NOT NULL default '',

quota_type enum('user','group','class','all') NOT NULL default 'user',

bytes_in_used int(10) unsigned NOT NULL default '0',

bytes_out_used int(10) unsigned NOT NULL default '0',

bytes_xfer_used int(10) unsigned NOT NULL default '0',

files_in_used int(10) unsigned NOT NULL default '0',

files_out_used int(10) unsigned NOT NULL default '0',

files_xfer_used int(10) unsigned NOT NULL default '0'

) TYPE=MyISAM;

 

CREATE TABLE ftpuser (

id int(10) unsigned NOT NULL auto_increment,

userid varchar(32) NOT NULL default '',

passwd varchar(32) NOT NULL default '',

uid smallint(6) NOT NULL default '5500',

gid smallint(6) NOT NULL default '5500',

homedir varchar(255) NOT NULL default '',

shell varchar(16) NOT NULL default '/sbin/nologin',

count int(11) NOT NULL default '0',

accessed datetime NOT NULL default '0000-00-00 00:00:00',

modified datetime NOT NULL default '0000-00-00 00:00:00',

PRIMARY KEY (id),

UNIQUE KEY userid (userid)

) TYPE=MyISAM COMMENT='ProFTP user table';

 

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');

INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'test', 'test', 2001, 2001, '/home/www.demo.com', '/sbin/nologin', 0, '', '');

INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (2, 'admin', 'admin', 2002, 2001, '/home/www.demo2.com', '/sbin/nologin', 0, '', '');

INSERT INTO `ftpquotalimits` (`name`, `quota_type`, `per_session`, `limit_type`, `bytes_in_avail`, `bytes_out_avail`, `bytes_xfer_avail`, `files_in_avail`, `files_out_avail`, `files_xfer_avail`) VALUES ('exampleuser', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);

 

quit;

 

5.       修改配置文件/etc/proftpd/proftpd.conf

5.1   关闭IPv6的支持

查找UseIPv6字段修改on为off

 

5.2   添加数据库支持以及配置限制

# The passwords in MySQL are encrypted using CRYPT

SQLAuthTypes Plaintext Crypt

SQLAuthenticate users groups

 

# used to connect to the database

# databasename@host database_user user_password

SQLConnectInfo ftp@localhost root zsdinfo

 

# Here we tell ProFTPd the names of the database columns in the "usertable"

# we want it to interact with. Match the names with those in the db

SQLUserInfo ftpuser userid passwd uid gid homedir shell

 

# Here we tell ProFTPd the names of the database columns in the "grouptable"

# we want it to interact with. Again the names match with those in the db

SQLGroupInfo ftpgroup groupname gid members

 

# set min UID and GID - otherwise these are 999 each

SQLMinID 500

 

# create a user's home directory on demand if it doesn't exist

CreateHome on

 

# Update count every time user logs in

SQLLog PASS updatecount

SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser

 

# Update modified everytime user uploads or deletes a file

SQLLog STOR,DELE modified

SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

 

# User quotas

# ===========

QuotaEngine on

QuotaDirectoryTally on

QuotaDisplayUnits Mb

QuotaShowQuotas on

 

SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'"

 

SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'"

 

SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies

 

SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies

 

QuotaLimitTable sql:/get-quota-limit

QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

 

RootLogin off

RequireValidShell off

 

5.3   查找/etc/proftpd/module.conf文件

注释LoadModule mod_sql_postgres.c

 

5.4   重启proftpd

/etc/init.d/proftpd restart

5.5   登录FTP测试是否能够通过mysql所设置的用户登录

ftp localhost

用户名和密码使用mysql中数据库ftp对应的ftpuser的用户

登录成功:

 

登录失败:

 

6.       数据库表结构介绍
ftpuser Table表介绍:这些表都是由MySql来自动创建,一般不要手工修改。
userid: Proftpd虚拟用户(如exampleuser )
passwd: 用户加密密码。
uid: 该帐号的FTP用户创建结束时,第2步(如2001)
gid: 在groupid的FTP创建组结束时,第2步(如2001)
homedir: 虚拟Proftpd用户的主目录 (如 /home/www.example.com)。虚拟用户将被固定在这个主目录中,也就是说,他不能访问其他目录以外的主目录。
shell: 用户登陆后的shell。 默认情况下在 /sbin/nologin 这里。
 
ftpquotalimits Table表介绍:这些表都是由MySql来自动创建,一般不要手工修改。
name: Proftpd的虚拟用户 (如exampleuser)
quota_type: 用户或组。通常情况下,是在这里使用的用户。
per_session: true或false 。true 是指配额限制只适用于一次上传。例如,如果用户都有一个配额的15 MB时,他已上传15M文件,他就不能上传东西更多。但如果他退出logs再次登陆,他再次有15 MB可用。当值为false 时,该用户有15 MB时,不管他是否登陆,将再一次写入logs。
limit_type: hard 或 soft。hard 配额限制是不能超过限额,而soft 配额可以暂时超过。通常你很难在这里使用。
bytes_in_avail: 上传限制字节 (如:15728640 for 15 MB)。0意味着无限的。
bytes_out_avail: 下载限制字节。 0意味着无限的。
bytes_xfer_avail: 限制字节总和。上传和下载的使用者的总和,是允许这样做。 0意味着无限的。
files_in_avail:上传限制的文件。 0意味着无限的。
files_out_avail: 下载文件的限制。 0意味着无限的。
files_xfer_avail: 转移限制的文件。 0意味着无限的。
 
ftpquotatallies table 使用 Proftpd 内建的配额管理,所以不用再新建。
 

7.       SSL认证配置(可选)
aptitude install openssl
vi /etc/proftpd/proftpd.conf
 
UseIPv6 off
加入如下内容:
DefaultRoot ~
IdentLookups off
ServerIdent on "FTP Server ready."

8.       创建TLS的SSL证书(可选)
8.1   为了使用TLS,我们必须创建一个SSL证书。我想创建在 /etc/proftpd/ ,先创建 ssl 目录:
mkdir /etc/proftpd/ssl
 
8.2   基本信息配置
Country Name (2 letter code) [AU]: <-- 输入你的国家名 (如: CN ).
State or Province Name (full name) [Some-State]: <-- 输入你所在的州或者省的名字。(如江苏:jiangsu )
Locality Name (eg, city) []: <-- 输入你的城市。(如南京:nanjing )
Organization Name (eg, company) [Internet Widgits Pty Ltd]: <-- 输入你的组织名称(例如,贵公司的名称: yahoo )
Organizational Unit Name (eg, section) []: <-- <- 请输入你的组织单位名称(如“IT部门”: it )。
Common Name (eg, YOUR name) []: <-- 输入完整的系统域名(如“server1.example.com”)。
Email Address []: <-- 请输入你的电子邮件地址。
 
8.3   添加tls.conf
vi /etc/proftpd/proftpd.conf
在文件中引入 /etc/proftpd/tls.conf 这一行:
# This is used for FTPS connections
Include /etc/proftpd/tls.conf
 
8.4   备份配置文件
cp /etc/proftpd/tls.conf /etc/proftpd/tls.conf_org
vi /etc/proftpd/tls.conf

TLSEngine                  on
TLSLog                     /var/log/proftpd/tls.log
TLSProtocol                SSLv23
TLSOptions                 NoCertRequest AllowClientRenegotiations
TLSRSACertificateFile      /etc/proftpd/ssl/proftpd.cert.pem
TLSRSACertificateKeyFile   /etc/proftpd/ssl/proftpd.key.pem
TLSVerifyClient            off
TLSRequired                on

 
8.5   重启proftpd测试SSL登录
/etc/init.d/proftpd restart
 


附录一
  常用参数
MaxClients 100 ;最大用户同时连接数
MaxClientsPerHost 8 ;同一个客户端只能最多8个账号可以登陆
MaxClientsPerUser 5 #每个账户在每个客户端最多可以同时登陆5次,可以防止多线程软件下载对服务器的破坏。
MaxHostsPerUser 2 #每个用户最多允许来源IP为2个。
WtmpLog on 是否要把ftp记录在日志中,设置成off可以屏蔽掉log日志。
TransferRate RETR 100.0:102400 #限速100KByte/S
TimeoutIdle 150 #发呆时间(秒)默认为600秒
TimeoutLogin 50 #登陆超时(秒)
TimeoutNoTransfer 150 #传输超时(秒)
UseReverseDNS off #不允许proftpd进行DNS反查
IdentLookups off #不对用户端进行ident确认
AllowOverwrite on ;允许覆盖
AllowRetrieveRestart on ;允许下载续传
AllowStoreRestart on ;允许上载续传
AllowForeignAddress on #让proftp支持现在流行的passive传输方式,默认是不支持的。
PassivePorts 49152 65534 #端口也可自己指定喜欢的,千万别忘了在客户端也要设置成支持passive
RootLogin on #允许以root身份登录,默认是不允许的,出于安全起见不推荐此选项。


附录二
  配置基于本地用户的访问控制

#配置只有ftpusers组的用户可以ftp登陆

DenyAll #不允许

AllowGroup ftpusers

Order deny,allow

Deny from all  #配置禁止某网段地址访问FTP。在这里可以填入如:172.16.5

Allow from 172.16.12 #配置只允许172.16.12网段的机器可以ftp登陆

#配置账号webuser拥有/wwwroot目录的所有权限

  AllowUser webuser

#写权限设置

DenyAll #不允许

#对确省跟下的incoming目录进行权控设置

 

#允许incomming目录可写

allowall

 

#对dele,chmod,retr等ftp命令控制

DenyAll #不允许用户对受控制对象操作

磁盘限额:

Quotas on

QuotaCalc on

DefaultQuota 8000 #用户只能用8000个block

QuotaBlockSize 1024 #byte

QuotaBlockName kb  #1K,只在提示中出现,告诉用户block的单位。

使用MySQL认证,可以把sample-configurations/mod_sql.conf拷贝到/usr/local/etc下面并将其改名为proftpd.conf

我们用到的比较多的可能是Limit的使用,Limit大致有以下动作,基本能覆盖全部的权限了,大家灵活使用就是了。

CMD:Change Working Directory 改变目录

MKD:MaKe Directory 建立目录的权限

RNFR: ReName FRom 更改目录名的权限

DELE:DELEte 删除文件的权限

RMD:ReMove Directory 删除目录的权限

RETR:RETRieve 从服务端下载到客户端的权限

STOR:STORe 从客户端上传到服务端的权限

READ:可读的权限,不包括列目录的权限,相当于RETR,STAT等

WRITE:写文件或者目录的权限,包括MKD和RMD

DIRS:是否允许列目录,相当于LIST,NLST等权限,还是比较实用的

ALL:所有权限

LOGIN:是否允许登陆的权限

 

针对上面这个Limit所应用的对象,又包括以下范围

 

AllowUser 针对某个用户允许的Limit

DenyUser 针对某个用户禁止的Limit

AllowGroup 针对某个用户组允许的Limit

DenyGroup 针对某个用户组禁止的Limit

AllowAll 针对所有用户组允许的Limit

DenyAll 针对所有用户禁止的Limit


附录三
  proftpd.conf样例

#设置FTP服务器的名称:

ServerName"My FTP Server"

#设置FTP服务器的类型,ProFTPD能以 Stand-alone、xinetd两种模式运行:

ServerType standalone

#是否启用虚拟的FTP,on 为支持,off是关闭。

DefaultServer on

#设置根,可以限制用户在某个地方活动,增强服务器的安全性。

DefaultRoot ~

#设置FTP服务端口号,标准的FTP服务端口是21。

Port 21

#设置新建文件或目录时,指定默认配置文件的权限,一般是022:

Umask 022

#同一时间内服务器可以处理的程序有几笔,若服务器运行类型为standalone,可设低一些,以防止DoS攻击,设置最大的了进程:

MaxInstances 30

#设置正常服务的系统用户与组,指定proftpd 进程启动时的有效用户ID,处于安全考虑默认的身份是nobody.:

User ftpuser

Group nobody

#使用主机本地端时间,而不要使用GMT时间,会引起时间误差

TimesGTM off

#允许覆盖

AllowOverwrite  on

#设置最大的登录数:

MaxClients 10

#当使用者登陆时,则会显示welcome.msg中的欢迎词信息:

DisplayLogin welcome.msg

#当使用者转换目录,则会显示.message中的信息

DisplayFirstChdir .message

#设置最大的尝试登录的次数,如果超过自动断开连接:

MaxLoginAttempts 3

#下载时,支持断点续传:

AllowRetrieveRestart on

#上传时,允许断点续传:

AllowStoreRestart on

#屏蔽服务器版本信息

ServerIdent off

#设置系统日志文件:

SystemLog /var/log/ftp.syslog

#设置记录文件传输的日志文件:

TransferLog /var/log/ftp.transferlog

 

#针对匿名用户的配置信息

#设定登入账号的别名。将登录的 anonymous 账号转换为实际存在的 ftp 帐号,即可用 anonymous 方式登录

UserAlias anonymous ftp

 

#设置MySQL认证:

#数据库联接的信息,DatabaseName是数据库名, HostName是主机名,

#Port是端口号,UserName是连接数据库的用户名,Password是密码。

SQLConnectInfo DatabaseName@HostName:Port UserName Password

#例如SQLConnectInfo proftpd@localhost root 123456

#数据库认证的类型:

SQLAuthTypes Backend Plaintext

#指定用来做用户认证的表的有关信息。

SQLUserInfo FTPUSERS userid passwd uid gid home shell

#设置如果shell为空时允许用户登录:

RequireValidShell off

#数据库的鉴别,这里是用于用户的方式:

SQLAuthenticate users

#如果home目录不存在,则系统会为根据它的home项新建一个目录:

SQLHomedirOnDemand on


附录
四  其他相关配置

关于欢迎文件的设置包含如下参数

%T:目前的时间

%F:所在硬盘剩下的容量

%C:目前所在的目录

%R:Client端的主机名称

%L:Server端的主机名称

%U:使用者账户名称

%M:最大允许连接人数

%N:目前的服务器连接人数

%E:FTP服务器管理员的E-mail

%i:本次上传的文件数量。

%o:本次下载的文件数量

%t:本次上传和下载的文件数量

$ sudo vi /wwwroot/welcome.msg

欢迎您%U,这是Johnson的Web空间FTP服务器:

目前的时间是:%T;

本服务器最多允许%M个用户连接数;

目前服务器上已有%N个用户连接数;

目前你所在的目录是%C;

目录所在的硬盘还剩下字节%F;

附录四  proftpd的一些命令

1.       ftpshut:关闭FTP服务,并在/etc下生成文件shutmsg。要重新开放FTP服务,把/etc/shutmsg删除。

2.       ftpcout:FTP服务器在线人数信息显示。

3.       ftpwho:FTP服务器在线人员名单。

4.       ftptop:FTP服务器当前情况。

附录五  FTP 数字代码的意义

110 重新启动标记应答。

120 服务在多久时间内ready。

125 数据链路埠开启,准备传送。

150 文件状态正常,开启数据连接端口。

200 命令执行成功。

202 命令执行失败。

211 系统状态或是系统求助响应。

212 目录的状态。

213 文件的状态。

214 求助的讯息。

215 名称系统类型。

220 新的联机服务ready。

221 服务的控制连接埠关闭,可以注销。

225 数据连结开启,但无传输动作。

226 关闭数据连接端口,请求的文件操作成功。

227 进入passive mode。

230 使用者登入。

250 请求的文件操作完成。

257 显示目前的路径名称。

331 用户名称正确,需要密码。

332 登入时需要账号信息。

350 请求的操作需要进一部的命令。

421 无法提供服务,关闭控制连结。

425 无法开启数据链路。

426 关闭联机,终止传输。

450 请求的操作未执行。

451 命令终止:有本地的错误。

452 未执行命令:磁盘空间不足。

500 格式错误,无法识别命令。

501 参数语法错误。

502 命令执行失败。

503 命令顺序错误。

504 命令所接的参数不正确。

530 未登入。

532 储存文件需要账户登入。

550 未执行请求的操作。

551 请求的命令终止,类型未知。

552 请求的文件终止,储存位溢出。

553 未执行请求的的命令,名称不正确。


推荐阅读
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了通过mysql命令查看mysql的安装路径的方法,提供了相应的sql语句,并希望对读者有参考价值。 ... [详细]
  • yum安装_Redis —yum安装全过程
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Redis—yum安装全过程相关的知识,希望对你有一定的参考价值。访问https://redi ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
author-avatar
手机用户2502941011
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有