限定某個目錄禁止解析php、限制user_agent、PHP相關配置

限定某個目錄禁止解析php

某個目錄下禁止解析 php,這個頗有用,咱們作網站安全的時候,這個用的不少, 好比某些目錄能夠上傳文件(例如,圖片,視頻,文檔等靜態文件), 黑客能夠經過上傳帶有木馬的文件,而後執行這個文件來攻破咱們的服務器,咱們能夠將該目錄設置禁止PHP解析。這樣就算上傳的文件含有可執行木馬,也不能執行。php

  • 測試目標:禁止PHP解析ccc.com下upload目錄內的文件
  1. 編輯虛擬主機配置文件 vim /usr/local/httpd2.4/conf/extra/httpd-vhosts.conf
  2. 添加如下內容
<Directory /tmp/ccc.com/upload>     
        php_admin_flag engine off                               
</Directory>
  1. 測試一下
  • 在ccc.com下建立目錄upload→mkdir/tmp/ccc.com/upload
  • 在upload下寫一個頁面index.php→vim /tmp/ccc.com/upload/index.php
<?php
phpinfo ();
?>
  • 使用curl -x127.0.0.1:80 www.ccc.com/upload/index.php 測試
[root@localhost ~]# curl -x127.0.0.1:80 www.ccc.com/upload/index.php
<?php
phpinfo ();
?>

能夠看到反饋回來的就是源代碼,根本沒有解析,使用瀏覽器訪問的結果就是這個網頁直接被下載了,根被解析不了。html

  1. 爲了檢測試驗的可信度,咱們把配置文件中的配置註釋掉,看一下反饋信息
[root@localhost ~]# curl -x127.0.0.1:80 www.ccc.com/upload/index.php -I
HTTP/1.1 200 OK
Date: Fri, 24 Aug 2018 01:15:45 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.37
X-Powered-By: PHP/5.6.37
Cache-Control: max-age=0
Expires: Fri, 24 Aug 2018 01:15:45 GMT
Content-Type: text/html; charset=UTF-8

能夠看到,網頁已經被解析了,再使用瀏覽器訪問能夠明顯的看到解析後的頁面 shell

  1. 在上面的實驗中咱們看到,當咱們配置了禁止php解析,反饋給訪問者的信息是這個頁面的源代碼,這個對服務器的安全不是很友好,咱們還能夠經過給這個目錄設置全部php文件都不能訪問來將安全等級升級。
<Directory /tmp/ccc.com/upload>
        php_admin_flag engine off
        <FilesMatch (.*)\.php(.*)>
           Order allow,deny
           deny from all
		   </FilesMatch>
</Directory>
  • 在使用curl訪問就是403 Forbidden了
[root@localhost upload]# curl -x127.0.0.1:80 www.ccc.com/upload/index.php -I
HTTP/1.1 403 Forbidden
Date: Fri, 24 Aug 2018 01:29:08 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.37
Content-Type: text/html; charset=iso-8859-1
  • 使用瀏覽器訪問
  • /upload下的其餘非php的頁面仍然能夠正常訪問

限制user_agent

User-Agent(用戶代理),即不讓哪些瀏覽器或其餘訪問方式來訪問咱們的網站apache

實驗目標:限制user_agent爲curl和google瀏覽器的訪問vim

  • 編輯虛擬主機配置文件 vim /usr/local/apache/conf/extra/httpd-vhosts.conf
  • 在配置文件中添加以下內容
<IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]                   #NC表示忽略大小寫,OR表示或者的意思,上下兩個條件或者
        RewriteCond %{HTTP_USER_AGENT}  .*Chrome* [NC]             #限制user_ragent 爲curl或者Google瀏覽器的進行訪問
        RewriteRule  .*  -  [F]                                                                          #直接F表示,Forbidden
    </IfModule>
  • 配置完成以後,使用curl訪問,反饋的界面是403,使用Google的瀏覽器Chrome也是forbidden,使用IE瀏覽器能夠正常訪問,說明配置生效。另外curl -A是能夠指定代理的,好比curl -A "www.baidu.com" -x127.0.0.1:80/www.ccc.com/upload/test.jpg 指定的代理是www.baidu.com,反饋的代碼就是200,表示能正常訪問。
[root@localhost logs]# curl -x127.0.0.1:80 www.ccc.com/upload/test.jpg
<!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 /upload/test.jpg
on this server.<br />
</p>
</body></html>

PHP相關配置

  • PHP的配置文件存放地址,能夠在phpinfo面查看相關的信息 Loaded Configuration File 指的就是配置文件所在目錄
  • 若是在Loaded Configuration File這一欄顯示的是(none),那麼說明配置文件沒有加載
  • 若是須要啓動配置文件,咱們能夠拷貝模板配置文件,模板配置文件一般在源碼包裏面放置的有,執行命令: cp php.ini-development /usr/local/php/etc/php.ini
  • 拷貝配置文件後須要從新加載下Apache再進行刷新就能夠了
  • 編輯配置文件 vim /usr/local/php/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_clos在咱們測試完以後,業務須要上線的時候,應該把phpinfo也添加進去。
  • 定義date.timezone ,時區 搜索關鍵字:date.timezone 找到以下行:date.timezone= 在後面添加 Asia/Shanghai,將時區定義爲上海
  • 定義錯誤日誌 搜索關鍵字:display_errors=On 將其中的On改成Off, 更改以後錯誤的信息不會輸出到瀏覽器裏面,避免目錄出現暴露,若是不改成off咱們看一下它的錯誤輸出信息: 會將咱們後臺的目錄暴露給訪問者。
  • 定義錯誤日誌存放的地址 錯誤信息不暴露給訪問者,可是管理員須要查看錯誤日誌用以排錯,這就須要配置錯誤日誌的目錄了 首先搜索Log_errors= 賦值On ,意思是開啓錯誤日誌 搜索關鍵字:error_log= 在後面能夠定義錯誤日誌的存放路徑/tmp/php_errors.log
  • 在生產環境中,還須要從新定義一下錯誤日誌的級別,由於默認級別爲E_ALL,會寫入全部的記錄,好比warning ,notice, error等,由於notice信息不少,並且沒有記錄的意義,因此錯誤日誌的級別咱們通常使用E_ALL&~E_NOTICE這個。 搜索error_reporting= 賦值error_reporting=E_ALL&~E_NOTICE 就能夠了。

open_basedir

  • 將 PHP 所能打開的文件限制在指定的目錄樹,包括文件自己。本指令不受安全模式打開或者關閉的影響。瀏覽器

  • 當一個腳本試圖用例如 fopen() 或者 gzopen() 打開一個文件時,該文件的位置將被檢查。當文件在指定的目錄樹以外時 PHP 將拒絕打開它。全部的符號鏈接都會被解析,因此不可能經過符號鏈接來避開此限制。安全

  • 特殊值 . 指明腳本的工做目錄將被做爲基準目錄。但這有些危險,由於腳本的工做目錄能夠輕易被 chdir() 而改變。服務器

  • 在 httpd.conf 文件中中,open_basedir 能夠像其它任何配置選項同樣用「php_admin_value open_basedir none」的方法關閉(例如某些虛擬主機中)。curl

  • 做爲 Apache 模塊時,父目錄中的 open_basedir 路徑自動被繼承。socket

  • 用 open_basedir 指定的限制其實是前綴,不是目錄名。也就是說「open_basedir = /dir/incl」也會容許訪問「/dir/include」和「/dir/incls」,若是它們存在的話。

  • 若是要將訪問限制在僅爲指定的目錄,用斜線結束路徑名。例如:「open_basedir = /dir/incl/」。

  • 針對不一樣的站點設置open_basedir,將用戶可操做的文件限制在某目錄下

  • 編輯虛擬主機配置文件 vim /usr/local/apache/conf/extra/httpd-vhosts.conf

  • 在配置文件裏面添加以下內容便可實現 php_admin_value open_basedir "/tmp/ccc.com:/tmp/"

相關文章
相關標籤/搜索