1. 程式人生 > >6月1日

6月1日

linux

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>

最終保存配置:

技術分享圖片

說明:

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

技術分享圖片

返回403,直接限制訪問

3.1 只讓 php_admin_flag engine off 生效

技術分享圖片

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

技術分享圖片


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>

最終保存配置:

技術分享圖片

說明:

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直接禁止訪問

技術分享圖片

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

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

技術分享圖片

5.查看一下日誌

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

技術分享圖片

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

技術分享圖片

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

技術分享圖片

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

技術分享圖片

(測試後重新進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

技術分享圖片

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

技術分享圖片

訪問網址就不會報錯了

技術分享圖片

總結:配置了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要確認開啟:

技術分享圖片

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

技術分享圖片

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

技術分享圖片

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

技術分享圖片

技術分享圖片

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

技術分享圖片

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

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

技術分享圖片

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

技術分享圖片

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

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

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

技術分享圖片



6月1日