2019獨角獸企業重金招聘Python工程師標準>>>
限定某個目錄禁止解析php
- 對于使用php語言編寫的網站,有一些目錄是有需求上傳文件的。如果網站代碼有漏洞,讓黑客上傳了一個用PHP寫的木馬,由于網站可以執行PHP程序,最終會讓黑客拿到服務器權限。
為了避免這種情況發生,我們需要把能上傳文件的目錄直接禁止解析PHP代碼
1.編輯虛擬主機配置
#進入虛擬主機配置文件
[root@centos001 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
#增加下列配置
<Directory /data/wwroot/111.com/upload> //把upload目錄下所有的php禁止解析php_admin_flag engine off //表示禁止解析php
## 增加下面的(兩個F之間的)后,所有訪問php都會是403<FilesMatch (.*)\.php(.*)> Order allow,deny Deny from all</FilesMatch>
</Directory>
2.檢查讀寫并重啟服務
[root@centos001 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@centos001 111.com]# /usr/local/apache2.4/bin/apachectl graceful
3.創建需要禁止解析php的目錄,并把1個php文件放在目錄下
[root@centos001 ~]# cd /data/wwroot/111.com/
[root@centos001 111.com]# ls
123.php admin qq.png u=3062734635,4183904616&fm=96.jpg
[root@centos001 111.com]# mkdir upload/
[root@centos001 111.com]# ls
123.php admin qq.png u=3062734635,4183904616&fm=96.jpg upload
#在目錄下創建一個php文件
[root@centos001 111.com]# cp 123.php upload/
4.訪問這個文件,這里顯示了403。當我們訪問另一個目錄的php文件的時候,顯示能直接訪問,所以這個限制解析php是指定了目錄的,不影響我們其它目錄。
[root@centos001 111.com]# curl -x192.168.10.120:80 '111.com/upload/123.php' -I
HTTP/1.1 403 Forbidden
Date: Mon, 08 Jan 2018 16:26:54 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
#當我們訪問其他目錄的php文件
[root@centos001 111.com]# curl -x192.168.10.120:80 '111.com/123.php'
123.com[root@centos001 111.com]#
5.注釋掉后面加的代碼的時候會出現什么狀況呢,開始說到禁止解析php只需要最前面的就可以了。
#進入虛擬主機配置文件并注釋掉<FilesMatch (.*)\.php(.*)> Order allow,deny Deny from all</FilesMatch>
#檢查讀寫并重啟服務
#再次訪問目錄下的php文件
[root@centos001 111.com]# curl -x192.168.10.120:80 '111.com/upload/123.php'
<?php
echo "123.com";
6.這里能看到直接顯示源代碼了,看起來不太美觀
限制user_agent
- **什么是user_agent?**答:可以理解為瀏覽器標識
- 了解cc攻擊 CC是指攻擊者借助代理服務器生成指向受害主機的合法請求,實現DOS和偽裝。CC攻擊主要針對WEB應用程序比較消耗資源的地方進行瘋狂請求,比如,論壇中的搜索功能,如果不加以限制,任由人搜索,普通配置的服務器在幾百個并發請求下,MYSQL服務就會癱瘓
- 為何要限制 user_agent? 答:防止網站被cc攻擊。這種攻擊有很明顯的規律,這些惡意請求的user_agent相同或相似,我們就能通過限制user_agent發揮防攻擊作用
1.修改虛擬主機配置文件。本例意為當user_agent匹配到curl或者baidu.com時,都會觸發規則顯Forbidden
<IfModule mod_rewrite.c> //此處加載了一個模塊RewriteEngine on
#NC表示忽略大小寫,OR表示或者,F相當于ForbiddenRewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]//RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]RewriteRule .* - [F]
</IfModule>
2.檢查讀寫并重啟服務。注:要是沒有加載模塊還要去主配置文件里面加載哦
root@centos001 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@centos001 111.com]# /usr/local/apache2.4/bin/apachectl graceful
3.訪問。因為有curl觸發了規則所以輸出403
[root@centos001 111.com]# curl -x192.168.10.120:80 'http://111.com/123.php'
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /123.php
on this server.<br />
</p>
</body></html>
4.curl -A "123123" 指定user_agent
[root@centos001 111.com]# curl -A "123123" 192.168.10.120:80 '111.com/123.php'
abc.com
PHP相關配置
- 查看php配置文件的位置
- 第一種通過瀏覽器,訪問phpinfo找到配置文件的路徑(最準確)
- 第二種/usr/local/php/bin/php -i|grep -i "loaded configuration file" ;但是有些情況“php -i ”是不準的,因為Apache他是調用了php 的一模塊,而且“php -i” 只是php 的一個程序,它和libphp5.so可能有關系也可能沒有關系;
[root@centos001 ~]# cd /data/wwroot/111.com/
[root@centos001 111.com]# ls
123.php index.php
[root@centos001 111.com]# vi index.php
[root@centos001 111.com]# cat index.php
<?php
phpinfo();
- 有時候瀏覽器能看到配置文件的路徑但是沒有加載。所以我們就要去拷貝一個配置文件
cp php.ini-development /usr/local/php/etc/php.ini
#刷新瀏覽器不成功,可以再重啟下服務
- 這個就是我們的配置文件了/usr/local/php7/etc/php.ini
修改php配置文件
- 1.disable_functions 安全函數,以下函數會直接調去linux系統命令,開放將會很危險,因此要禁掉。
#打開配置文件
vim /usr/local/php7/etc/php.ini
#搜索 disable_functions
#修改成如下
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
#重啟服務
- 示例1:禁用phpinfo。 在安全函數后面添加phpinfo,重啟生效后用瀏覽器訪問。因為不禁止的話,在網頁上就會顯示很多我們的目錄信息。
2. date.timezone 定義時區。
不定義的話有時會出現一些警告信息
#進入配置文件
[root@centos001 111.com]# vim /usr/local/php7/etc/php.ini
#搜索date.timezone
#修改為date.timezone = Asia/Shanghai
#搜索display
修改為display_errors = Off
3.配置error_log
剛才我們禁用phpinfo的時候,瀏覽器輸出了一段錯誤信息。這個就是php開啟了錯誤日志的輸出功能,但是開啟之后呢,我們的有些東西就會泄露出去。所以下面我們將介紹怎么設置錯誤日志的路徑、級別和類型等
#進入配置文件
1.開啟error_log
#搜索 log_errors
修改為log_errors = Off2.定義錯誤日志的文件路徑
#搜索error_log
修改為error_log = /tmp/php_errors.log3.定義錯誤日志的級別,這里我們選擇的是最不嚴謹的。E_NOTICE為生產環境中所選的
#搜索error_reporting
修改為error_reporting = E_ALL
#保存退出后,檢查讀寫并重啟服務。查看路徑有沒有生成,訪問下或者刷新一下網頁
[root@centos001 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@centos001 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@centos001 111.com]# cd /tmp
[root@centos001 tmp]# ls
php_errors.log //生成的文件
查看php_errors.log文件,會看到屬主屬組是daemon
[root@centos001 tmp]# ls -l /tmp/php_errors.log
-rw-r--r--. 1 daemon daemon 432 1月 9 04:53 /tmp/php_errors.log
daemon實際上是httpd的屬主,php_errors.log日志文件是以httpd這個進程的身份去生成的
[root@centos001 tmp]# ps aux |grep httpd
root 2323 0.0 1.4 267872 14384 ? Ss 1月08 0:15 /usr/local/apache2.4/bin/httpd -k start
daemon 24263 0.0 0.8 554700 8644 ? Sl 04:46 0:00 /usr/local/apache2.4/bin/httpd -k start
daemon 24264 0.0 0.8 554700 8644 ? Sl 04:46 0:00 /usr/local/apache2.4/bin/httpd -k start
daemon 24267 0.0 1.1 687884 11172 ? Sl 04:46 0:00 /usr/local/apache2.4/bin/httpd -k start
root 24363 0.0 0.0 112676 984 pts/1 R+ 04:55 0:00 grep --color=auto httpd
- 有時候,定義了一個錯誤日志,但是這個錯誤日志始終沒有生成,那么就需要檢查一下定義錯誤日志所在的目錄,到底httpd有沒有寫權限
- 最保險的辦法,就是在所在目錄創建一個錯誤日志的文件,然后賦予它777的權限,這樣就不需要擔心這個文件httpd是否有寫權限了
[root@centos001 tmp]# grep error_log /usr/local/php/etc/php.ini
; server-specific log, STDERR, or a location specified by the error_log
; Set maximum length of log_errors. In error_log information about the source is
;error_log = php_errors.log
;error_log = syslog
; OPcache error_log file name. Empty string assumes "stderr".
;opcache.error_log=
[root@centos001 tmp]# touch /tmp/php_errors.log ; chmod /tmp/php_errors.log
- 查看錯誤日志文件
[root@centos001 tmp]# cat /tmp/php_errors.log
[09-Jan-2018 04:43:15 Asia/Shanghai] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwroot/111.com/index.php on line 2
open_basedir = /data/wwroot/111.com:/tmp
open_basedir安全相關項
一臺服務器上有多個網站運行,這樣做的弊端是如果其中一個被黑。其它的也有可能被連累
- open_basedir就剛好能解決這個問題,它的作用是將網站限定在指定目錄里,就算被黑也波及不到其他目錄
- php.ini文件中的內容是針對所有虛擬主機進行的配置 1.修改配置文件
[root@centos001 tmp]# vim /usr/local/php7/etc/php.ini
#搜索open_basedir
修改為open_basedir = /data/wwroot/111.com:/tmp
2.檢查讀寫并重啟服務
3.正常訪問的話,直接就能訪問
4.若是服務器上跑了N多個站點,那應該怎么去做限制呢?
應該針對站點,這些網站去做open_basedir ,但php.ini是做不到的,因為php.ini是針對所有站點的 但我們可以在虛擬主機配置文件中設置,在apache虛擬主機配置文件中去設置/usr/local/apache2.4/conf/extra/httpd-vhosts.conf
[root@centos001 tmp]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
#增加 保存并退出
php_admin_value open_basedir "/data/wwroot/111.com:/tmp/"
擴展
apache開啟壓縮 http://ask.apelearn.com/question/5528
apache2.2到2.4配置文件變更 http://ask.apelearn.com/question/7292
apache options參數 http://ask.apelearn.com/question/1051
apache禁止trace或track防止xss http://ask.apelearn.com/question/1045
apache 配置https 支持ssl http://ask.apelearn.com/question/1029