PHP是一种开源服务器端脚本语言,应用很广泛。Apache web服务器提供了这种便利:通过HTTP或HTTPS协议,
访问文件和内容。配置不当的服务器端脚本语言会带来各种各样的问题。所以,使用PHP时要小心。以下是25个
PHP安全方面的最佳实践,可供系统管理员们安全地配置PHP。
为PHP安全提示而提供的示例环境
•文件根目录(DocumentRoot):/var/www/html
•默认的Web服务器:Apache(可以使用Lighttpd或Nginx来取代Apache)
•默认的PHP配置文件:/etc/php.ini
•默认的PHP加载模块配置目录:/etc/php.d/
•我们的示例php安全配置文件:/etc/php.d/security.ini(需要使用文本编辑器来创建该文件)
•操作系统:RHEL/CentOS/Fedora Linux(相关指令应该与Debian/Ubuntu等其他任何Linux发行版或者
OpenBSD/FreeBSD/HP-UX等其他类似Unix的操作系统兼容)。
•默认的php服务器TCP/UDP端口:无
为本文所列的大多数操作编写代码时,假定它们将由运行bash外壳程序或其他任何现代外壳程序的根用户来执行:
$ php -v
示例输出:
PHP 5.3.3 (cli) (built: Oct 24 2011 08:35:41) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
出于演示的用途,我会使用以下操作系统:
$ cat /etc/redhat-release
示例输出:
Red Hat Enterprise Linux Server release 6.1 (Santiago)
第1个最佳实践:了解你的对手
基于PHP的应用程序面临不同类型的攻击。我注意到了几种不同类型的攻击:
1. XSS:跨站脚本是Web PHP应用程序中的一种安全漏洞,攻击者可以利用该漏洞来窃取用户的信息。
你可以配置Apache,编写更安全的PHP脚本(验证所有的用户输入),以避免XSS攻击。
2. SQL注入攻击:这是PHP应用程序的数据库层中的安全漏洞。用户输入不正确地过滤时,应用程序就
能执行任何SQL语句。你可以配置Apache,编写安全代码(验证和转换所有的用户输入),以避免
SQL注入攻击。PHP中的一个常见做法是,在发送SQL查询之前,使用名为mysql_real_escape_string()的函数,转换参数。
3. 文件上传:它让访客可以将文件放在(将文件上传到)你的服务器上。这会带来众多安全问题,比如
删除你的文件、删除数据库、获取用户详细资料,不一而足。你可以使用php来禁用文件上传,或编写安
全代码(比如验证用户输入,只允许PNG或GIF等图像文件类型)。
4. 添加本地和远程文件:攻击者可以从远程服务器打开文件,执行任何PHP代码。这让他们得以上传
文件、删除文件和安装后门。可以配置php以禁用远程文件执行功能。
5. eval() :将字符串作为PHP代码来进行评估。攻击者常常利用该函数来隐藏其在服务器本身上面的
代码和工具。你可以配置PHP,禁用eval()。
6. sea-surf攻击(跨站请求伪造,CSRF):这种攻击迫使最终用户针对目前已验证其身份的Web应
用程序执行有害的操作。如果是平常的用户,得逞的CSRF攻击会危及最终用户的数据和操作。但如
果被盯上的最终用户使用管理员帐户,这会危及整个Web应用程序。
第2个最佳实践:查找内置的PHP模块
想查看一组编译进去的PHP模块,请输入以下命令:
# php -m
示例输出:
[PHP模块]
apcbcmathbz2calendarCorectypecurldatedomeregexiffileinfofilterftpgdgettextgmphashiconvimapjsonlibxmlmbstringmemcachemysqlmysqliopensslpcntlpcrePDOpdo_mysqlpdo_sqlitePharreadlineReflectionsessionshmopSimpleXMLsocketsSPLsqlite3standardsuhosintokenizerwddxxmlxmlreaderxmlrpcxmlwriterxslzipzlib
[Zend模块]
Suhosin
我建议你使用模块数量减少的PHP,以增强性能和安全。比如说,你可以通过删除(移除)配
置文件或者更名(或移动)一个名为/etc/php.d/sqlite3.ini的文件来禁用sqlite3模块,操作如下:
# rm /etc/php.d/sqlite3.ini
或者
# mv /etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disable
其他编译进去的模块只能通过重新安装精简配置的PHP来移除。可以从php.net下载php源代码
,然后按以下方法编译它,支持GD、fastcgi和MySQL:
./configure --with-libdir=lib64 --with-gd --with-mysql --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/usr/com --mandir=/usr/share/man --infodir=/usr/share/info --cache-file=../config.cache --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --enable-fastcgi --enable-force-cgi-redirect
参阅如何编译php,并重新安装到类似Unix的操作系统上( http://www.php.net/manual/en/install.unix.php)
,以了解更多信息。
第3个最佳实践:限制PHP信息泄露
要限制PHP信息泄露,就要禁用expose_php。编辑/etc/php.d/secutity.ini,执行以下指令:
expose_php=Off
启用后,expose_php向外界报告PHP安装在服务器上,这包括HTTP头里面的PHP版本
(如X-Powered-By: PHP/5.3.3)。PHP标识的全局唯一标识符(GUID,见示例
http://www.php.net/?=PHPE9568F34-D428-11d2-A769-00AA001ACF42)也显示出来,
因而将它们添加到支持PHP的网站的URL后面,就会显示相应标识。expose_php启用后,
你可以使用以下命令,查看PHP版本:
$ curl -I http://www.cyberciti.biz/index.php
示例输出:
HTTP/1.1 200 OK X-Powered-By: PHP/5.3.3 Content-type: text/html; charset=UTF-8 Vary: Accept-Encoding, Cookie X-Vary-Options: Accept-Encoding;list-contains=gzip,Cookie;string-contains=wikiToken;string-contains=wikiLoggedOut;string-contains=wiki_session Last-Modified: Thu, 03 Nov 2011 22:32:55 GMT ...
我还建议,你应在httpd.conf中执行ServerTokens和ServerSignature命令,隐藏Apache
版本及其他信息( http://www.cyberciti.biz/faq/rhel-centos-hide-httpd-version/)。
第4个最佳实践:尽量减少可装入的PHP模块(动态加载模块)
PHP支持“动态加载模块”(Dynamic Extensions)。默认情况下,RHEL装入/etc/php.d/
目录里面的所有加载模块。要启用或禁用某一个模块,只要在/etc/php.d/目录中找到配置文件
、为模块名称添加注释。你还可以更名或删除模块配置文件。想获得最佳的PHP性能和安全,
你应该只启用Web应用程序需要的加载模块。比如说,要禁用gd加载模块,输入以下命令:
# cd /etc/php.d/# mv gd.{ini,disable}# /sbin/service httpd restart
要启用名为gd的php模块,请输入:
# mv gd.{disable,ini}# /sbin/service httpd restart
第5个最佳实践:将所有PHP错误记入日志
别让PHP错误信息暴露在网站的所有访客面前。编辑/etc/php.d/security.ini,执行以下指令:
display_errors=Off
确保你将所有PHP错误记入到日志文件中(http://www.cyberciti.biz/tips/php-howto-turn-on-error-log-file.html):
log_errors=Onerror_log=/var/log/httpd/php_scripts_error.log
第6个最佳实践:不允许上传文件
出于安全原因,编辑/etc/php.d/security.ini,执行以下命令:
file_uploads=Off
如果使用你应用程序的用户需要上传文件,只要设置upload_max_filesize(http://www.cyberciti.biz/faq/linux-unix-apache-increase-php-upload-limit/),即可启用该功能,该设置限制了PHP允许通过上传的文件的最大值:
file_uploads=On
# 用户通过PHP上传的文件最大1MB
upload_max_filesize=1M
第7个最佳实践:关闭远程代码执行
如果启用,allow_url_fopen允许PHP的文件函数——如file_get_contents()、include语句和require语句——可以从远程地方(如FTP或网站)获取数据。
allow_url_fopen选项允许PHP的文件函数——如file_get_contents()、include语句和require语句——可以使用FTP或HTTP协议,从远程地方获取数据。编程员们常常忘了这一点,将用户提供的数据传送给这些函数时,没有进行适当的输入过滤,因而给代码注入安全漏洞留下了隐患。基于PHP的Web应用程序中存在的众多代码注入安全漏洞是由启用allow_url_fopen和糟糕的输入过滤共同引起的。编辑/etc/php.d/security.ini,执行以下指令:
allow_url_fopen=Off
出于安全原因,我还建议禁用allow_url_include:
allow_url_include=Off
第8个最佳实践:启用SQL安全模式
编辑/etc/php.d/security.ini,执行以下指令:
sql.safe_mode=On
如果启用,mysql_connect()和mysql_pconnect()就忽视传送给它们的任何变量。请注意:你可能得对自己的代码作一些更改。sql.safe_mode启用后,第三方开源应用程序(如WorkdPress)及其他应用程序可能根本运行不了。我还建议你针对所有安装的php 5.3.x关闭magic_quotes_gpc(http://php.net/manual/en/security.magicquotes.php),因为它的过滤并不有效、不是很可靠。mysql_escape_string()和自定义过滤函数能起到更好的作用(向Eric Hansen致谢,https://www.facebook.com/EricHansen.SFU):
magic_quotes_gpc=Off
第9个最佳实践:控制POST请求的大小
作为请求的一部分,客户机(浏览器或用户)需要将数据发送到Apache Web服务器时,比如上传文件或提交填好的表单时,就要用到HTTP POST请求方法。攻击者可能会企图发送过大的POST请求,大量消耗你的系统资源。你可以限制PHP将处理的POST请求的最大大小。编辑/etc/php.d/security.ini,执行以下命令:
; 在此设置实际可行的值
post_max_size=1K
1K设置了php应用程序允许的POST请求数据的最大大小。该设置还影响文件上传。要上传大容量文件,这个值必须大于upload_max_filesize。我还建议你限制使用Apache Web服务器的可用方法。编辑httpd.conf,执行针对文件根目录/var/www/html的以下指令:
<Directory /var/www/html> <LimitExcept GET POST> Order allow,deny </LimitExcept>
1.
## 可在此添加配置的其余部分... ##
</Directory>
第10个最佳实践:资源控制(拒绝服务控制)
你可以设置每个php脚本的最长执行时间,以秒为单位。另一个建议的选项是设置每个脚本可能用于解析请求数据的最长时间,以及脚本可能耗用的最大内存数量。编辑/etc/php.d/security.ini,执行以下命令:
# 设置,以秒为单位
max_execution_time = 30max_input_time = 30memory_limit = 40M
第11个最佳实践:为PHP安装Suhosin高级保护系统
来自Suhosin项目网页(http://www.hardened-php.net/suhosin/):
Suhosin是一款高级的保护系统,面向安装的PHP。它旨在保护服务器和用户,远离PHP应用程序和PHP核心中的已知缺陷和未知缺陷。Suhosin分两个独立部分,可以单独使用,也可以组合使用。第一个部分是针对PHP核心的小补丁,实施了几个低级防护措施,以防范缓冲器溢出或格式字符串安全漏洞;第二个部分是功能强大的PHP加载模块,实施了其他所有的保护措施。
看看如何在Linux操作系统下安装和配置suhosin( http://www.cyberciti.biz/faq/rhel-linux-install-suhosin-php-protection/)。
第12个最佳实践:禁用危险的PHP函数
PHP有许多函数,如果使用不当,它们可以用来闯入你的服务器。你可以使用disable_functions命令,在/etc/php.d/security.ini中禁用一系列函数:
disable_functions=exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
第13个最佳实践:PHP Fastcgi/CGI - cgi.force_redirect命令
PHP可与FastCGI协同工作。 Fascgi减少了Web服务器占用的内存资源,但是仍为你提供了整个PHP语言具有的速度和功能。你可以配置Apache2+PHP+FastCGI或cgi,如这里描述的那样。配置命令cgi.force_redirect可以防止任何人使用http://www.cyberciti.biz/cgi-bin/php/hackerdir/backdoor.php这样的地址,直接调用PHP。出于安全原因,应启用cgi.force_redirect。编辑/etc/php.d/security.ini,执行以下命令:
; 出于安全原因,在典型的*Apache+PHP-CGI/FastCGI*环境中,启用cgi.force_redirect
cgi.force_redirect=On
第14个最佳实践:PHP用户和用户组ID
mod_fastcgi是面向Apache Web服务器的cgi模块。它可以连接至外部的FASTCGI服务器。你要确保PHP以非根目录用户的身份来运行。如果PHP以根目录或100以下UID的身份来运行,它可以访问及/或处理系统文件。你必须使用Apache的suEXEC或mod_suPHP,以非特权用户的身份来执行PHP CGI。suEXEC功能让Apache用户们能够以有别于调用Web服务器的用户ID的用户ID来运行CGI程序。在该示例中,我的php-cgi以phpcgi用户的身份来运行,Apache以apache用户的身份来运行:
# ps aux | grep php-cgi
示例输出:
phpcgi 6012 0.0 0.4 225036 60140 ? S Nov22 0:12 /usr/bin/php-cgiphpcgi 6054 0.0 0.5 229928 62820 ? S Nov22 0:11 /usr/bin/php-cgiphpcgi 6055 0.1 0.4 224944 53260 ? S Nov22 0:18 /usr/bin/php-cgiphpcgi 6085 0.0 0.4 224680 56948 ? S Nov22 0:11 /usr/bin/php-cgiphpcgi 6103 0.0 0.4 224564 57956 ? S Nov22 0:11 /usr/bin/php-cgiphpcgi 6815 0.4 0.5 228556 61220 ? S 00:52 0:19 /usr/bin/php-cgiphpcgi 6821 0.3 0.5 228008 61252 ? S 00:55 0:12 /usr/bin/php-cgiphpcgi 6823 0.3 0.4 225536 58536 ? S 00:57 0:13 /usr/bin/php-cgi
1.
你可以使用spawn-fcgi等工具,以phpcgi用户的身份(先要为系统添加phpcgi用户)来创建远程和本地FastCGI进程:
# spawn-fcgi -a 127.0.0.1 -p 9000 -u phpcgi -g phpcgi -f /usr/bin/php-cgi
现在,你可以配置Apache、Lighttpd和Nginx web服务器了,使用在127.0.0.1 IP地址处端口9000上运行的php FastCGI。
第15个最佳实践:限制PHP对文件系统的访问
open_basedir命令设置了允许PHP使用fopen()和其他函数来访问哪些目录的文件。如果文件在open_basdir定义的路径外面,PHP就拒绝打开该文件。你无法使用符号链接作为变通办法。比如说,只允许访问/var/www/html目录、不允许访问/var/www、/tmp或/etc目录:
限制PHP进程访问/var/www/html/等专门指定的目录外面的文件
; Limits the PHP process from accessing files outside; of specifically designated directories such as /var/www/html/open_basedir="/var/www/html/"; ------------------------------------; Multiple dirs example; open_basedir="/home/httpd/vhost/cyberciti.biz/html/:/home/httpd/vhost/nixcraft.com/html/:/home/httpd/vhost/theos.in/html/"; ------------------------------------
第16个最佳实践:会话路径
PHP中的会话支持包括在随后的访问中保留某些数据的一种方法。这让你能够开发更加定制的应用程序,并加大网站的吸引力。该路径在/etc/php.ini文件中定义,与某一个会话有关的所有数据都将存放在session.save_path选项指定的目录下的文件中。在RHEL/CentOS/Fedora Linux下,默认路径如下:
session.save_path="/var/lib/php/session"
;设置用于上传文件时存储文件的临时目录
upload_tmp_dir="/var/lib/php/session"
确保路径是outside /var/www/html,而且无法被其他任何系统用户读取或写入:
# ls -Z /var/lib/php/
示例输出:
drwxrwx---. root apache system_u:object_r:httpd_var_run_t:s0 session
注意:ls命令的-Z选项显示了SELinux 安全上下文,比如文件模块、用户、用户组、安全上下文和文件名称。
第17个最佳实践:保持PHP、软件和操作系统版本最新
打安全补丁是维护Linux、Apache、PHP和MySQL服务器的一个重要环节。应该使用以下其中任何一个工具(如果你通过软件包管理器来安装PHP),尽快检查所有的PHP安全更新版本,并尽快打上:
# yum update
或
# apt-get update && apt-get upgrade
你可以配置红帽/CentOS/Fedora Linux,以便通过电子邮件发送yum软件包更新通知。另一个选项是通过cron job(计划任务)打上所有的安全更新版。在Debian/Ubuntu Linux下,可以使用apticron来发送安全通知。
注意:经常访问php.net(http://php.net/),寻找源代码安装的最新版本。
第18个最佳实践:限制文件和目录访问
确保你以Apache或www等非根用户的身份来运行Apache。所有文件和目录都应该归非根用户(或apache用户)所有,放在/var/www/html下:
# chown -R apache:apache /var/www/html/
/var/www/html/是个子目录,这是其他用户可以修改的文件根目录,因为根目录从来不在那里执行任何文件,也不会在那里创建文件。
确保在/var/www/html/下,文件权限设成了0444(只读):
# chmod -R 0444 /var/www/html/
确保在/var/www/html/下,所有目录权限设成了0445:
# find /var/www/html/ -type d -print0 | xargs -0 -I {} chmod 0445 {}
关于设置合适文件权限的补充
chown和chmod命令确保:不管在什么情况下,文件根目录或文件根目录里面的文件都可以被Web服务器用户apache写入。请注意:你需要设置对你网站的开发模型最合理的权限,所以可以根据自身需要,随意调整chown和chmod命令。在这个示例中,Apache服务器以apache用户的身份来运行。这可以在你的httpd.conf文件中用User和Group命令来配置。apache用户需要对文件根目录下的所有内容享有读取访问权,但是不应该享有写入访问权。
确保httpd.conf有以下命令,实现限制性配置:
<Directory / > Options None AllowOverride None Order allow,deny</Directory>
1.
你只要在需要时才应该授予写入访问权。WordPress等一些Web应用程序及其他应用程序可能需要缓存目录。你可以使用以下命令,授予写入到缓冲目录的访问权:
# chmod a+w /var/www/html/blog/wp-content/cache### block access to all #### echo 'deny from all' > /var/www/html/blog/wp-content/cache/.htaccess
第19个最佳实践:写保护Apache、PHP和MySQL配置文件
使用chattr命令来写保护配置文件:
# chattr +i /etc/php.ini# chattr +i /etc/php.d/*# chattr +i /etc/my.ini# chattr +i /etc/httpd/conf/httpd.conf# chattr +i /etc/
chattr命令还可以写保护/var/www/html目录中的一个php文件或多个文件:
# chattr +i /var/www/html/file1.php# chattr +i /var/www/html/
第20个最佳实践:使用Linux安全加载模块(如SELinux)
Linux自带各种安全补丁,可以用来防护配置不当或受到危及的服务器程序。可能的话,使用SELinux及其他Linux安全加载模块,对网络及其他程序实行限制。比如说,SELinux为Linux内核和Apache Web服务器提供了众多安全策略。要列出所有的Apache SELinux保护变量,请输入:
# getsebool -a | grep httpd
示例输出:
allow_httpd_anon_write --> offallow_httpd_mod_auth_ntlm_winbind --> offallow_httpd_mod_auth_pam --> offallow_httpd_sys_script_anon_write --> offhttpd_builtin_scripting --> onhttpd_can_check_spam --> offhttpd_can_network_connect --> offhttpd_can_network_connect_cobbler --> offhttpd_can_network_connect_db --> offhttpd_can_network_memcache --> offhttpd_can_network_relay --> offhttpd_can_sendmail --> offhttpd_dbus_avahi --> onhttpd_enable_cgi --> onhttpd_enable_ftp_server --> offhttpd_enable_homedirs --> offhttpd_execmem --> offhttpd_read_user_content --> offhttpd_setrlimit --> offhttpd_ssi_exec --> offhttpd_tmp_exec --> offhttpd_tty_comm --> onhttpd_unified --> onhttpd_use_cifs --> offhttpd_use_gpg --> offhttpd_use_nfs --> off
要禁用Apache cgi支持,请输入:
# setsebool -P httpd_enable_cgi off
参阅红帽SELinux指南(http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/index.html),即可了解更多信息。
第21个最佳实践:安装Mod_security
ModSecurity是一个保护Web应用程序的开源入侵检测和预防引擎。你在Linux下很容易安装mod_security,安装后就能保护基于Apache和PHP的应用程序,远离XSS及其他各种攻击:
##几个实例##
#不允许打开/etc/中的文件
SecFilter /etc/
#阻止SQL注入攻击
SecFilter "delete[[:space:]]+from"SecFilter "select.+from"
第22个最佳实践:尽可能在chroot jail环境中运行Apache / PHP
将PHP及/或Apache放在chroot jail环境中可以尽量减小潜在的入侵事件造成的破坏,因为它将Web服务器隔离到文件系统的一小部分。你可以使用Apache自带的那种传统的chroot jail环境。不过建议使用FreeBSD jail、运用容器概念的XEN虚拟化、KVM虚拟化或OpenVZ虚拟化。
第23个最佳实践:使用防火墙限制出站连接
攻击者会使用wget之类的工具,将文件本地下载到你的Web服务器上。你可以使用iptables阻止apache用户的出站连接。ipt_owner模块会试图比对本地创建的数据包与数据包创建者的各个特点。它只有在OUTPUT链中才有效。在这个示例中,允许vivek用户使用端口80连接外界(这适用于RHN或centos repo访问)。
/sbin/iptables -A OUTPUT -o eth0 -m owner --uid-owner vivek -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
1.
下面是另一个示例,阻止apache用户的所有出站连接(通向我们自己的smtp服务器的出站连接除外),以及垃圾邮件验证API服务:
# ..../sbin/iptables --new-chain apache_user/sbin/iptables --append OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT/sbin/iptables --append OUTPUT -m owner --uid-owner apache -j apache_user# allow apache user to connec to our smtp server/sbin/iptables --append apache_user -p tcp --syn -d 192.168.1.100 --dport 25 -j RETURN# Allow apache user to connec to api server for spam validation/sbin/iptables --append apache_user -p tcp --syn -d 66.135.58.62 --dport 80 -j RETURN/sbin/iptables --append apache_user -p tcp --syn -d 66.135.58.61 --dport 80 -j RETURN/sbin/iptables --append apache_user -p tcp --syn -d 72.233.69.89 --dport 80 -j RETURN/sbin/iptables --append apache_user -p tcp --syn -d 72.233.69.88 --dport 80 -j RETURN########################### Add more rules here ############################ No editing below# Drop everything for apache outgoing connection/sbin/iptables --append apache_user -j REJECT
第24个最佳实践:关注日志和审查
检查apache日志文件:
# tail -f /var/log/httpd/error_log# grep 'login.php' /var/log/httpd/error_log# egrep -i "denied|error|warn" /var/log/httpd/error_log
检查php日志文件:
# tail -f /var/log/httpd/php_scripts_error.log# grep "...etc/passwd" /var/log/httpd/php_scripts_error.log
日志文件让你对于服务器遭到什么攻击有所了解,并让你可以检查必要的安全级别有没有落实到位。
提供了用于系统审查的auditd服务。启用该服务,就可以审查SELinux事件、验证事件、文件修改和
帐户修改等。我还建议使用标准的Linux系统监测工具
( http://www.cyberciti.biz/tips/top-linux-monitoring-tools.html),用于监测你的Web服务器。
第25个最佳实践:按照系统或虚拟机实例来运行服务
对于安装的大型系统来说,建议你借助不同的服务器运行数据库、静态内容和动态内容。
(图1:在不同的服务器上运行服务)
在不同的服务器或虚拟机实例上运行不同的网络服务。这限制了可能受到危及的其他服务的数量。
比如说,如果攻击者成功地利用了Apache flow等软件的漏洞,就能访问整个服务器,包括在同一
台服务器上运行的其他服务(比如MySQL和电子邮件服务等)。但是在上述例子中,按以下方式提供不同内容:
1. static.lan.cyberciti.biz:使用lighttpd或nginx服务器,用于提供js/css/images等静态资产。
2. phpcgi1.lan.cyberciti.biz和phpcgi2.lan.cyberciti.biz:Apache web服务器,php用于生成动态内容。
3. mysql1.lan.cyberciti.biz:MySQL数据库服务器。
4. mcache1.lan.cyberciti.biz:Memcached服务器是用于MySQL的速度非常快的缓存系统。它使用
libevent或epoll(Linux运行时环境),可以扩展至任何数量的打开的连接,并使用非阻塞的网络输入/输出。
5. LB01:放在Apache Web服务器前面的nginx Web服务器和反向代理服务器。 从互联网进入到其中
一台Web服务器的所有连接均通过nginx代理服务器来传送,该代理服务器可以本身处理请求,也可以将
请求全部或部分传送到主Web服务器。LB01提供了简单的负载均衡机制。
第26个最佳实践:其他工具
来自PHPIDS项目网页(https://phpids.org/):
PHPIDS(PHP入侵检测系统)是面向基于PHP的web应用程序的安全层,具有使用简单、结构
良好、运行快捷、技术先进等优点。IDS无法清除、净化或过滤任何恶意输入内容,仅仅识别攻
击者何时企图闯入你的网站,安全按照你希望它采取的措施来采取相应措施。
你可以使用PHPIDS来检测恶意用户,并记录检测出来的任何攻击,方便以后分析。请注意:我个
人没有用过这款工具。
来自PhpSecInfo项目网页(http://phpsec.org/projects/phpsecinfo/index.html):
PhpSecInfo提供了与phpinfo()函数相对应的机制,可报告关于PHP环境的安全信息,并提供改进
的建议。它无法取代安全开发技巧,也不进行任何一种代码或应用程序审查,却是多层次安全方案
中的一个实用工具。
图2:关于PHP应用程序的安全信息
参阅Linux安全加固要点(http://www.cyberciti.biz/tips/linux-security.html),减少系统面临的攻击途径数量。
关于PHP后门的补充
你可能碰到过PHP脚本或所谓的常见后门,比如c99、c99madshell和r57等。后门php脚本其实就
是一段隐藏的脚本,用于绕开所有的验证机制,根据需要访问你的服务器。攻击者安装它的目的
是,访问你的服务器,同时又企图不被发现。误用的PHP脚本(或其他任何CGI脚本)通常允许
添加钻Web浏览器中安全漏洞空子的代码。攻击者可以使用这种被钻空子的安全漏洞,上传后门
外壳程序,从而让攻击者能够获得许多功能,比如:
•下载文件
•上传文件
•安装rootkit
•设置垃圾邮件服务器/中继服务器
•设置代理服务器,隐匿行踪
•控制服务器
•控制数据库服务器
•窃取所有信息
•删除所有信息和数据库
•打开TCP/UDP端口及更多端口
要点:该如何找出PHP后门?
可以使用Unix/Linux grep命令,搜索c99或r57外壳:
# grep -iR 'c99' /var/www/html/ # grep -iR 'r57' /var/www/html/ # find /var/www/html/ -name \*.php -type f -print0 | xargs -0 grep c99 # grep -RPn "(passthru|shell_exec|system|base64_decode|fopen|fclose|eval)" /var/www/html/
结束语
你基于PHP的服务器现在经过了适当的加固,可以准备显示动态网页了。不过,安全漏洞主要是
因没有遵守堪称最佳实践的编程规则而引起的。为了满足在web应用程序安全方面的要求,
你应该查阅更多资源,特别是PHP编程知识,尽管这超出了系统管理员的工作范畴。
--
- php开发
- 常用技巧
- 字符数组对象
- php换行替换,PHP替换回车换行符的三种方法
- PHP 数组转字符串,与字符串转数组
- php将img中的宽高删除,PHP删除HTML中宽高样式的详解
- php去除换行(回车换行)的三种方法
- php 过滤word 样式
- php如何设置随机数
- 2个比较经典的PHP加密解密函数分享
- php怎么去除小数点后多余的0
- php中判断是一维数组还是二维数组的解决方案
- php 获取数组中出现次数最多的值(重复最多的值)与出现的次数
- PHP过滤掉换行符、特殊空格、制表符等
- PHP中json_endoce转义反斜杠的问题
- PHP过滤Emoji表情和特殊符号的方法
- PHP完美的提取链接正则
- php很牛的图片采集
- 日期处理
- php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法非常简单
- PHP指定时间戳/日期加一天,一年,一周,一月
- 使用php 获取时间今天明天昨天时间戳的详解
- php获得当月的节假日函数(包含周末,年度节假日)
- PHP获取本月起始和截止时间戳
- php 获取每月开始结束时间,php 获取指定月份的开始结束时间戳
- PHP获取今天,昨天,本月,上个月,本年 起始时间戳
- php、mysql查询当天,本周,本月的用法
- php获取两个时间戳之间相隔多少天多少小时多少分多少秒
- 毫秒级时间戳和日期格式转换
- php-倒计时
- 请求提交上传
- php+put+post,Curl和PHP-如何通过PUT,POST,GET通过curl传递json
- PHP put提交和获取数据
- PHP curl put方式上传文件
- 数据导入导出
- PHP快速导入大量数据到数据库的方法
- PHP快速导出百万级数据到CSV或者EXCEL文件
- PHP解析大型Excel表格的库:box/spout
- PHP导入(百万级)Excel表格数据
- PHP如何切割excel大文件
- 使用 PHP_XLSXWriter 代替 PHPExcel 10W+ 数据秒级导出
- 安装php扩展XLSXWriter
- 解决php导入excel表格时获取日期变成浮点数的方法
- xml处理
- PHP XML和数组互相转换
- php解析xml字符串
- php 生成vcf通讯录
- 文件操作相关
- php获取文件后缀的9种方法
- PHP判断远程文件是否存在
- PHP获取文件修改时间,访问时间,inode修改时间
- php获取远程文件大小教程
- php 读取文件并以文件方式下载
- php 把数字转化为大写中文
- 请求响应
- PHP 获取当前访问的URL
- 压缩
- php生成zip压缩包
- PHPMailer
- 整理PHPMailer 发送邮件 邮件内容为html 可以添加多个附件等
- 通达oa
- OA管理员密码忘了怎么办,这里教你分分钟搞定…
- 跨域
- php解决多站点跨域
- php设置samesite cookie,有效防止CSRF
- Chrome 配置samesite=none方式
- Cookie 的 SameSite 属性
- 图片
- php pdf首页截图,PHP_PHP中使用Imagick读取pdf并生成png缩略图实例,pdf生成png首页缩略图
- PHP -- 七牛云 在线视频 获取某一帧作为封面图
- PHP图片压缩方法
- 如何解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
- php远程下载文章中图片并保存源文件名不变
- 详解PHP如何下载采集图片到本地(附代码实例)
- php如何将webp格式图片转为jpeg
- PHP获取远程图片的宽高和体积大小
- php 软件版本号比较
- 使用PHP通过SMTP发送电邮
- 常用正则表达式
- php如何用正则表达式匹配中文
- 用于分割字符串的 PHP preg_match_all 正则表达式
- 性能优化
- php.ini配置调优
- PHP 几种常见超时的设置方法
- PHP函数in_array、array_key_exists和isset效率分析
- php array push 和array_merge 效率谁高,php 通过array_merge()和array+array合并数组的区别和效率比较...
- php 两个数组取交集、并集、差集
- 设置PHP最大连接数及php-fpm 高并发 参数调整
- 小工具
- php 获取代码执行时间和消耗的内存
- PHP如何判断某项扩展是否开启
- centos7.x下php 导出扩展 XLSXWriter 安装
- php生成mysql数据库字典
- PHP 实现 word/excel/ppt 转换为 PDF
- composer的使用
- showdoc sqlite3 找回管理员密码
- php怎么将数组转为xml
- PHP抖音最新视频提取代码
- yii
- Yii2 如何获取Header参数?
- swoole
- Linux下搭建swoole服务的基本步骤
- 相关学习资料
- 带你学习swoole_process详解
- 按照官方文档 在win10下安装 docker for windows easyswoole镜像 挂载目录
- php常用框架
- Hyperf
- 常用算法PHP版
- thinkphp6
- TP6 事件绑定、监听、订阅
- Thinkphp 模板中输出HTML的变量
- Thinkphp6(操作SQL数据库)
- thinkphp6 mysql查询语句对于为null和为空字符串给出特定值处理
- Thinkphp 6 - 连接配置多个数据库并实现自由切换(详细过程及实例demo)
- TP框架中的Db::name 和 dB::table 以及 db('') 的区别
- thinkphp6.0模型篇之模型的软删除
- thinkphp6自定义日志驱动,增加显示全部请求信息
- 其他系统
- 微擎数据库字段字典
- Flutter实现微信支付和iOS IAP支付
- Flutter上线项目实战——苹果内购
- PHP接入苹果支付
- 调试
- php如何获取当前脚本所有加载的文件
- php跟踪所有调用方法,日志方法
- 解析phpstorm + xdebug 远程断点调试
- PHP XDEBUG调试 PHPSTORM配置
- 异常处理
- PHP 出现 502 解决方案
- php 语法解析错误 syntax error unexpected namespace T_NAMESPACE
- Composer 安装与使用
- 数据库相关
- php pdo怎么设置utf8
- php 如何根据最新聊天对用户进行排序
- php lic&fpm
- 让php程序在linux后台执行
- PHPcli模式和fpm模式优缺点在哪里?
- 运行模式
- php运行模式之cli模式
- 自己库
- php批量获取所有公众号粉丝openid
- 地图
- php 判断点在多边形内,php百度地图api判断地址是否在多边形区域内
- PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询
- MySQL 根据经纬度查找排序
- PHP+MySQL获取坐标范围内的数据
- 【百度地图】删除指定覆盖物
- 百度地图多点+画连接线+数字标注
- laravel5.8
- laravel5.8(四)引入自定义常量文件及公共函数文件
- Lumen 查询执行SQL
- 使你的 Laravel 项目模块化
- Laravel 多条件 AND , OR条件组合查询
- Laravel 查询 多个or或者and条件
- laravel redis操作大全
- laravel中外部定义whereIn的用法和where中使用in
- lumen5.8
- 创建laravel5.8 lumen前后台api项目--记录请求和响应日志
- Laravel和Lumen开启SQL日志记录
- Laravel 5.8 常用操作(路径+日志+分页+其他操作)
- 升级php7.4 laravel lumen报错Trying to access array offset on value of type null
- Laravel 任务调度(计划任务,定时任务)
- laravel的command定时任务时间的设置
- Laravel任务调度的简单使用
- laravel单数据库执行事务和多数据库执行事务
- laravel中锁以及事务的简单使用
- 申请其他相关
- 小程序地理位置接口申请
- PHP高并发
- php 高并发下 秒杀处理思路
- 记录 PHP高并发 商品秒杀 问题的 Redis解决方案
- thinkphp3.2
- thinkphp3.2 数据库 AND OR连缀使用
- laravel
- laravel的联表查询with方法的使用
- laravel获取请求路由对应的控制器和方法
- Laravel 模型关联建立与查询
- Laravel多表(3张表以上)with[]关联查询,对关联的模型做条件查询(has,跟join一样结果 )
- Laravel模型属性的隐藏属性、显示属性和临时暴露隐藏属性用法介绍
- aravel获取当前的url以及当前的基础域名方法汇总
- Laravel 模型实现多库查询或者多表映射
- 关于 Laravel 的 with 多表查询问题
- Laravel 模型过滤(Filter)设计
- 懒加载、预加载、with()、load() 傻傻分不清楚?
- laravel模型$castsl属性
- Laravel Query Builder 复杂查询案例:子查询实现分区查询 partition by
- Laravel 模型关联、关联查询、预加载使用实例
- laravel 中with关联查询限定查询字段
- laravel 原生字段查询 whereRaw 和 where(DB::raw(''))
- lavarel - where条件分组查询(orWhere)
- 通过 Laravel 查询构建器实现复杂的查询语句
- 两个结果集合并成一个
- Laravel 对某一列进行筛选然后求和 sum()
- laravel怎么优雅的拼接where,处理whereIn与where数组查询的问题
- laravel查询时判断是否存在数据
- laravel中的whereNull和whereNotNull
- laravel框架中的子查询
- Laravel框架中 orwhere 多条件查询的使用
- Laravel中where的高级使用方法
- laravel复杂的数据库查询(事例)
- laravel多条件查询方法(and,or嵌套查询)
- Laravel 的 where or 查询
- Laravel 进行where 多个or和and的条件查询可用
- laravel Middleware 中间件 $next($request) 报错不执行问题
- 数据库
- mysql
- mysql联合索引(复合索引)详解
- MYSQL 清空表和截断表
- MySQL快速生成大量测试数据(100万、1000万、1亿)
- 提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
- MySQL常用命令
- MySQL(三)|《千万级大数据查询优化》第一篇:创建高性能的索引
- MySQL(一)|性能分析方法、SQL性能优化和MySQL内部配置优化
- MySQL(二)|深入理解MySQL的四种隔离级别及加锁实现原理
- MySQL(四)|《千万级大数据查询优化》第一篇:创建高性能的索引(补充)
- MySQL(五)|《千万级大数据查询优化》第二篇:查询性能优化(1)
- MySQL(六)|《千万级大数据查询优化》第二篇:查询性能优化(2)
- MySQL(七)|MySQL分库分表的那点事
- Mysql索引优化 Mysql通过索引提升查询效率(第二棒)
- MySQL查询的性能优化(查询缓存、排序跟索引)
- 【总结】MySQL数据库
- MySQL存储引擎、事务日志并发访问以及隔离级别
- 技巧
- 数据库 SQL查询重复记录 方法
- 替换数据库中某个字段中的部分字符
- mysql开启bin log 并查看bin log日志(linux)
- 分表分区
- 千万级别数据的mysql数据表优化
- MYSQL百万级数据,如何优化
- MySQL备份和恢复
- MySQL间隙锁死锁问题
- 小技巧
- 基础
- MySQL中sql_mode参数
- mysql数据库异常
- this is incompatible with sql_mode=only_full_group_by
- mysql安全
- MySQL数据库被比特币勒索及安全调整
- MongoDB
- sql查询
- MYSQL按时间段分组查询当天,每小时,15分钟数据分组
- 高级
- 基于 MySQL + Tablestore 分层存储架构的大规模订单系统实践-架构篇
- 数据库安全
- 服务器被黑,MySQL 数据库遭比特币勒索!该如何恢复?
- 数千台MySQL数据库遭黑客比特币勒索,该怎么破?
- MySQL 数据库规范
- MySQL数据库开发的36条铁律
- Elasticsearch
- 安装与配置
- ElasticSearch关闭重启命令
- 设置ES默认分词器IK analyzer
- 查询
- elasticsearch 模糊查询不分词,实现 mysql like
- elasticSearch多条件高级检索语句,包含多个must、must_not、should嵌套示例,并考虑nested对象的特殊检索
- elasticSearch按字段普通检索,结果高亮
- Elasticsearch 如何实现查询/聚合不区分大小写?
- 索引更新&刷新
- refresh与批量操作的效率
- Elasticsearch 删除type
- 分词器
- ElasticSearch最全分词器比较及使用方法
- 异常错误
- 解决ES因内存不足而无法查询的错误,Data too large, data for [<http_request>]
- linux
- 基本知识
- CentOS7.5 通过wget下载文件到指定目录
- 【CentOS】vi命令
- centos7查看硬盘使用情况
- CentOS7 查看目录大小
- Centos 7下查看当前目录大小及文件个数
- 普通用户sudo\su 到root免密码
- 普通用户切换到root用户下的免密配置方法
- linux 获取进程启动参数,linux查看进程启动及运行时间
- Linux 查看进程
- linux删除文件后不释放磁盘的问题
- Linux查找大文件命令
- linux 如何关闭正在执行的php脚本
- linux三剑客(grep、sed、awk)基本使用
- centos 卸载软件
- centos查看内存、cpu占用、占用前10,前X
- Centos 查看系统状态
- 异常
- 问题解决:Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist:...
- php相关
- centos 安装phpize
- Centos7.2下phpize安装php扩展
- 切换版本
- 运营工具
- 资深Linux运维工程师常用的10款软件/工具介绍
- 一款良心的终端连接工具
- 六款Linux常用远程连接工具介绍,看看哪一款最适合你
- Finalshell
- Linux Finalshell连接centos7和文件无显示问题
- WSL2:我在原生的Win10玩转Linux系统
- MobaXterm
- 运维
- linux服务器上定时自动备份数据库,并保留最新5天的数据
- Centos系统开启及关闭端口
- CentOS7开放和关闭端口命令
- Linux中查看所有正在运行的进程
- 防火墙firewall-cmd命令详解
- centos 7.8阿里云服务器挂载 数据盘
- Linux Finalshell连接centos7和文件无显示问题
- Centos7系统端口被占用问题的解决方法
- vi
- 如何在Vim/Vi中复制,剪切和粘贴
- 命令
- [Linux kill进程] kill 进程pid的使用详解
- 备份还原
- Linux的几种备份、恢复系统方式
- Linux系统全盘备份方法
- 相关软件安装
- linux下 lua安装
- python
- 升级pip之后出现sys.stderr.write(f“ERROR: {exc}“)
- lua
- centos源码部署lua-5.3
- deepin
- deepin20.6设置默认的root密码
- 任务相关
- 宝塔定时任务按秒执行
- CentOS 7 定时任务 crontab 入门
- centos7定时任务crontab
- Linux下定时任务的查看及取消
- Linux(CentOS7)定时执行任务Crond详细说明
- Linux 查看所有定时任务
- linux查看所有用户定时任务
- Linux 定时任务(超详细)
- 防火墙
- Centos7开启防火墙及特定端口
- CentOS防火墙操作:开启端口、开启、关闭、配置
- 生成 SSH 密钥(windows+liunx)
- 阿里云,挂载云盘
- 前端
- layui
- layui多文件上传
- layer.msg()弹框,弹框后继续运行
- radio取值
- layui-数据表格排序
- Layui select选择框添加搜索选项功能
- 保持原来样式
- layui表格单元如何自动换行
- layui-laydate时间日历控件使用方法详解
- layui定时刷新数据表格
- layer 延时设置
- layer.open 回调函数
- 【Layui内置方法】layer.msg延时关闭msg对话框(代码案例)
- layui多图上传图片顺序错乱及重复上传解决
- layer.confirm关闭弹窗
- vue
- Vue跨域解决方法
- vue 4.xx.xx版本降级至2.9.6
- vue-cli 2.x升级到3.x版本, 和3.x降级到2.x版本命令
- 最新版Vue或者指定版本
- Vue2.6.11按需模块安装配置
- jQuery
- jQuery在页面加载时动态修改图片尺寸的方法
- jquery操作select(取值,设置选中)
- 日历
- FullCalendar中文文档:Event日程事件
- js
- JS 之 重定向
- javascript截取video视频第一帧作为封面方案
- HTML <video> preload 属性
- jQuery使用ajax提交post数据
- JS截取视频靓丽的帧作为封面
- H5案例分享:移动端touch事件判断滑屏手势的方向
- JS快速获取图片宽高的方法
- win
- Windows环境下curl的使用
- Cygwin
- Windows下安装Cygwin及apt-cyg
- Cygwin 安装、CMake 安装
- mklink命令 详细使用
- Nginx
- Nginx高级篇-性能优化
- Nginx常用命令(Linux)
- linux+docker+nginx如何配置环境并配置域名访问
- Nginx的启动(start),停止(stop)命令
- linux 查看nginx 安装路径
- 安装配置
- Linux 查看 nginx 安装目录和配置文件路径
- 【NGINX入门】3.Nginx的缓存服务器proxy_cache配置
- thinkphp6.0 伪静态失效404(win下)
- 深入
- nginx rewrite及多upstream
- Nginx负载均衡(upstream)
- 专业术语
- 耦合?依赖?耦合和依赖的关系?耦合就是依赖
- PHP常用六大设计模式
- 高可用
- 分布式与集群
- Nginx 实践案例:反向代理单台web;反向代理多组web并实现负载均衡
- 容器
- Docker
- 30 分钟快速入门 Docker 教程
- linux查看正在运行的容器,说说Docker 容器常用命令
- Windows 安装Docker至D盘
- 配置
- win10 快速搭建 lnmp+swoole 环境 ,部署laravel6 与 swoole框架laravel-s项目1
- win10 快速搭建 lnmp+swoole 环境 ,部署laravel6 与 swoole框架laravel-s项目2
- docker 容器重命名
- Linux docker常用命令
- 使用
- docker 搭建php 开发环境 添加扩展redis、swoole、xdebug
- docker 单机部署redis集群
- Docker 退出容器不停止容器运行 并重新进入正在运行的容器
- 进入退出docker容器
- Docker的容器设置随Docker的启动而启动
- 使用异常处理
- docker容器中bash: vi: command not found
- OCI runtime exec failed: exec failed:解决方法
- docker启动容器慢,很慢,特别慢的坑
- 解决windows docker开发thinkphp6启动慢的问题
- 【Windows Docker】docker挂载解决IO速度慢的问题
- Docker的网络配置,导致Docker使用网路很慢的问题及解决办法
- golang工程部署到docker容器
- Docker 容器设置自启动
- 如何优雅地删除Docker镜像和容器(超详细)
- 5 个好用的 Docker 图形化管理工具
- Docker 可能会用到的命令
- Kubernetes
- 消息队列
- RabbitMQ
- php7.3安装使用rabbitMq
- Windows环境PHP如何使用RabbitMQ
- RabbitMQ学习笔记:4369、5672、15672、25672默认端口号修改
- Window10 系统 RabbitMQ的安装和简单使用
- RabbitMQ默认端口
- RabbitMQ可视化界面登录不了解决方案
- RocketMQ
- Kafka
- ActiveMQ
- mqtt
- phpMQTT详解以及处理使用过程中内存耗死问题
- MQTT--物联网(IoT)消息推送协议
- php实现mqtt发布/发送 消息到主题
- Mqtt.js 的WSS链接
- emqx
- 如何在 PHP 项目中使用 MQTT
- emqx 修改dashboard 密码
- 其他
- Windows 系统中单机最大TCP的连接数详解
- EMQX
- Linux系统EMQX设置开机自启
- Centos7 EMQX部署
- docker安装 EMQX 免费版 docker安装并配置持久化到服务器
- 实时数仓
- 网易云音乐基于 Flink + Kafka 的实时数仓建设实践
- 实时数仓-基于Flink1.11的SQL构建实时数仓探索实践
- 安全
- 网站如何保护用户的密码
- 关于web项目sessionID欺骗的问题
- php的sessionid可以伪造,不要用来做防刷新处理了
- DVWA-Weak Session IDs (弱会话)漏洞利用方式
- 保证接口数据安全的10种方案
- cookie和session的窃取
- 万能密码漏洞
- 黑客如何快速查找网站后台地址方法整理
- 网站后台万能密码/10大常用弱口令
- 万能密码漏洞02
- 大多数网站后台管理的几个常见的安全问题注意防范
- token可以被窃取吗_盗取token
- token被劫持[token被劫持如何保证接口安全性]
- PHP给后台管理系统加安全防护机制的一些方案
- php - 重新生成 session ID
- 隐藏响应中的server和X-Powered-By
- PHP会话控制之如何正确设置session_name
- Session攻击001
- PHP防SQL注入代码,PHP 预防CSRF、XSS、SQL注入攻击
- php25个安全实践
- php架构师 系统管理员必须知道的PHP安全实践
- 版本控制
- Linux服务器关联Git,通过执行更新脚本实现代码同步
- PHP通过exec执行git pull
- git 在linux部署并从windows上提交代码到linux
- git上传到linux服务器,git一键部署代码到远程服务器(linux)
- linux更新git命令,使用Linux定时脚本更新服务器的git代码
- git異常
- 如何解决remote: The project you were looking for could not be found
- git status显示大量文件修改的原因是什么
- PHPstorm批量修改文件换行符CRLF为LF
- git使用
- git常用命令大全
- centos git保存账户密码
- GIT 常用命令
- git怎样还原修改
- Git 如何放弃所有本地修改的方法
- Git忽略文件模式改变
- git: 放弃所有本地修改
- Git三种方法从远程仓库拉取指定的某一个分支
- 杂七杂八
- h5视频
- H5浏览器支持播放格式:H264 AVCA的MP4格式,不能转换为mpeg-4格式,
- iOS无法播放MP4视频文件的解决方案 mp4视频iphone播放不了怎么办
- h5点播播放mp4视频遇到的坑,ios的h5不能播放视频等
- 【Linux 并发请求数】支持多少并发请求数
- Linux下Apache服务器并发优化
- 缓存
- redis
- Linux启动PHP的多进程任务与守护redis队列
- 重启redis命令
- golang