1. 程式人生 > 實用技巧 >6月1日

6月1日

11.28 限定某個目錄禁止解析php

對於使用PHP語言編寫的網站,有一些目錄是有需求上傳檔案的,比如伺服器可以上傳圖片,並且沒有做防盜鏈,所以就會被人家當成了一個圖片儲存伺服器,並且盜用頻寬流量。如果網站程式碼有漏洞,讓***上傳了一個用PHP程式碼寫的***,由於網站可以執行PHP程式,最終會讓***拿到伺服器許可權,為了避免這種情況發生,我們需要把能上傳檔案的目錄直接禁止解析PHP程式碼(不用擔心會影響網站訪問,若這種目錄也需要解析PHP,那說明程式設計師不合格)

1.修改虛擬主機配置檔案

vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

新增核心配置如下:

<Directory /data/wwwroot/abc.com/upload>

php_admin_flag engine off

<FilesMatch (.*)\.php(.*)>

Order allow,deny

Deny from all

</FilesMatch>

</Directory>

最終儲存配置:

blob.png

說明:

php_admin_flag engine off//這一段就可以禁止解析PHP程式碼 <FilesMatch (.*)\.php(.*)> //這一段就是讓php的檔案訪問受到限制,防止php檔案的原始碼被檢視

2.再檢查語法載入配置和建立

upload目錄、php檔案

/usr/local/apache2.4/bin/apachectl -t //小技巧(快捷鍵 ctrl+R 再輸入 -t

/usr/local/apache2.4/bin/apachectl graceful

mkdir /data/wwwroot/abc.com/upload

vim /data/wwwroot/abc.com/upload/123.php

3.使用curl測試

curl -x127.0.0.1:80 abc.com/upload/123.php -I

blob.png

返回403,直接限制訪問

3.1 只讓php_admin_flag engine off 生效

blob.png

能訪問但是不能正常解析php

blob.png


11.29 限制user_agent

user_agent可以理解為瀏覽器標識,針對user_agent來限制一些訪問,比如可以限制一些不太友好的搜尋引擎爬蟲,你之所以能在百度搜到一些論壇,就是因為百度會派一些蜘蛛爬蟲過來抓取網站資料。蜘蛛爬蟲抓取資料類似於使用者用瀏覽器訪問網站,當蜘蛛爬蟲太多或者訪問太頻繁,就會浪費伺服器資源。另外,也可以限制惡意請求,這種惡意請求我們通常稱作cc***,他的原理很簡單,就是用很多使用者的電腦同時訪問同一個站點,當訪問量或者頻率達到一定層次,會耗盡伺服器資源,從而使之不能正常提供服務。這種cc***其實有很明顯的規律,其中這些惡意請求的user_agent相同或者相似,那我們就可以通過限制user_agent發揮防***的作用

1.修改虛擬主機配置檔案

vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

新增核心配置如下:

<IfModule mod_rewrite.c>

RewriteEngine on

RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]

RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]

RewriteRule .* - [F]

</IfModule>

最終儲存配置:

blob.png

說明:

RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] //OR是或者的意思, user_agent匹配curl或者匹配baidu.com RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC] //NC是忽略大小寫 RewriteRule .* - [F] //FForbidden

2.再檢查語法和載入配置

/usr/local/apache2.4/bin/apachectl -t

/usr/local/apache2.4/bin/apachectl graceful

3.使用curl測試如下:

curl -x127.0.0.1:80 abc.com/upload/123.php -I //返回403直接禁止訪問

blob.png

4.指定user_agent,如果不指定user_agent,那麼curl作為user_agent會被限制訪問,從上面測試可以看出

curl -A "cfk cfk" -x127.0.0.1:80 abc.com/upload/123.php -I

blob.png

5.檢視一下日誌

tail /usr/local/apache2.4/logs/abc.com-access_20180602.log

blob.png

curl 說明:

使用引數 -A 指定了它的user_agent後就可以訪問。

使用引數 -e 指定referer

使用引數 -x 相對省略本地繫結hosts

使用引數 -I 檢視狀態碼

11.30-11.31 php相關配置

PHP相關配置:

雖然PHP是以httpd一個模組的形式存在,但是PHP本身也有自己的配置檔案。

1. 檢視PHP配置檔案位置

cd /data/wwwroot/abc.com/

vim index.php 輸入以下內容:

<?php

phpinfo();

?>

1.1 網頁訪問:http://47.97.163.117/index.php

blob.png

php.iniPHP的配置檔案,可以看出其在/usr/local/php7/etc/php.ini

1.2 php配置檔案己經載入Loaded Configuration File 如果沒有載入做以下配置:

複製原始碼包裡開發配置檔案

cd /usr/local/src/php-7.1.6

cp php.ini-development /usr/local/php7/etc/php.ini

/usr/local/apache2.4/bin/apachectl graceful

2.PHPdisable_functions限制

PHP有諸多的內建的函式,有一些函式(比如exec)會直接調取linux的系統命令,如果開放將會非常危險,因此,基於安全考慮應該把一些存在安全風險的函式禁掉

2.1編輯php.inin配置檔案,搜尋disable_functions,新增配置

vim /usr/local/php7/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,phpinfo

/usr/local/apache2.4/bin/apachectl graceful

blob.png

2.2測試加上了phpinfo函式,所以訪問index.php時結果無內容顯示:

blob.png

(測試後重新進php.ini配置檔案將 phpinfo去掉,訪問正常)

3.PHP配置檔案定義date.timezone,如果不定義會導致有告警資訊

vim /usr/local/php7/etc/php.ini // 搜尋date.timezone 輸入以下配置

date.timezone = Asia/Shangahi

/usr/local/apache2.4/bin/apachectl graceful

blob.png

4.. 配置 error_log

PHP的日誌對於程式設計師來講非常重要,它是排查問題的重要手段。

如果加上了phpinfo函式後,瀏覽器上訪問http://abccom/index.php 就會有資訊輸出,這樣也暴露的地址目錄,相對來說也不安全,我們需要把報錯資訊也隱藏掉,操作如下:

vim /usr/local/php7/etc/php.ini // 搜尋display_errors 輸入以下配置

display_errors=off

/usr/local/apache2.4/bin/apachectl graceful

blob.png

訪問網址就不會報錯了

blob.png

總結:配置了display_errors = Off後,瀏覽器訪問沒有任何輸出資訊,一片空白,使用curl輸出也是一樣,這樣我們就無法判斷是否有問題,所以需要配置錯誤日誌

4.1 修改配置日誌:

vim /usr/local/php7/etc/php.ini

定義如下: //搜尋log_errors 改為 log_errors =On //搜尋error_log 改為 /tmp/php_errors.log //搜尋error_reporting 改為 error_reporting = E_ALL //搜尋display_errors 改為 display_errors = Off

log_errors要確認開啟:

blob.png

開啟日誌後還要定義對應的儲存路徑:error_log,我們設定在/tmp下

blob.png

定義完路徑後,我們還要對它進行一個級別設定:error_reporting,E_ALL是最不嚴謹的級別:

blob.png

測試一下,發現已經生成了對應的日誌了:

blob.png

blob.png

5. 配置open_basedir

一個伺服器上跑很多網站,小公司為節省成本採用的做法,這樣操作是會有一些弊端:多個網站跑在同一個伺服器上,如果其中一個網站被黑,很有可能會連累到其他站點,為了避免這種尷尬的事情發生,我們應當作一些預防手段。

PHP有一個概念叫作open_basedir,它的作用是將網站限定在指定目錄裡,就算該站點被黑了,***只能在該目錄下面有所作為,而不能左右其他目錄。如果你的伺服器上只有一個站點,那可以直接在php.ini中設定open_basedir引數。但如果伺服器上跑的站點比較多,那在php.ini中設定就不合適了,因為在php.ini中只能定義一次,也就是說所有站點都一起定義限定的目錄,那這樣似乎起不到隔離多個站點的目的。

5.1我們先來建立一個2.php,輸入內容儲存後再來做實驗:

vim /data/wwwroot/abc.com/2.php

<?php

echo "2.php";

?>

vim /usr/local/php7/etc/php.ini //定義open_basedir

open_basedir =/data/wwwroot/abc.com:/tmp

blob.png

5.2測試狀態是正常的就配置生效

curl -A "cfk" -x127.0.0.1:80 abc.com/2.php -I

blob.png

5.3 如果我們定義open_basedir = /data/wwwroot/abcd.com:/tmp 時,我們再來實驗一下:

vim /usr/local/php7/etc/php.ini //定義open_basedir

open_basedir =/data/wwwroot/abcd.com:/tmp

blob.png

/usr/local/apache2.4/bin/apachectl graceful

curl -A "c" -x127.0.0.1:80 abc.com/2.php -I

再來實驗一下,結果是500錯誤:

blob.png



轉載於:https://blog.51cto.com/404006045/2123358