Centos7下关于系统用户密码规则-运维笔记
随着linux使用的普遍,对于linux用户以及系统的安全要求越来越高,而用户密码复杂程度是系统安全性高低的首要体现。因此如何对linux下用户的密码进行规则限制,以保证用户必须使用复杂的密码,杜绝用户随意使用简单的密码,从而提高用户的安全性和系统的安全性。下面以Centos7系统为例,出于安全考虑,对用户密码规则复杂度的设置进行梳理:
一、设置密码规则
1)密码长度、有效期
/etc/login.defs文件是当创建用户时的一些规划,比如创建用户时,是否需要家目录,UID和GID的范围;用户的期限等等,这个文件是可以通过root来定义的。
PASS_MAX_DAYS 90 —-两次改变密码之间相距的最大天数,密码有效最大天数
PASS_MIN_DAYS 6 —-两次改变密码之间相距的最小天数,为零时代表任何时候都可以更改密码
PASS_MIN_LEN 6 —-密码最小长度
PASS_WARN_AGE 30 —-在密码过期之前警告的天数 注意:以上只对之后新增的用户有效,如果要修改已存在的用户密码规则,需要使用chage命令
2)查看用户的密码规则
Last password change : Sep 11, 2018
Password expires : Sep 30, 2030
Password inactive : never
Account expires : never
Minimum number of days between password change : 6
Maximum number of days between password change : 90
Number of days of warning before password expires : 7 翻译过来:
最近一次密码修改时间 : 9月 11, 2018
密码过期时间 : 9月 30, 2030
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :6
两次改变密码之间相距的最大天数 :90
在密码过期之前警告的天数 :7 =============================================================
chage是用了修改账户有效期限的命令。
注意:不要用该命令给root用户加上有效期,如果密码过期,再加上后文说的/etc/shadow文件加锁禁止修改,会导致root提示修改密码,
无法成功修改密码,从而无法登陆。 如果要修改密码过期时间为"从不" 修改方法:
# chage -M 90 -m 6 -W 30 test
# chage -M 99999 kevin
# chage -l username 查看系统账户的当前设置
# chage -M 600 fzwb_word 修改fzwb_word账户密码的有效天数为600天。过了这个天数,账户密码无效
# chage -E "Jun 16, 2016" fzwb_word 设定fzwb_word账户的具体到期时间。过了这个日期,账户就无效。默认是never (fzwb_word为ftp的账户账户) 注意:
chage -M 针对的是账户密码过期时间。
chage -E 这个命令针对的是账户过期时间 设定账户过期时间,除了使用chage -E命令,还可以使用usermod -e命令
# usermod -e "Jun 16, 2016" fzwb_word 设定fzwb_word账户的具体到期时间。默认是never (fzwb_word为ftp的账户账户) 下面命令查看, fzwb_word 这个账户的时间到 2015 年 6 月 10 号就到期了!!
修改为 2016 月 6 月 16 号到期!
[root@kevin ~]# chage -l fzwb_word
Minimum: 0
Maximum: 99999
Warning: 7
Inactive: -1
Last Change: Jun 15, 2012
Password Expires: Never
Password Inactive: Never
Account Expires: Jun 10, 2015 [root@kevin ~]# usermod -e "Jun 16, 2016" fzwb_word
[root@kevin ~]# chage -l fzwb_word
Minimum: 0
Maximum: 99999
Warning: 7
Inactive: -1
Last Change: Jun 15, 2012
Password Expires: Never
Password Inactive: Never
Account Expires: Jun 16, 2016 --------------------------------------------------------------------------------
可以使用chage命令来手动修改账户的相关属性:
格式:chage [选项] 账户名 [选项]
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w:账户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:上一次更改的日期。
-i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:例出当前的设置。由非特权账户来确定他们的密码或帐号何时过期。 实例如下:
[root@kevin ~]# chage -l wangshibo
Last password change : Mar 09, 2017 //账户创建时间
Password expires : Aug 30, 2022 //账户密码过期时间
Password inactive : never
Account expires : never //账户过期时间
Minimum number of days between password change : 0
Maximum number of days between password change : 2000
Number of days of warning before password expires : 7 [root@kevin ~]# usermod -e "Jun 16, 2018" wangshibo [root@kevin ~]# chage -l wangshibo
Last password change : Mar 09, 2017
Password expires : Aug 30, 2022
Password inactive : never
Account expires : Jun 16, 2018
Minimum number of days between password change : 0
Maximum number of days between password change : 2000
Number of days of warning before password expires : 7 [root@kevin ~]# chage -M 20 wangshibo [root@kevin ~]# chage -l wangshibo
Last password change : Mar 09, 2017
Password expires : Mar 29, 2017
Password inactive : never
Account expires : Jun 16, 2018
Minimum number of days between password change : 0
Maximum number of days between password change : 20
Number of days of warning before password expires : 7 [root@kevin ~]# chage -E "Jun 2, 2020" wangshibo [root@kevin ~]# chage -l wangshibo
Last password change : Mar 09, 2017
Password expires : Mar 29, 2017
Password inactive : never
Account expires : Jun 02, 2020
Minimum number of days between password change : 0
Maximum number of days between password change : 20
Number of days of warning before password expires : 7
3) 设置密码过期的天数。 用户必须在几天内更改密码。 此设置仅在创建用户时才会产生影响,而不会影响到现有用户。 如果设置为现有用户,请运行命令"chage -M(days)(user)"
[root@kevin ~]# vim /etc/login.defs
# line 25: set 60 for Password Expiration
PASS_MAX_DAYS 60
4)设置可用密码的最短天数。 至少在改变它之后,用户必须至少使用他们的密码。 此设置仅在创建用户时才会产生影响,而不会影响到现有用户。 如果设置为现有用户,请运行命令"chage -m(days)(user)"
[root@kevin ~]# vim /etc/login.defs
# line 26: set 2 for Minimum number of days available
PASS_MIN_DAYS 2
5)在到期前设置警告的天数。 此设置仅在创建用户时才会产生影响,而不会影响到现有用户。 如果设置为存在用户,请运行命令"chage -W(days)(user)"
[root@kevin ~]# vim /etc/login.defs
# line 28: set 7 for number of days for warnings
PASS_WARN_AGE 7
6)5次更改密码不能有重复(即最近5次使用过的密码就不能再用作新密码了),并且每次修改密码都会将历史密码记录在/etc/security/opasswd文件中
[root@kevin ~]# vim /etc/pam.d/system-auth
# near line 15: prohibit to use the same password for 5 generation in past
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
7)设置最小密码长度。 用户不能将密码长度设置为小于此参数
[root@kevin ~]# authconfig --passminlen=8 --update
[root@kevin ~]# grep "^minlen" /etc/security/pwquality.conf
minlen = 8
8)为新密码设置所需的最少字符类数(种类⇒大写字母/小写字母/数字/特殊字符)
[root@kevin ~]# authconfig --passminclass=2 --update
[root@kevin ~]# grep "^minclass" /etc/security/pwquality.conf
minclass = 2
9)在新密码中设置允许的连续相同字符的最大数量
[root@kevin ~]# authconfig --passmaxrepeat=3 --update
[root@kevin ~]# grep "^maxrepeat" /etc/security/pwquality.conf
maxrepeat = 3
10)在新密码中设置同一类的最大允许连续字符数
[root@kevin ~]# authconfig --passmaxclassrepeat=4 --update
[root@kevin ~]# grep "^maxclassrepeat" /etc/security/pwquality.conf
maxclassrepeat = 4
11)新密码中至少需要一个小写字符
[root@kevin ~]# authconfig --enablereqlower --update
[root@kevin ~]# grep "^lcredit" /etc/security/pwquality.conf
lcredit = -1
12)新密码中至少需要一个大写字符
[root@kevin ~]# authconfig --enablerequpper --update
[root@kevin ~]# grep "^ucredit" /etc/security/pwquality.conf
ucredit = -1
13)新密码中至少需要一位数字
[root@kevin ~]# authconfig --enablereqdigit --update
[root@kevin ~]# grep "^dcredit" /etc/security/pwquality.conf
dcredit = -1
14)新密码中至少需要一个其他字符
[root@kevin ~]# authconfig --enablereqother --update
[root@kevin ~]# grep "^ocredit" /etc/security/pwquality.conf
ocredit = -1
15)在新密码中设置单调字符序列的最大长度(ex⇒’12345’,’fedcb’)
[root@kevin ~]# vim /etc/security/pwquality.conf
# add to the end
maxsequence = 3
16)设置旧密码中不能出现的新密码中的字符数
[root@kevin ~]# vim /etc/security/pwquality.conf
# add to the end
difok = 5
17)检查新密码中是否包含用户passwd项的GECOS字段中长度超过3个字符的单词
[root@kevin ~]# vim /etc/security/pwquality.conf
# add to the end
gecoscheck = 1
18)设置不能包含在密码中的Ssace分隔列表
[root@kevin ~]# vim /etc/security/pwquality.conf
# add to the end
badwords = denywords1 denywords2 denywords3
19)为新密码设置散列/密码算法。 (默认是sha512)
[root@kevin ~]# authconfig --test | grep hashing
password hashing algorithm is sha512 [root@kevin ~]# authconfig --passalgo=md5 --update
[root@kevin ~]# authconfig --test | grep hashing
password hashing algorithm is md5
二、账户锁定策略实现
策略要求如下:
- 设定锁定的阈值为5次
- 锁定时间为5分钟即300秒
- 必须所有用户都受限,包括root 1)修改配置文件/etc/pam.d/system-auth-ac,写入策略
[root@server ~]# vim /etc/pam.d/system-auth-ac
auth required pam_env.so
auth required pam_tally2.so even_deny_root deny=5 unlock_time=60
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so account required pam_unix.so
account required pam_tally2.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so 2)修改配置文件/etc/pam.d/password-auth-ac)
[[root@server ~]# vimm /etc/pam.d/password-auth-ac
auth required pam_env.so
auth required pam_tally2.so deny=5 unlock_time=60
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so account required pam_unix.so
account required pam_tally2.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so 3)查看用户锁定状态
[root@ server pam.d]# pam_tally2 -u wangshibo
Login Failures Latest failure From
wangshibo 7 12/20/16 14:02:55 192.168.10.86 4)解锁状态
[root@kevin ~]# pam_tally2 -r -u wangshibo
Login Failures Latest failure From
wangshibo 0
Centos6 系统密码策略
上面介绍的是Centos7系统下的用户密码策略,大多数也适用于Centos6系统,这里再补充下:
1)用户密码策略
Linux系统下的用户密码的有效期,是否可以修改密码可以通过login.defs文件控制。
[root@localhost ~]# cat /etc/login.defs|grep -v "^#"|grep -v "^$"
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
UID_MIN 500
UID_MAX 60000
GID_MIN 500
GID_MAX 60000
CREATE_HOME yes
UMASK 077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512 上述文件中的重要参数表示:
PASS_MAX_DAYS 99999 密码的最大有效期, 99999:永久有期
PASS_MIN_DAYS 0 是否可修改密码,0表示可修改,非0表示多少天后可修改
PASS_MIN_LEN 5 密码最小长度,但是使用pam_cracklib.so模块后,该参数不再有效(这个参考下面密码复杂度规则设定)
PASS_WARN_AGE 7 密码失效前多少天在用户登录时通知用户修改密码
2)用户密码复杂度规则设定,需要通过/etc/pam.d/system-auth文件实施(针对的是普通用户状态下修改密码会生效,root用户状态下无效),centos6中默认是通过pam_cracklib.so模块控制:
[root@localhost ~]# cat /etc/redhat-release
CentOS release 6.8 (Final) [root@localhost ~]# vim /etc/pam.d/system-auth
将文件中的下面两行:
password requisite pam_cracklib.so try_first_pass retry=3 type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
改为:
password requisite pam_cracklib.so try_first_pass retry=3 type= minlen=8 ucredit=-2 lcredit=-4 dcredit=-1 ocredit=-1
password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok remember=5 上面文件中参数分别说明设置密码的时候要遵循下面的规则:
retry=3 定义登录/修改密码失败时,可以重试的次数;
type=xxx 当添加/修改密码时,系统给出的缺省提示符是什么,用来修改缺省的密码提示文本。默认是不修改的,如上例。
minlen=8 定义用户密码的最小长度为8位
ucredit=-2 定义用户密码中最少有2个大写字母 (数字为负数,表示至少有多少个大写字母;数字为正数,表示至多有多少个大写字母;下面同理)
lcredit=-4 定义用户密码中最少有4个小写字母
dcredit=-1 定义用户密码中最少有1个数字
ocredit=-1 定义用户密码中最少有1个特殊字符(除数字、字母之外)
remember=5 修改用户密码时最近5次用过的旧密码就不能重用了
----------------------------------------------------------------------------
除了上面的几个参数,还可以设定下面的参数规则
difok=N 此选项用来规定新密码中必需有N个字符与旧密码不同。如果新密码中有1/2以上的字符与旧密码不同时,该新密码就会被接受。
difignore=N 此选项用来设定在difok之前收到多少个字符时,difok设置会被忽略,缺省为23。
minclass=N 此选项用来规定新密码中的字符类别的最小数目,字符一般有四种类别:数字、大写字母、小写字母,以及特殊字符。
温馨提示:login.defs文件和/etc/pam.d/system-auth文件的规则设置对非root用户起作用,在root用户下则不会生效!如果设置root用户密码过期时间等,需要用change命令进行设置。示例如下:
如下密码规则设置:
1)密码有效期是3个月。即用户创建180天后强制要求修改密码。
2)密码至少要过了5天后才能修改。
3)密码最小长度是12位
4)密码到期前的7天,用户登录时会提醒修改密码 5)密码输入时最多可允许尝试输入3次密码,3次不成功则退出密码输入界面。
6)新密码中至少包括大写字母2位、小写字母至少2位,数字至少2位,特殊字符至少2位
7)新密码中必须有4个字符与老密码不同
8)修改用户密码时最近3次用过的旧密码就不能重用了 则前4个密码规则的配置:
[root@localhost ~]# vim /etc/login.defs
......
PASS_MAX_DAYS 180
PASS_MIN_DAYS 5
PASS_MIN_LEN 12
PASS_WARN_AGE 7 后4个密码规则的配置:
[root@localhost ~]# vim /etc/pam.d/system-auth
......
password requisite pam_cracklib.so try_first_pass retry=3 type= minlen=12 ucredit=-2 lcredit=-2 dcredit=-2 ocredit=-2 difok=4
password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok remember=3
password required pam_deny.so 在root账号下修改密码,测试以上密码规则设置后是否有效?
如下操作,说明以上设置在root账号下无效
[root@localhost ~]# echo "123456"|passwd --stdin grace
Changing password for user grace.
passwd: all authentication tokens updated successfully. 那么切换到非root账号下修改密码试试?
[grace@localhost ~]$ passwd
Changing password for user grace.
Changing password for grace.
(current) UNIX password: #输入当前密码123456
New password: #设置新密码shibo@2018,不符合密码规则
BAD PASSWORD: is too simple
New password: #设置新密码kevin@201b,不符合密码规则
BAD PASSWORD: is too simple
New password: #设置新密码KeVI@2#8!w02,不符合密码规则
Retype new password:
passwd: all authentication tokens updated successfully. 说明以上的密码规则设置在非root用户下是生效的!!
3)Linux账户期限设定
Linux系统下可以使用chage命令是用来修改帐号和密码的有效期限。
需求场景:
公司给客户开的ftp账户用于下载报社新闻稿件。这个是付费的,账户有时间限制。若是合同到期了,客户想续约,就需要给这个ftp账户做延期。 注意下面修改账户有效期限的命令:
# chage -l username 查看系统账户的当前设置
# chage -M 600 fzwb_word 修改fzwb_word账户密码的有效天数为600天。过了这个天数,账户密码无效
# chage -E "Jun 16, 2016" fzwb_word 设定fzwb_word账户的具体到期时间。过了这个日期,账户就无效。默认是never (fzwb_word为ftp的账户账户) 注意:
chage -M 针对的是账户密码过期时间。
chage -E 这个命令针对的是账户过期时间 设定账户过期时间,除了使用chage -E命令,还可以使用usermod -e命令
# usermod -e "Jun 16, 2016" fzwb_word 设定fzwb_word账户的具体到期时间。默认是never (fzwb_word为ftp的账户账户) 下面命令查看, fzwb_word 这个账户的时间到 2015 年 6 月 10 号就到期了!!
修改为 2016 月 6 月 16 号到期!
[root@hlweb80 ~]# chage -l fzwb_word
Minimum: 0
Maximum: 99999
Warning: 7
Inactive: -1
Last Change: Jun 15, 2012
Password Expires: Never
Password Inactive: Never
Account Expires: Jun 10, 2015 [root@hlweb80 ~]# usermod -e "Jun 16, 2016" fzwb_word
[root@hlweb80 ~]# chage -l fzwb_word
Minimum: 0
Maximum: 99999
Warning: 7
Inactive: -1
Last Change: Jun 15, 2012
Password Expires: Never
Password Inactive: Never
Account Expires: Jun 16, 2016 --------------------------------------------------------------------------------
可以使用chage命令来手动修改账户的相关属性:
格式:chage [选项] 账户名 [选项]
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w:账户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:上一次更改的日期。
-i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:例出当前的设置。由非特权账户来确定他们的密码或帐号何时过期。 实例如下:
[root@localhost ~]# chage -l wangshibo
Last password change : Mar 09, 2017 //账户创建时间
Password expires : Aug 30, 2022 //账户密码过期时间
Password inactive : never
Account expires : never //账户过期时间
Minimum number of days between password change : 0
Maximum number of days between password change : 2000
Number of days of warning before password expires : 7 [root@localhost ~]# usermod -e "Jun 16, 2018" wangshibo [root@localhost ~]# chage -l wangshibo
Last password change : Mar 09, 2017
Password expires : Aug 30, 2022
Password inactive : never
Account expires : Jun 16, 2018
Minimum number of days between password change : 0
Maximum number of days between password change : 2000
Number of days of warning before password expires : 7 [root@localhost ~]# chage -M 20 wangshibo [root@localhost ~]# chage -l wangshibo
Last password change : Mar 09, 2017
Password expires : Mar 29, 2017
Password inactive : never
Account expires : Jun 16, 2018
Minimum number of days between password change : 0
Maximum number of days between password change : 20
Number of days of warning before password expires : 7 [root@localhost ~]# chage -E "Jun 2, 2020" wangshibo [root@localhost ~]# chage -l wangshibo
Last password change : Mar 09, 2017
Password expires : Mar 29, 2017
Password inactive : never
Account expires : Jun 02, 2020
Minimum number of days between password change : 0
Maximum number of days between password change : 20
Number of days of warning before password expires : 7
Centos7下关于系统用户密码规则-运维笔记的更多相关文章
- Centos6下关于系统用户密码规则-运维笔记
随着linux使用的普遍,对于linux用户以及系统的安全要求越来越高,而用户密码复杂程度是系统安全性高低的首要体现.因此如何对linux下用户的密码进行规则限制,以保证用户必须使用复杂的密码,杜绝用 ...
- Linux下Apache(HTTP)基础知识梳理-运维笔记
HTTP介绍: HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传 ...
- CentOS7 下使用root免密码输入自动登入gnome桌面
如果系统默认启动图形界面: vi /etc/gdm/custom.conf #找到[daemon],修改为下面的 [daemon] AutomaticLoginEnable=true Automati ...
- 重设windows10中的sub linux系统用户密码
原文:重设windows10中的sub linux系统用户密码 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/haiyoung/article/detai ...
- Windows下GIT的用户密码修改
Windows下GIT的用户密码修改
- linux设置系统用户密码
目录 一:系统用户密码 1.设置用户密码 一:系统用户密码 1.设置用户密码 1.交互式方法 passwd [用户名] 2.免交互式 echo [设置密码] | passwd --stdin [用户名 ...
- Linux系统运维笔记(四),CentOS 6.4安装 MongoDB
Linux系统运维笔记(四),CentOS 6.4安装 MongoDB 1,下载 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6 ...
- centos 7 查看系统/硬件信息及运维常用命令+联想Y430P无线网卡驱动安装
centos 7 查看系统/硬件信息及运维常用命令 当前环境:联想Y430P CentOS 7.3 [root@yan-001 ~] # uname -a # 查看内核/操作系统/CPU信息的Li ...
- Linux系统运维笔记(五),CentOS 6.4安装java程序
Linux系统运维笔记(五),CentOS 6.4安装java程序 用eclipse编译通的java程序,现需要实施到服务器.实施步骤: 一,导出程序成jar包. 1,在主类编辑界面点右健,选 ru ...
随机推荐
- asp.net mvc5中的过滤器重写
asp.net mvc5中增加了一种过滤器类型叫过滤器重写,这种过滤器类型可以在操作或者控制器上忽略更高层次上设置的过滤器类型,它可以重写五种基本的过滤器接口类型:IAuthenticationFil ...
- 洗礼灵魂,修炼python(36)--面向对象编程(6)—类的相关内置函数issubclass,hasattr等
啥?我靠,类也有内置函数?哈哈,确实有的.有哪些呢?请往下看 issubclass(cls, class_or_tuple, /) 1.基本属性: 方法全是特殊方法 2.使用方法:判断一个类是否由另一 ...
- 合理配置SQLSERVER内存
合理配置SQLSERVER内存 原文地址:https://www.cnblogs.com/lyhabc/archive/2012/09/28/2707857.html SQLSERVER是个很喜欢内存 ...
- scrapy爬取校花网男神图片保存到本地
爬虫四部曲,本人按自己的步骤来写,可能有很多漏洞,望各位大神指点指点 1.创建项目 scrapy startproject xiaohuawang scrapy.cfg: 项目的配置文件xiaohua ...
- 国内常用的几个NTP时间服务器
问题描述: 经常Windows或者Linux系统上面的时间跟我们本地的时间不一致 有时候就是Windows的Internet时间设置里面的Windows自带的时间同步服务器不好使 Linux配置NTP ...
- HTTP数据组织方式
HTTP网络传输中的数据组织方式有三种方式: 1.HTML方式 2.XML方式 3.JSON方式 XML介绍:XML称为可扩展标记语言,它与HTML一样,都是SGML(标准通用标记语言) XM ...
- File类_构造函数
File类:用来将文件或者文件夹封装成对象方便对文件或或文件夹的属性信息进行操作File对象可以作为参数传递给流的构造函数 import java.io.File; public class File ...
- IO流_演示键盘录入
读取一个键盘录入的数据,打印到控制台上 键盘本身就是一个标准的输入设备,对于java而言,对于这种输入设备都有相应的对象在System类中 import java.io.IOException; im ...
- 整数划分 NBUT - 1046
题目很简单,把一个正整数分割成N个正整数之和.但是你得把所有的划分方法列出来,以字典序升序排序.对于每种划分方法,小的数字在前面. 思路:直接深度优先搜索,注意要判断前一位一定会比将要放入答案的因子小 ...
- php单例模式实现对象只被创建一次
这是我在php面试题中遇到的一道试题,单例模式按字面来看就是某一个类只有一个实例,这样做的好处还是很大的,比如说数据库的连接,我们只需要实例化一次,不需要每次都去new了,这样极大的降低了资源的耗费. ...