有這樣一個案例:一個網站的用戶信息被發現泄漏了,剛提交了新的用戶手機號碼,過一會就有人打電話來營銷。php
根據分析有多是SQL注入得到權限,把查詢SQL提交到了服務器上得到後臺數據(能夠在網站入口的地方,增長特殊符號的過濾,能夠阻斷SQL注入的漏洞)。shell
再仔細排查:一、監控數據庫查詢,抓包。每隔一分鐘抓包一次,保存到文件中分析。抓到能夠的SQL查詢,與網站上的原生的SQL查詢不同,定位到時間點,再去看訪問日誌。數據庫
二、訪問日誌有個很是明顯的請求,是執行 在圖片上傳upload目錄下的某個php文件。查看代碼發現是一句話木馬,從而得到了服務器的權限。瀏覽器
三、咱們能夠把該上傳文件的目錄(網站的入口),禁止php解析。安全
<Directory /data/wwwroot/111.com/upload> php_admin_flag engine off </Directory>
禁止解析php後,訪問該目錄下的php文件時,只會返回該php文件的源代碼。服務器
四、還能夠再加多一層防禦:使用訪問控制,禁止訪問該目錄下的php文件curl
<FilesMatch (.*)\.php(.*)> Order allow,deny Deny from all </FilesMatch>
設定訪問控制後,直接會返回403 Forbidden狀態碼。socket
user_agent能夠理解爲瀏覽器標識,限制他能夠防止CC攻擊(用軟件或者肉雞)函數
配置以下:網站
<IfModule mod_rewrite.c> //使用rewrite模塊 ReWriteEngin on //打開模塊 ReWriteCond %{HTTP_USER_AGENT} .*curl+[NC,OR] //定義條件 [NC]忽略大小寫,[OR] 兩個條件或匹配 ReWriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC] //定義條件 ReWriteRule .* -[F] //定義規則,[F] 是禁止。 </IfModule>
驗證:
curl -A 「abcde」 -x127.0.0.1:80 '111.com/1.php'
-A選項:指定user_agent。
查看php配置文件的位置:
/usr/local/php/bin/php -i |grep -i "loaded configuretion file" //這個方法有時候不太準確
最好使用phpinfo()函數查看:在網站目錄新建一個phpinfo函數的文件,經過瀏覽器訪問
若是沒有加載php.ini,就從源碼包裏複製一個到/usr/local/php/etc/ 下
修改/usr/local/php/etc/php.ini 配置文件: 一、禁用函數:禁用掉一些比較有風險的函數
disable_functions=eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close
二、設置時區:
date.timezone=Aisa/ShangHai
三、錯誤日誌相關設置:
display_errors=off //不顯示錯誤信息,防止網站目錄暴露 log_errors=on //打開php錯誤日誌 error_log=/tmp/php.errors.log //定義錯誤日誌的存放路徑。權限要777 error_reporting =E_ALL & -E_NOTICE //定義日誌信息的級別
若是定義了日誌存放目錄,可是沒有生成,檢測日至目錄是否有寫入權限,寫入的用戶是Apache的進程運行用戶,daemon。
四、安全相關的:站點目錄
若是有多個站點運行在一臺服務器中,當A站點被黑,只可以在A站點的目錄下操做,不會影響其餘站點的目錄。可使用open_basedir。
open_basedir=/data/wwwroot/111.com:/tmp //若是是在php.ini下定義,只能定義一個open_basedir,是針對全部站點和臨時目錄
若是要對每一個站點單獨限定相互隔離,能夠在httpd-vhosts.conf 下,在每一個虛擬主機的配置段裏定義:
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp"