php
那什麼又是cgi呢?html
CGI(Common Gateway Interface)。CGI是外部應用程序(CGI程序)與Web服務器之間的接口標準,是在CGI程序和Web服務器之間傳遞信息的規程。CGI規範容許Web服務器執行外部程序,並將它們的輸出發送給Web瀏覽器,CGI將Web的一組簡單的靜態超媒體文檔變成一個完整的新的交互式媒體。mysql
簡單的說,就是:cgi就是專門用來和web 服務器打交道的。web服務器收到用戶請求,就會把請求提交給cgi程序(php的fastcgi),cgi程序根據請求提交的參數做應處理(解析php),而後輸出標準的html語句返回給web服服務器,再返回給客戶端,這就是普通cgi的工做原理。nginx
yum install php php-mysql php-fpm
安裝成功。web
php-fpm配置文件路徑:/etc/php-fpm.d/www.confsql
php配置文件路徑:/etc/php.ini數據庫
說明:apache
php-mysql,這個是後續連接mysql須要的瀏覽器
php.ini安全
將 ;cgi.fix_pathinfo=1 改成 cgi.fix_pathinfo=1 只要把前面的分號去掉就能夠了;
fix_pathinfo是用來幹嗎的呢?
爲CGI提供真正的PATH_INFO / PATH_TRANSLATED支持,不打開,nginx是解析不了路徑的。
www.conf
將 user = apache group = apache
改成 user = nginx group = nginx
/etc/nginx/conf.d目錄下新增php-fpm.conf,內容配置以下
server { listen 80; server_name 192.168.189.134; location ~ .php$ { try_files $uri =404; root /usr/share/nginx/html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
SCRIPT_FILENAME這個參數在fastcgi_params也有,默認是$fastcgi_script_name,能夠看出只是添加了網站根目錄
開啓自啓動
sudo systemctl enable php-fpm
/usr/share/nginx/html目錄下新建phpinfo.php文件,內容以下:
<?php echo 6666666666; phpinfo(); ?>
重啓nginx
sudo systemctl restart nginx
能夠訪問,已經成功安裝了。
修改/etc/php-fpm.d/www.conf
將 user = apache group = apache
改成 user = nobody group = nobody
PHP 環境提供的安全模式是一個很是重要的內嵌安全機制,PHP 安全模式能有效控制一些 PHP 環境中的函數(例如system()
函數,官網有個列表),對大部分的文件操做函數進行權限控制,同時不容許對某些關鍵文件進行修改(例如 /etc/passwd)。默認的 php.ini 配置文件並無啓用安全模式
php5.4之前的版本修改/etc/php.ini
safe_mode = on
下面是安全模式下的功能
當您啓用安全模式後,若是safe_mode_gid
選項被關閉,PHP 腳本可以對文件進行訪問,且相同用戶組的用戶也可以對該文件進行訪問。
safe_mode_gid = off
若是啓用了安全模式後,想要執行某些程序的時候,能夠指定須要執行程序的主目錄,例如:
safe_mode_exec_dir = /usr/bin
通常狀況下,若是不須要執行什麼程序,建議您不要指定執行系統程序的目錄。您能夠指定一個目錄,而後把須要執行的程序拷貝到這個目錄便可,例如:
safe_mode_exec_dir = /temp/cmd
可是,更推薦您不要執行任何程序。這種狀況下,只須要將執行目錄指向網頁目錄便可:
safe_mode_exec_dir = /usr/www
若是您須要在安全模式下包含某些公共文件,您只須要修改如下選項便可:
safe_mode_include_dir = /usr/www/include/
通常狀況下,PHP 腳本中包含的文件都是在程序已經寫好的,能夠根據您的具體須要進行設置。
doc_root = /usr/share/nginx/hml/
上圖是修改後的,訪問的phpinfo.php不在這個目錄下,因此不被解析並訪問
查看日誌,如今不能打開這個php,起到限制php的執行目錄,doc_root目錄之外的php沒法被解析
修改成正確的路徑
doc_root = /usr/share/nginx/html/
重啓pgp-fpm
能夠被解析並訪問
修改/etc/php.ini
open_basedir = /usr/share/nginx/htm/
訪問的phpinfo.php不在上面的目錄下,則禁止訪問
修改成正確路徑則訪問成功
若是您啓用了安全模式,那麼能夠不須要設置函數禁止,但爲了安全考慮,仍是建議您進行相關設置。例如,您不但願執行包括system()
等在內的執行命令的 PHP 函數,以及可以查看 PHP 信息的phpinfo()
等函數,那麼您能夠經過如下設置禁止這些函數:
disable_functions=phpinfo
上面作測試禁用了phpinfo,重啓php-fpm
phpinfo.php裏面使用了這個函數,咱們看下是否能執行
沒有php的信息,函數被禁用了。
暴露給黑客的信息越少,攻擊成功就會越高,php版本也是同樣的,不知道版本就不能針對具體版本進行研究入侵了。
修改/etc/php.ini文件以下
expose_php=off
重啓php-fpm
咱們驗證是否設置成功了,圖片可看出生效了,沒有了php版本信息
display_errors = Off
error_reporting = E_WARNING & E_ERROR
通常 PHP 環境在沒有鏈接到數據庫或者其餘狀況下會有錯誤提示信息,錯誤信息中可能包含 PHP 腳本當前的路徑信息或者查詢的 SQL 語句等信息,這類信息若是暴露給黑客是不安全的,所以建議您禁止該錯誤提示:
修改/etc/php.ini
display_errors = Off
#若是您確實要顯示錯誤信息,必定要設置顯示錯誤信息的級別。例如,只顯示警告以上的錯誤信息:
error_reporting = E_WARNING & E_ERROR
打開錯誤信息提示
關閉錯誤信息提示
對比上面的錯誤信息,打開狀態直接暴露了phpinfo.php的路徑了,給黑客很好的信息了。
在 PHP 環境中提交的變量,包括使用 POST 或者 GET 命令提交的變量,都將自動註冊爲全局變量,可以被直接訪問。這對您的服務器是很是不安全的,所以建議您將註冊全局變量的選項關閉,禁止將所提交的變量註冊爲全局變量。
register_globals = off
注意: 該選項參數在 PHP 5.3 之後的版本中已被移
php5.4之前的版本,有一個自動將進入 PHP 腳本的數據進行轉義的過程。
當打開時,全部的 '(單引號),"(雙引號),*\*(反斜線)和 NULL 字符都會被自動加上一個反斜線進行轉義。這和 addslashes() 做用徹底相同。最好在編碼時不要轉義而在運行時根據須要而轉義,被稱爲魔術引號(Magic Quote),不過php5.4開始就被移除了.
php5.4之前的版本修改配置/etc/php.ini
magic_quotes_gpc = On
https://help.aliyun.com/knowledge_detail/50218.html
https://www.php.net/manual/zh/security.php
http://www.ttlsa.com/safe/php-environment-security-reinforcement-configuration/