PHP是廣泛使用的開源服務端腳本語言。通過HTTP或HTTPS協議,Apache Web服務允許用戶訪問文件或內容。服務端腳本語言的錯誤配置會導致各種問題。因此,PHP應該小心使用。以下是為系統管理員準備的,安全配置PHP的25個實踐事例。

用于下文的PHP設置樣例
* DocumentRoot:/var/www/html
* 默認Web服務:Apache(可以使用Lighttpd或Nginx代替)
* 默認PHP配置文件:/etc/php.ini
* 默認PHP Extensions配置目錄:/etc/php.d/
* PHP安全配置樣例文件:/etc/php.d/security.ini(需要使用文本編輯器創建這個文件)
* 操作系統:RHEL / CentOS / Fedora Linux(指令應該可以在所有其他Linux發行版,如Debian / Ubuntu,或是Unix-like的操作系統,如OpenBSD / FreeBSD / HP-UX下正常運行)
* PHP服務的默認TCP/UDP端口:none
下午列出的大部分操作,都是基于 root 用戶能在 bash 或其他現代 shell 上執行操作的假設。
~~~
$ 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的應用面臨著各種各樣的攻擊:
* XSS:對PHP的Web應用而言,跨站腳本是一個易受攻擊的點。攻擊者可以利用它盜取用戶信息。你可以配置Apache,或是寫更安全的PHP代碼(驗證所有用戶輸入)來防范XSS攻擊
* SQL注入:這是PHP應用中,數據庫層的易受攻擊點。防范方式同上。常用的方法是,使用mysql\_real\_escape\_string()對參數進行轉義,而后進行SQL查詢。
* 文件上傳:它可以讓訪問者在服務器上放置(即上傳)文件。這會造成例如,刪除服務器文件、數據庫,獲取用戶信息等一系列問題。你可以使用PHP來禁止文件上傳,或編寫更安全的代碼(如檢驗用戶輸入,只允許上傳png、gif這些圖片格式)
* 包含本地與遠程文件:攻擊者可以使遠程服務器打開文件,運行任何PHP代碼,然后上傳或刪除文件,安裝后門。可以通過取消遠程文件執行的設置來防范
* eval():這個函數可以使一段字符串如同PHP代碼一樣執行。它通常被攻擊者用于在服務器上隱藏代碼和工具。通過配置PHP,取消eval()函數調用來實現
* Sea-surt Attack(Cross-site request forgery,CSRF。跨站請求偽造):這種攻擊會使終端用戶在當前賬號下執行非指定行為。這會危害終端用戶的數據與操作安全。如果目標終端用戶的賬號用于管理員權限,整個Web應用都會收到威脅。
** #2:減少內建的PHP模塊**
執行下面指令可以查看當前PHP所編譯的模塊
~~~
$ php -m
~~~
樣例輸出:
~~~
[PHP Modules]
apc
bcmath
bz2
calendar
Core
ctype
curl
date
dom
ereg
exif
fileinfo
filter
ftp
gd
gettext
gmp
hash
iconv
imap
json
libxml
mbstring
memcache
mysql
mysqli
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
readline
Reflection
session
shmop
SimpleXML
sockets
SPL
sqlite3
standard
suhosin
tokenizer
wddx
xml
xmlreader
xmlrpc
xmlwriter
xsl
zip
zlib
[Zend Modules]
Suhosin
~~~
從性能與安全性的角度考慮,我建議使用PHP時減少不必要的模塊。例如上面的sqlite3是不必要的。那么可以通過刪除或重命名/etc/php.d/sqlite3.ini文件來取消它:
~~~
# 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
~~~
更多信息請查看:[how to compile and reinstall php on Unix like operating system](http://www.php.net/manual/en/install.unix.php)
** #3:防止PHP信息泄漏**
可以通過取消export\_php,對PHP信息泄漏進行限制。編輯/etc/php.d/security.ini如下:
~~~
expose_php=Off
~~~
expose\_php會在HTTP Header中添加服務器上,包括版本在內的PHP信息(例如X-Powered-By: PHP/5.3.3)。同時,PHP的全局統一標識符也會暴露。如果export\_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
...
~~~
建議同時隱藏Apache版本等信息:[ServerTokens and ServerSignature directives in httpd.conf to hide Apache version](http://www.cyberciti.biz/faq/rhel-centos-hide-httpd-version/)
** #4:最小化可載入的PHP模塊(動態Extension)**
PHP支持“Dynamic Extensions”。默認情況下,RHEL會載入/etc/php.d/目錄下的所有Extension模塊。如需啟用或取消某一模塊,只需把/etc/php.d/目錄下配置文件把該模塊注釋掉。也可以把文件刪除或重命名該模塊的配置文件。為了最優化PHP的性能和安全性,應只啟用Web應用所需的Extension。例如,用下面命令取消GD模塊:
~~~
# cd /etc/php.d/
# mv gd.{ini,disable}
# <span style="text-decoration: underline;">/sbin/service httpd restart</span>
~~~
啟用則是:
~~~
# mv gd.{disable,ini}
# <span style="text-decoration: underline;">/sbin/service httpd restart</span>
~~~
** #5:記錄所有PHP錯誤**
不要把PHP錯誤信息輸出給所用用戶。編輯/etc/php.d/security.ini,如下修改:
~~~
display_errors=Off
~~~
確保把所有錯誤信息記錄到日志文件
~~~
log_errors=On
error_log=/var/log/httpd/php_scripts_error.log
~~~
** #6:禁止文件上傳**
為安全考慮,如下編輯/etc/php.d/security.ini取消文件上傳
~~~
file_uploads=Off
~~~
如用戶的確需要上傳文件,那么把它啟用,而后限制PHP接受的最大文件大小:
~~~
file_uploads=On
# user can only upload upto 1MB via php
upload_max_filesize=1M
~~~
** #7:關閉遠程代碼執行**
如果這個特性被啟動,PHP可以通過allow\_url\_fopen,在file\_get\_contents()、include、require中獲取諸如FTP或網頁內容這些遠程數據。程序員經常忘記了對用戶輸入進行過濾,而如果這些函數調用了這些數據,則形成了注入漏洞。在基于PHP的Web應用中,大量代碼中的注入漏洞都由此產生。可以通過編輯/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()會忽略傳入的所有參數。與此同時,你需要在代碼上做些相應的修改。第三方以及開源應用,如Wordpress,在sql.safe\_mode下可能無法正常工作。同時建議關閉5.3.x版本的PHP的magic\_quotes\_gpc過濾,因為它簡單粗暴又沒效率。使用mysql\_escape\_string()以及自定義的過濾函數會更好一些
~~~
magic_quotes_gpc=Off
~~~
** #9:控制POST的數據大小**
HTTP POST通常作為請求的一部分,被客戶端用于向Apache Web服務器發送數據,如上傳文件或提交表單。攻擊者會嘗試發送超大的POST請求去消耗服務器的資源。如下編輯/etc/php.d/security.ini限制POST的最大大小:
~~~
; 在這里設置一個靠譜的數值
post_max_size=1K
~~~
這里設置了1K的最大大小。這個設置會影響到文件上傳。要上傳大文件,這個值需要比update\_max\_filesize大。
建議在Apache中限制可用的請求方法,編輯httpd.conf如下:
~~~
<Directory /var/www/html>
<LimitExcept GET POST>
Order allow,deny
</LimitExcept>
## Add rest of the config goes here... ##
</Directory>
~~~
** #10:資源控制(DoS控制)**
設置每個PHP腳本的最大運行時間。另外建議限制用于處理請求數據的最大時間,以及最大可用內存數。
# 單位:秒
~~~
max_execution_time = 30
max_input_time = 30
memory_limit = 40M
~~~
** #11:為PHP安裝Suhosin高級保護系統**
具體參考Suhosin項目頁:[project page](http://www.hardened-php.net/suhosin/)
** #12:取消危險的PHP函數**
PHP有大量可用于入侵服務器的函數,如使用不當則會成為漏洞。如下取消這些函數:
~~~
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協同工作。Fastcgi可以減少Web服務器的內存足跡(memory footprint),并改善PHP性能。可以參考這個來配置Apache2+PHP+FastCGI。在這個配置中,cgi.force\_redirect會阻止用戶通過訪問URL來調用PHP。為安全考慮,啟用該特性:
~~~
; Enable cgi.force_redirect for security reasons in a typical *Apache+PHP-CGI/FastCGI* setup
cgi.force_redirect=On
~~~
** #14:PHP用戶與用戶組ID**
mod\_fastcgi是Apache Web服務的一個cgi模塊,可連接到外部的FASTCGI服務器。你需要確保PHP使用非root用戶運行。若其使用root或是UID小于100的用戶權限,它就可以訪問,乃至操作系統文件。通過Apache’s suEXEC或mod\_suPHP,可在非特權用戶下執行PHP CGI。suEXEC可以是Apache調用CGI程序的user ID不同于運行Apache的user ID。如下:
~~~
# ps aux | grep php-cgi
~~~
樣例輸出:
~~~
phpcgi 6012 0.0 0.4 225036 60140 S Nov22 0:12 /usr/bin/php-cgi
phpcgi 6054 0.0 0.5 229928 62820 S Nov22 0:11 /usr/bin/php-cgi
phpcgi 6055 0.1 0.4 224944 53260 S Nov22 0:18 /usr/bin/php-cgi
phpcgi 6085 0.0 0.4 224680 56948 S Nov22 0:11 /usr/bin/php-cgi
phpcgi 6103 0.0 0.4 224564 57956 S Nov22 0:11 /usr/bin/php-cgi
phpcgi 6815 0.4 0.5 228556 61220 S 00:52 0:19 /usr/bin/php-cgi
phpcgi 6821 0.3 0.5 228008 61252 S 00:55 0:12 /usr/bin/php-cgi
~~~
可以通過spawn-fcgi來生成phpcgi用戶的遠程或本地FastCGI進程(前提是有這個用戶):
~~~
# spawn-fcgi -a 127.0.0.1 -p 9000 -u phpcgi -g phpcgi -f /usr/bin/php-cgi
~~~
現在可以配置Apache、Lighthttpd或Nginx Web服務調用運行在127.0.0.1:9000的FastCGI。
** #15:限制PHP訪問文件系統**
open\_basedir會限制PHP的運行目錄,例如通過fopen()之類的函數可訪問的目錄。如果訪問的目錄不在open\_basedir之內,PHP會拒絕該訪問。不要使用軟鏈接作為工作區。例如,只允許訪問/var/www/html而非/var/www、/tmp或/etc目錄:
~~~
; 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:Session路徑**
PHP Session用戶提供數據保存功能,以便后續訪問。這可以使應用可定制性更強,提升吸引力。所有Session相關的數據會被保存在session.save\_path中。RHEL/CentOS/Fedora Linux的默認設置如下:
~~~
session.save_path="/var/lib/php/session"
; Set the temporary directory used for storing files when doing file upload
upload_tmp_dir="/var/lib/php/session"
~~~
確認這個路徑在/var/www/html之外,且不可被其他系統用戶訪問:
~~~
# ls -Z /var/lib/php/
~~~
樣例輸出:
~~~
drwxrwx---. root apache system_u:object_r:httpd_var_run_t:s0 session
~~~
注:ls -Z會顯示SELinux的安全信息,如文件模式,user,group,安全信息,文件名等。
** #17:保證PHP,軟件及操作系統更新到最新**
維護Linux、Apache、PHP和MySQL服務器的一項重要工作是更新安全補丁。所有的PHP安全更新應盡快進行審查并更新。可使用如下命令(如果通過包管理器來安裝PHP):
~~~
# yum update
~~~
或
~~~
# apt-get update && apt-get upgrade
~~~
可以配置Red Hat / CentOS / Fedora Linux通過Email發送yum的包更新提醒,或是Debian / Ubuntu Linux下的apticron發送提醒。又或通過cron計劃任務進行更新。
注:查看php.net以獲取最新的PHP版本信息
** #18:限制文件及目錄訪問**
確認以Apache或www這種非root用戶運行Apache。/var/www/html目錄下的owner也應是非root用戶:
~~~
# chown -R apache:apache /var/www/html/
~~~
DocumentRoot下的文件應禁止運行或創建。設置該目錄下的文件權限為0444(只讀):
~~~
# chmod -R 0444 /var/www/html/
~~~
設置該目錄下的所有文件夾權限為0445
~~~
# find /var/www/html/ -type d -print0 | xargs -0 -I {} chmod 0445 {}
~~~
** #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/
~~~
同樣可以為/var/www/html目錄加上寫入保護
~~~
# chattr +i /var/www/html/file1.php# chattr +i /var/www/html/
~~~
** #20:使用Linux安全拓展(如SELinux)**
Linux有各種安全方案來防止服務程序的錯誤配置或漏洞。盡可能使用SELinux或其他Linux安全方案限制網絡和程序。例如,SELinux為Linux內核或Apache Web服務提供不同的安全策略。使用下面命令列出所有Apache保護信息:
~~~
# getsebool -a | grep httpd
~~~
樣例輸出:
~~~
allow_httpd_anon_write --> off
allow_httpd_mod_auth_ntlm_winbind --> off
allow_httpd_mod_auth_pam --> off
allow_httpd_sys_script_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_dbus_avahi --> on
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_read_user_content --> off
httpd_setrlimit --> off
httpd_ssi_exec --> off
httpd_tmp_exec --> off
httpd_tty_comm --> on
httpd_unified --> on
httpd_use_cifs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off
~~~
取消Apache cgi支持可以輸入:
~~~
# setsebool -P httpd_enable_cgi off
~~~
詳細參考:[Red Hat SELinux guide](http://www.hardened-php.net/suhosin/)
** #21:安裝Mod\_security**
ModSecurity是一個開源的入侵檢測和防范的Web應用引擎。安裝mod\_security可以保護Apache和PHP應用免受XSS和其他攻擊:
~~~
## A few Examples ##
# Do not allow to open files in /etc/
SecFilter /etc/? # Stop SQL injection
SecFilter "delete[[:space:]]+from"
SecFilter "select.+from"
~~~
** #22:如有可能,在Chroot Jail下運行Apache / PHP**
在Chroot Jail下運行Apache / PHP可以最小化可能受到的損失,使其局限于文件系統下的一小塊。可以使用一般的chroot來配置Apache:[chroot kind of setup with Apache](http://www.cyberciti.biz/tips/chroot-apache-under-rhel-fedora-centos-linux.html)。不過我建議使用FreeBSD jails、XEN,KVM或OpenVZ虛擬化。
** #23:使用防火墻限制傳出連接**
攻擊者會使用wget之類的工具從你的Web服務器下載文件。使用iptables來阻擋Apache用戶的傳出連接。ipt\_owner模塊會為本地數據包的生成者分配不同角色。它只對OUTPUT chain有效。下面指令允許vivek用戶通過80端口進行外部訪問:
~~~
/sbin/iptables -A OUTPUT -o eth0 -m owner --uid-owner vivek -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
~~~
下面的樣例則是阻擋所有Apache用戶的傳出連接,只允許smtp服務及spam識別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
~~~
查看日志文件可以讓你知道服務器正在承受何種攻擊,并分析當前安全級別是否足夠。啟用審查服務用于系統審查,可審查SELinux時間,驗證事件,文件修改,賬號修改等。建議使用Linux System Monitoring Tools來監控Web服務器。
** #25:把服務分離到不同的服務器或虛擬機**
對于比較龐大的安裝配置,建議把運行、數據庫、靜態與動態內容分離到不同的服務器
~~~
///////////////
/ ISP/Router /
//////////////
\
|
Firewall
\
|
+------------+
| LB01 |
+------------+ +--------------------------+
| | static.lan.cyberciti.biz |
+-----------------+--------------------------+
| phpcgi1.lan.cyberciti.biz|
+--------------------------+
| phpcgi2.lan.cyberciti.biz|
+--------------------------+
| mysql1.lan.cyberciti.biz |
+--------------------------+
| mcache1.lan.cyberciti.biz|
+--------------------------+
~~~
在不同的服務器或虛擬機下運行不同的網絡服務,這可以減少被入侵對其他服務的影響。例如,一個攻擊者入侵了Apache,那就可以訪問同一服務器下的其他服務(如MySQL,email服務等)。但在上述例子中則不會:
* static.lan.cybercity.biz – 使用lighttpd或nginx存放js/css/images等靜態資源
* phpcgi1.lan.cyberciti.biz和phpcgi2.lan.cyberciti.biz – Apache Web服務+PHP,用于生成動態內容
* mysql1.lan.cyberciti.biz – MySQL數據庫服務
* mcache1.lan.cyberciti.biz – Memcached服務(MySQL的高速緩存系統)。它使用libevent或epoll來適應任意連接數。而且它使用的是非阻塞網絡IO。
* LB01 – 一個Nginx服務器,用于Web及Apache前端的反向代理。所有的訪問連接會通過nginx代理服務,被直接處理或分發到相應的Web服務器。LB01提供簡單的負載均衡。
- 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) 報錯不執行問題
- 基于Laravel框架--自定義CORS跨域中間件
- laravel9新增路由文件及解決跨域問題方法
- 解決在laravel中leftjoin帶條件查詢沒有返回右表為NULL的問題
- 【Laravel 】faker數據填充詳解
- 數據庫
- 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數據庫被比特幣勒索及安全調整
- mysql忘記密碼后重置(以windows系統mysql 8.4為例)
- 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