十一週二次課

十一週二次課php

11.28限制某個目錄禁止解析PHPcss

11.29限制user_agenthtml

11.30/11.31PHP相關配置mysql

11.28限制某個目錄禁止解析PHPlinux

• 核心配置文件內容web

    <Directory /data/wwwroot/www.123.com/upload>sql

        php_admin_flag engine offshell

    </Directory>數據庫

• curl測試時直接返回了php源代碼,並未解析apache

案例

  • 假設有一個目錄是能夠上傳圖片,可是可能被有心之人上傳php文件上去,由於httpd開放了php模塊,因此若是被人上傳了木馬文件(php類型),httpd就有可能會進行執行,一旦執行,就會讓對方得到咱們服務器的root權限,或者是被惡意刪除或修改一些參數,致使服務器癱瘓或者是被攻擊。
  • 案例:
    • 一臺服務器,網站被入侵,但不知道是什麼緣由,不知道怎麼入侵的,也不知道入侵到什麼程度,只知道他們公司的數據庫泄露了,數據是一些電話號碼,黑客並無去刪除數據,由於他知道這個服務器的數據庫裏,電話號碼天天都在增加,它就能夠源源不斷的得到新的電話號碼,得到的電話號碼能夠賣給第三方。
  • 分析:
    • 把一個沒有在這個服務器提交過的電話號碼,在這個服務器的網站上提交一次,結果,立刻就有人打電話過來,證實,黑客得到電話號碼,到打電話給新的用戶,這套體系,已經徹底自動化了(天天都會去抓取一個新的電話號碼來隊列,而後立刻賣給第三方,第三方立刻打電話給這個用戶),因此就猜想,網站的程序(php)存在漏洞。另外一種可能就是sql注入的漏洞(能夠把查詢的sql經過一些特殊的提交,提交到服務器上,服務器就會把這個sql語句轉換成正常的查詢,最終得到一些數據回來);可是sql注入漏洞,很容易修復,只要在網站提交的入口,增長一些特殊符號的過濾,就能徹底的阻斷sql注入的漏洞。
  • 解決方法:
    • 首先抓包,監控數據庫的查詢,由於電話號碼是經過查詢了數據庫來的,寫一個死循環的腳本,每隔一分鐘抓一次查詢數據,抓完之後生成一個日誌文件。
    • 查看日誌之後,發現有一條sql查詢,和網站源生的查詢不同,經過日誌定位到了時間點,而後就去web服務器上查看時間點的訪問日誌,經過日誌查看到了一個很是特殊的請求,名字是以php結尾的文件,並且這個php文件是在圖片的目錄下進行訪問的,而後去查看這個php 文件,發現這個文件內容(一句話木馬),是獲取服務器的權限,至關於在服務器開了一個後門;這個問題產生的根本緣由,就是由於上傳圖片目錄並無禁止解析php。在這個目錄中上傳了一個一句話木馬,PHP文件,經過瀏覽器訪問這個1.php,拿到了更高的權限,最終把數據庫的權限拿到,去查詢了他想要的數據。爲了不這種狀況的發生,把上傳圖片的這個目錄作一個禁止PHP解析,這樣即使上傳了一句話木馬,可是不能解析,解析不了就得到不了權限。

sql注入

  • 所謂SQL注入,就是經過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來講,它是利用現有應用程序,將(惡意的)SQL命令注入到後臺數據庫引擎執行的能力,它能夠經過在Web表單中輸入(惡意)SQL語句獲得一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。[1] 好比先前的不少影視網站泄露VIP會員密碼大多就是經過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊..

訪問控制 – 禁止php解析

1.打開虛擬主機主機配置文件

[root@tianqi-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

//把代碼放到配置文件中

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/abc.com"
    ServerName abc.com
    ServerAlias www.abc.com www.123.com
    ErrorLog "logs/abc.com-error_log"
    CustomLog "logs/abc.com-access_log" common
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/111.com"
    ServerName 111.com
    ServerAlias www.example.com 2111.com.cn
   # <Directory /data/wwwroot/111.com>
   #<FilesMatch 123.php>
        #AllowOverride AuthConfig
        #AuthName "111.com user auth"
        #AuthType Basic
        #AuthUserFile /data/.htpasswd
        #require valid-user
    #</FilesMatch>
    <Directory /data/wwwroot/111.com/upload> ##把upload目錄下全部的php禁止解析
        php_admin_flag engine off    //禁止解析php
        <FilesMatch (.*)\.php(.*)>    //如今這裏全部訪問php都會是403
        Order allow,deny    //若是不作這個deny,就會直接訪問到源代碼,這樣就不太友好
        Deny from all
        </FilesMatch>
    </Directory>

    <Directory /data/wwwroot/111.com>
        <FilesMatch  "admin.php(.*)">
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
        </FilesMatch>
    </Directory>
    <Directory /data/wwwroot/111.com>
        SetEnvIfNoCase Referer "http://111.com" local_ref
        SetEnvIfNoCase Referer "http://ask.apelearn.com" local_ref
        SetEnvIfNoCase Referer "^$" local_ref
        <FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
            Order Allow,Deny
            Allow from env=local_ref
        </FilesMatch>
    </Directory>
    SetEnvIf Request_URI ".*\.gif$" img
    SetEnvIf Request_URI ".*\.jpg$" img
    SetEnvIf Request_URI ".*\.png$" img
    SetEnvIf Request_URI ".*\.bmp$" img
    SetEnvIf Request_URI ".*\.swf$" img
    SetEnvIf Request_URI ".*\.js$" img
    SetEnvIf Request_URI ".*\.css$" img
    CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img
</VirtualHost>

2.檢查配置文件是否存在語法錯誤,並從新加載配置文件

[root@tianqi-01 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 ~]# 

3.建立upload目錄,新建php文件

[root@tianqi-01 111.com]# mkdir upload
[root@tianqi-01 111.com]# ls

123.php  admin  eagle1.jpg  index.php  upload
[root@tianqi-01 111.com]# cp 123.php upload/
[root@tianqi-01 111.com]# 

4.curl訪問

[root@tianqi-01 111.com]# curl -x127.0.0.1:80 '111.com/upload/123.php' -I
HTTP/1.1 403 Forbidden
Date: Mon, 05 Mar 2018 13:28:50 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1

[root@tianqi-01 111.com]# 

5.這時再去虛擬主機配置文件中註銷掉FilesMatch

[root@tianqi-01 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

   <Directory /data/wwwroot/111.com/upload>
        php_admin_flag engine off    //把upload目錄下的全部php禁止解析
        #<FilesMatch (.*)\.php(.*)>
        #Order allow,deny
        #Deny from all
        #</FilesMatch>
    </Directory>

而後保存退出

6.檢查配置文件是否存在語法錯誤,並從新加載配置文件

[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 111.com]# 

7.這時候訪問php,會發現沒法解析php

[root@tianqi-01 111.com]# curl -x127.0.0.1:80 'http://111.com/upload/123.php'
<?php
echo "123.php";
[root@tianqi-01 111.com]# 

8.在瀏覽器中訪問http://111.com/upload/123.php,會提示直接下載,這是由於沒法解析php

9.這時候再打開虛擬主機配置文件,取消FilesMatch註釋

[root@tianqi-01 111.com]# !vim
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

<Directory /data/wwwroot/111.com/upload>
        php_admin_flag engine off
        <FilesMatch (.*)\.php(.*)>
        Order allow,deny
        Deny from all
        </FilesMatch>
    </Directory>

10.檢查配置文件是否存在語法錯誤並從新加載配置文件

[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 111.com]# 

11.這時再去瀏覽器訪問php,會直接顯示Forbidden

12.即便去訪問一個不存在的php文件,也會顯示顯示Forbidden

總結

  • 禁止php解析操做,其實就是爲了服務器更加安全,特別是針對能夠寫的目錄;
  • 可寫的目錄,通常(99%)是不須要解析php,這個須要牢記,通常靜態文件存放的目錄是不容許解析php 的。

11.29限制user_agent

• user_agent能夠理解爲瀏覽器標識

• 核心配置文件內容

   <IfModule mod_rewrite.c>

        RewriteEngine on

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

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

        RewriteRule  .*  -  [F]

    </IfModule>

• curl -A "123123" 指定user_agent

經常使用知識介紹

  • 有時候,網站會受到一種叫 cc 攻擊,CC攻擊就是黑客,經過軟件,肉雞同時去訪問一個站點,超過服務器的併發,就會致使站點宕機;經過肉雞,軟件去訪問站點,就是普通的訪問,沒有什麼特殊的,只是讓站點超過併發致使嚴重超負荷而宕機,因此沒辦法去進行控制;所謂CC攻擊都會有一個規律的特徵,就是user_agent是一致的,好比同一個IP、同一個標識、同一個地址;遇到這種規律的user_agent頻繁訪問的狀況咱們就能夠斷定他就是CC攻擊,咱們就能夠經過限制他的user_agent 減輕服務器壓力,只須要讓他從正常訪問的200,限制爲403,就能減輕服務器的壓力,由於403僅僅是一個請求,只會使用到不多的帶寬,畢竟他沒有牽扯到php 和mysql

  • cc攻擊

    • 攻擊者藉助代理服務器生成指向受害主機的合法請求,實現DDOS和假裝就叫:CC(ChallengeCollapsar)。
    • CC主要是用來攻擊頁面的。你們都有這樣的經歷,就是在訪問論壇時,若是這個論壇比較大,訪問的人比較多,打開頁面的速度會比較慢,訪問的人越多,論壇的頁面越多,數據庫壓力就越大,被訪問的頻率也越高,佔用的系統資源也就至關可觀。
    • 一個靜態頁面不須要服務器多少資源,甚至能夠說直接從內存中讀出來發給你就能夠了,可是論壇就不同了,我看一個帖子,系統須要到數據庫中判斷我是否有讀帖子的權限,若是有,就讀出帖子裏面的內容,顯示出來——這裏至少訪問了2次數據庫,若是數據庫的數據容量有200MB大小,系統極可能就要在這200MB大小的數據空間搜索一遍,這須要多少的CPU資源和時間?若是我是查找一個關鍵字,那麼時間更加可觀,由於前面的搜索能夠限定在一個很小的範圍內,好比用戶權限只查用戶表,帖子內容只查帖子表,並且查到就能夠立刻中止查詢,而搜索確定會對全部的數據進行一次判斷,消耗的時間是至關的大。
    • CC就是充分利用了這個特色,模擬多個用戶(多少線程就是多少用戶)不停的進行訪問(訪問那些須要大量數據操做,就是須要大量CPU時間的頁面).這一點用一個通常的性能測試軟件就能夠作到大量模擬用戶併發。
  • 肉雞 (受黑客遠程控制的電腦)

    • 肉雞也稱傀儡機,是指能夠被黑客遠程控制的機器。好比用」灰鴿子」等誘導客戶點擊或者電腦被黑客攻破或用戶電腦有漏洞被種植了木馬,黑客能夠隨意操縱它並利用它作任何事情。
    • 肉雞一般被用做DDOS攻擊。能夠是各類系統,如windows、linux、unix等,更能夠是一家公司、企業、學校甚至是政府軍隊的服務器。

1.打開虛擬主機配置文件

  • 在兩個條件中用OR作了一個鏈接符,理解起來就是 匹配第一條規則或者第二條規則;若是不加OR就是而且的意思,必須兩個條件同時匹配之後纔會執行
  • NC表示忽略大小寫,由於user_agent,可能會是大寫的,好比:Mozilla/5.0,他首字母就是大寫的
  • RewriteRule .* - [F] 這裏的F表示Forbidden

[root@tianqi-01 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/abc.com"
    ServerName abc.com
    ServerAlias www.abc.com www.123.com
    ErrorLog "logs/abc.com-error_log"
    CustomLog "logs/abc.com-access_log" common
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/111.com"
    ServerName 111.com
    ServerAlias www.example.com 2111.com.cn
   # <Directory /data/wwwroot/111.com>
   #<FilesMatch 123.php>
        #AllowOverride AuthConfig
        #AuthName "111.com user auth"
        #AuthType Basic
        #AuthUserFile /data/.htpasswd
        #require valid-user
    #</FilesMatch>
    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]
        RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC]
        RewriteRule  .*  -  [F]
    </IfModule>

2.而後檢查配置文件是否存在語法錯誤,並從新加載配置文件

[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 111.com]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 111.com]# 

3.去訪問的時候,會顯示403,這是由於限制了user_agent

[root@tianqi-01 111.com]# curl -x127.0.0.1:80 '111.com/upload/123.php' -I
HTTP/1.1 403 Forbidden
Date: Tue, 06 Mar 2018 01:04:51 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1

[root@tianqi-01 111.com]# curl -x127.0.0.1:80 '111.com/123.php' -I
HTTP/1.1 403 Forbidden
Date: Tue, 06 Mar 2018 01:05:02 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1

[root@tianqi-01 111.com]# 

4.查看訪問日誌

[root@tianqi-01 111.com]# tail /usr/local/apache2.4/logs/111.com-access_20180306.log
127.0.0.1 - - [06/Mar/2018:08:40:44 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:08:42:52 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:08:43:10 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:08:59:56 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:12 +0800] "GET HTTP://111.com/upload/123.php HTTP/1.1" 403 223 "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:33 +0800] "HEAD HTTP://111.com/123.php HTTP/1.1" 200 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:39 +0800] "GET HTTP://111.com/123.php HTTP/1.1" 200 7 "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:04:51 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:09:05:02 +0800] "HEAD HTTP://111.com/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
[root@tianqi-01 111.com]# 

5.測試是不是由於user_agent纔會被信任的

6.首先自定義user_agent

  • curl -A,去自定義

//模擬user_agent,去訪問會看到狀態嗎爲200,能夠正常訪問

[root@tianqi-01 111.com]# curl -A "tianqi tianqi" -x127.0.0.1:80 '111.com/123.php' -I
HTTP/1.1 200 OK
Date: Tue, 06 Mar 2018 01:09:02 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8

[root@tianqi-01 111.com]# curl -A "tianqi tianqi" -x127.0.0.1:80 '111.com/123.php'
123.php[root@tianqi-01 111.com]# 

7.查看訪問日誌,會看到user_agent是tianqi tianqi 

123.php[root@tianqi-01 111.com]# !tail
tail /usr/local/apache2.4/logs/111.com-access_20180306.log

127.0.0.1 - - [06/Mar/2018:08:42:52 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:08:43:10 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:08:59:56 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:12 +0800] "GET HTTP://111.com/upload/123.php HTTP/1.1" 403 223 "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:33 +0800] "HEAD HTTP://111.com/123.php HTTP/1.1" 200 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:00:39 +0800] "GET HTTP://111.com/123.php HTTP/1.1" 200 7 "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:04:51 +0800] "HEAD HTTP://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:09:05:02 +0800] "HEAD HTTP://111.com/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [06/Mar/2018:09:09:02 +0800] "HEAD HTTP://111.com/123.php HTTP/1.1" 200 - "-" "tianqi tianqi"
127.0.0.1 - - [06/Mar/2018:09:09:13 +0800] "GET HTTP://111.com/123.php HTTP/1.1" 200 7 "-" "tianqi tianqi"
[root@tianqi-01 111.com]# 

curl命令

  • curl命令是一個利用URL規則在命令行下工做的文件傳輸工具
    • -A ,指定user-agent,設置用戶代理髮送給服務器
    • -e ,指定referer,就是來源網址
    • -I ,僅僅查看它的狀態碼
    • -x ,在指定的端口上使用HTTP代理

11.30/11.31PHP相關配置

  • 查看php配置文件位置
  • /usr/local/php/bin/php -i|grep -i "loaded configuration file"
  • date.timezone
  • 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
  • error_log, log_errors, display_errors, error_reporting
  • open_basedir
  • php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"

PHP相關配置

  • 查看php配置文件的位置
    • 經過瀏覽器,訪問phpinfo找到配置文件的路徑
    • 也能夠用/usr/local/php/bin/php -i |grep -i 「loaded configuration file」找到他的路徑;可是有些狀況「php -i 」是不許的,由於Apache它是調用了php 的模塊,並且「php -i」 只是php 的一個程序,它和libphp5.so可能有關係也可能沒有關係;
  • 案例:
    • 有時改了php.ini,改動了也重啓了服務,結果配置仍是不生效;由於使用「php -i」 找到的配置文件和在web上的phpinfo找到的php.ini不是同一個,若是想要準確的找到php.ini配置文件,就在對應的站點目錄下,建立一個phpinfo的php文件,在web上打開,在phpinfo上找到的,纔是最準確的

[root@tianqi-01 111.com]# ls
123.php  admin  eagle1.jpg  index.php  upload
[root@tianqi-01 111.com]# vim index.php

<?php
phpinfo();

在瀏覽器中打開111.com/index.php

//配置文件並無加載,下載去複製一個

[root@tianqi-01 111.com]# cd /usr/local/src/php-7.1.6
[root@tianqi-01 php-7.1.6]# cp php.ini-development /usr/local/php7/etc/php.ini
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful

[root@tianqi-01 php-7.1.6]# 

此時再去瀏覽器中打開111.com/index.php,會看到配置文件已經有了,因此phpinfo是最準的。

  • 設置安全函數
    • disable_functions //安全函數
    • eval 以前提到的一句話木馬涉及到的函數,若是把這個函數禁用,那麼那個木馬將不會生效
  • 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 以上是比較危險的函數

設置PHP文件

1.打開php文件,禁掉一些危險的函數(默認裏面是空的)

[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini

//搜索disable_functions,在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,phpinfo

  • 固然也能夠把phpinfo 禁掉,不少企業在生產環境都會禁掉,由於phpinfo涉及到服務器不少php 的配置相關,若是一不當心上傳到了線上,那麼久很容易被黑客查到,進行對應的攻擊。

2.查看是否存在語法錯誤,並從新加載配置文件

[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]# 

3.再去瀏覽器訪問111.com/123.php,會看到phpinfo被禁掉了

4.還須要使用phpinfo,因此在此編輯配置文件,在disable_functions後面去掉phpinfo,檢查語法錯誤並從新加載配置文件

[root@tianqi-01 php-7.1.6]# 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

[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]# 

5.編輯php配置文件

  • 定義data.timezone時區,若是不定義,有時候會有告警信息
  • display_errors=On(On顯示,Off不顯示),這樣設置就會把錯誤的信息直接顯示在瀏覽器上,這樣就會把目錄給暴露出來,因此這裏就更改爲display_errors=Off。

[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini

//搜索timezone

在date.timezone定義時區

//須要刪除分號;

date.timezone = Asia/Shanghai

//搜索display

//須要刪除分號;

將display_errors = On改成display_errors = Off

將disable_functions=後面加上phpinfo,繼續作實驗

6.檢查配置文件是否存在語法錯誤,並從新加載配置文件

[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]# 

7.這時候再去用瀏覽器訪問111.com/index.php,會看到的是白頁,這就是由於display_errors=Off

8.用curl試一下

[root@tianqi-01 php-7.1.6]# curl -x127.0.0.1:80 http://111.com/index.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 /index.php
on this server.<br />
</p>
</body></html>
[root@tianqi-01 php-7.1.6]# 

如今看到的狀態碼仍是403,由於此時限制了user_agent。

[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/index.php
[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/index.php -I

HTTP/1.1 200 OK
Date: Tue, 06 Mar 2018 02:33:32 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8

[root@tianqi-01 php-7.1.6]# 

沒有任何的輸出,就是白頁這就有問題了,由於不顯示任何內容,一切都是未知的。

9.打開配置文件

  • 定義錯誤日誌log_errors = On-->On表示打開
  • 定義錯誤日誌文件路徑error_log=/tmp/php_errors.log
  • error_reporting = E_ALL,定義日誌的級別,默認是ALL,表示把全部的errors都記錄下來,這是最不嚴謹的
    • 在生產環境中,使用; E_ALL & ~E_NOTICE (Show all errors, except for notices)

[root@tianqi-01 php-7.1.6]# !vim
vim /usr/local/php7/etc/php.ini

搜索log_errors,log_errors = On,將錯誤日誌文件打開

搜索/error_log,將錯誤日誌文件定義到tmp目錄下

將;error_log = php_errors.log改成error_log=/tmp/php_errors.log,去掉分號;。

搜索error_reporting,定義日誌級別

; error_reporting
;   Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
;   Development Value: E_ALL
;   Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT

按n鍵查找下一個

error_reporting = E_ALL

保存退出

10.檢查配置配置文件是否存在語法錯誤,並從新加載配置配置文件

[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]# 

11.這時再去訪問一遍,會看到tmp目錄下生成了php_errors.log

[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/index.php
[root@tianqi-01 php-7.1.6]# ls /tmp/

pear
php_errors.log
systemd-private-10939be3906d4885a694c9ccaa969513-vgauthd.service-up8a1e
systemd-private-10939be3906d4885a694c9ccaa969513-vmtoolsd.service-qrMrpr
systemd-private-42380971d6c34175aa4f900510bf7f60-vgauthd.service-Wj57Dr
systemd-private-42380971d6c34175aa4f900510bf7f60-vmtoolsd.service-EC3gse
systemd-private-491ebf486ca940d885ed9348c17675f5-vgauthd.service-3sBthy
systemd-private-491ebf486ca940d885ed9348c17675f5-vmtoolsd.service-sJ80kS
systemd-private-70996ce584314349997855a51a9da3d4-vgauthd.service-fehOdP
systemd-private-70996ce584314349997855a51a9da3d4-vmtoolsd.service-WZC9Q4
systemd-private-74b18b5fecc548f1ac450ce1fea7233b-vgauthd.service-DBvBHm
systemd-private-74b18b5fecc548f1ac450ce1fea7233b-vmtoolsd.service-AjXoy6
systemd-private-8531739ab5bb4905a63c0a8665d16b3b-vgauthd.service-vh8gyS
systemd-private-8531739ab5bb4905a63c0a8665d16b3b-vmtoolsd.service-koi7xB
systemd-private-9644814bb86e455d8e911deb7225488b-vgauthd.service-KLJ6Yc
systemd-private-9644814bb86e455d8e911deb7225488b-vmtoolsd.service-g2bpAg
systemd-private-aa279ed589d542bcbc4f2903687ce469-vgauthd.service-xDYbZY
systemd-private-aa279ed589d542bcbc4f2903687ce469-vmtoolsd.service-tTo26l
[root@tianqi-01 php-7.1.6]# 

12.查看php_errors.log,會看到屬主屬組是daemon

[root@tianqi-01 php-7.1.6]# ll /tmp/php_errors.log
-rw-r--r-- 1 daemon daemon 145 Mar  6 11:07 /tmp/php_errors.log
[root@tianqi-01 php-7.1.6]# 

13.deamon其實是httpd的屬主,php_errors.log日誌文件是以httpd這個進程的身份去生成的

[root@tianqi-01 php-7.1.6]# ps aux |grep httpd
root       1113  0.0  1.3 258888 13628 ?        Ss   08:39   0:00 /usr/local/apache2.4/bin/httpd -k graceful
daemon     1886  0.0  1.2 545716 12428 ?        Sl   11:07   0:00 /usr/local/apache2.4/bin/httpd -k graceful
daemon     1887  0.0  1.0 545716 10404 ?        Sl   11:07   0:00 /usr/local/apache2.4/bin/httpd -k graceful
daemon     1888  0.0  1.4 613364 14868 ?        Sl   11:07   0:00 /usr/local/apache2.4/bin/httpd -k graceful
root       1977  0.0  0.0 112660   984 pts/0    S+   11:11   0:00 grep --color=auto httpd
[root@tianqi-01 php-7.1.6]# 

  • 有時候,定義了一個錯誤日誌,可是這個錯誤日誌始終沒有生成,那麼就須要檢查一下定義錯誤日誌所在的目錄,到底httpd有沒有寫權限;
  • 最保險的辦法,就是在所在目錄建立一個錯誤日誌的文件,而後賦予它777的權限,這樣就不須要擔憂這個文件httpd是否有寫權限了。

[root@tianqi-01 111.com]# grep error_log /usr/local/php7/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 = /tmp/php_errors.log
;error_log = syslog
; OPcache error_log file name. Empty string assumes "stderr".
;opcache.error_log=
[root@tianqi-01 111.com]# 

  • 能夠先建立好/tmp/php_errors.log文件,而後賦予chmod 777權限

14.查看文件日誌

[root@tianqi-01 111.com]# cat /tmp/php_errors.log
[06-Mar-2018 11:33:18 Asia/Shanghai] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[root@tianqi-01 111.com]# 

15.下面模擬一個錯誤

[root@tianqi-01 111.com]# vim /data/wwwroot/111.com/2.php

<?php
echo 123;
dgebszfhasdf

16.訪問2.php,會出現一些錯誤

[root@tianqi-01 111.com]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php
[root@tianqi-01 111.com]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php -I

HTTP/1.0 500 Internal Server Error
Date: Tue, 06 Mar 2018 06:08:02 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Connection: close
Content-Type: text/html; charset=UTF-8

[root@tianqi-01 111.com]# 

一樣是一個白頁,只不過這個白頁的狀態碼是500

17.看一下錯誤日誌

[root@tianqi-01 111.com]# cat /tmp/php_errors.log 
[06-Mar-2018 11:33:18 Asia/Shanghai] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[06-Mar-2018 13:56:54 Asia/Shanghai] PHP Parse error:  syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
[06-Mar-2018 14:08:02 Asia/Shanghai] PHP Parse error:  syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
[root@tianqi-01 111.com]# 

這裏是syntax error,比warning的級別更高

安全相關的參數

  • 一臺服務器上,運行了多個站點,有一臺服務器假如代碼有問題,結果這個站點被黑客攻擊了,被黑客拿到了權限,黑客拿了權限確定會繼續往裏滲透,就會有可能滲透到其餘的站點,同時致使其它的站點被黑;
  • open_basedir,它是一個安全選項,A網站在A目錄下,B網站在B目錄下,這兩個目錄會作一個隔離,即便說A網站被黑了,最多也就黑一下A目錄,其它目錄看不到也進不去,也不會有權限進去,這就是open_basedir的做用。即便說服務器上只有一個網站,open_basedir限制也是頗有必要的,網站一旦被黑,就會可能致使黑客到其它目錄作壞事,限制了之後,即便這個目錄被黑了,也只能在這個目錄下搞事情;
  • php.ini文件中的內容是針對全部虛擬主機進行的配置!!!

1.打開php配置文件

[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini

//搜索open_basedir,並刪除分號;

open_basedir=/data/wwwroot/1111.com:/tmp        //若是限制錯了,限制成1111.com:

而後保存退出

2.查看配置文件是否存在語法錯誤,並從新加載配置文件

[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]# 

3.用curl訪問2.php

[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.0 500 Internal Server Error
Date: Wed, 07 Mar 2018 11:05:42 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Connection: close
Content-Type: text/html; charset=UTF-8

[root@tianqi-01 php-7.1.6]# 

4.如今改正2.php,去掉第3行的亂碼

[root@tianqi-01 php-7.1.6]# vim /data/wwwroot/111.com/2.php

<?php
echo 123;

保存退出

5.再次用curl訪問2.php,狀態碼仍是500

[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.0 500 Internal Server Error
Date: Wed, 07 Mar 2018 11:08:06 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Connection: close
Content-Type: text/html; charset=UTF-8

[root@tianqi-01 php-7.1.6]# 

6.查看錯誤輸出

[root@tianqi-01 php-7.1.6]# cat /tmp/php_errors.log
[06-Mar-2018 11:33:18 Asia/Shanghai] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[06-Mar-2018 13:56:54 Asia/Shanghai] PHP Parse error:  syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
[06-Mar-2018 14:08:02 Asia/Shanghai] PHP Parse error:  syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
[07-Mar-2018 19:03:19 Asia/Shanghai] PHP Warning:  Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/index.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:03:19 Asia/Shanghai] PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:03:19 Asia/Shanghai] PHP Fatal error:  Unknown: Failed opening required '/data/wwwroot/111.com/index.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[07-Mar-2018 19:04:20 Asia/Shanghai] PHP Warning:  Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/index.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:04:20 Asia/Shanghai] PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:04:20 Asia/Shanghai] PHP Fatal error:  Unknown: Failed opening required '/data/wwwroot/111.com/index.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[07-Mar-2018 19:04:24 Asia/Shanghai] PHP Warning:  Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/index.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:04:24 Asia/Shanghai] PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:04:24 Asia/Shanghai] PHP Fatal error:  Unknown: Failed opening required '/data/wwwroot/111.com/index.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[07-Mar-2018 19:04:42 Asia/Shanghai] PHP Warning:  Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/2.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:04:42 Asia/Shanghai] PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:04:42 Asia/Shanghai] PHP Fatal error:  Unknown: Failed opening required '/data/wwwroot/111.com/2.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[07-Mar-2018 19:05:42 Asia/Shanghai] PHP Warning:  Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/2.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:05:42 Asia/Shanghai] PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:05:42 Asia/Shanghai] PHP Fatal error:  Unknown: Failed opening required '/data/wwwroot/111.com/2.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[07-Mar-2018 19:08:06 Asia/Shanghai] PHP Warning:  Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/2.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[07-Mar-2018 19:08:06 Asia/Shanghai] PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[07-Mar-2018 19:08:06 Asia/Shanghai] PHP Fatal error:  Unknown: Failed opening required '/data/wwwroot/111.com/2.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
[root@tianqi-01 php-7.1.6]# 

7.從新編輯配置文件,將1111.com改成111.com

[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini

open_basedir = /data/wwwroot/1111.com:/tmp改成

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

保存並退出

8.查看配置文件是否存在語法錯誤,並從新加載配置文件

[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]# 

9.再次用curl訪問2.php,狀態碼會顯示200

[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.1 200 OK
Date: Wed, 07 Mar 2018 11:15:15 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8

[root@tianqi-01 php-7.1.6]# 

10.如果服務器上跑了n多個站點,該如何作限制呢?

11.應該針對站點、這些網站作open_basedir,可是php.ini是作不到的,由於php.ini是針對全部站點的

12.取消第一步中對open_basedir的設置

[root@tianqi-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini

將open_basedir = /data/wwwroot/111.com:/tmp改成

open_basedir =

而後保存退出

13.但咱們能夠在虛擬主機配置文件中設置,在apache虛擬主機文件中去設置

  • 在這裏能夠針對不一樣的虛擬主機限制不一樣的open_basedir

[root@tianqi-01 php-7.1.6]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/abc.com"
    ServerName abc.com
    ServerAlias www.abc.com www.123.com
    php_admin_value open_basedir "/data/wwwroot/abc.com:/tmp"    //這裏限定在abc.com目錄下
    ErrorLog "logs/abc.com-error_log"
    CustomLog "logs/abc.com-access_log" common
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/111.com"
    ServerName 111.com
    ServerAlias www.example.com 2111.com.cn
   # <Directory /data/wwwroot/111.com>
   #<FilesMatch 123.php>
        #AllowOverride AuthConfig
        #AuthName "111.com user auth"
        #AuthType Basic
        #AuthUserFile /data/.htpasswd
        #require valid-user
    #</FilesMatch>
    php_admin_value open_basedir "/data/wwwroot/111.com:/tmp"    //這裏限定在111.com目錄下
    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]
        RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC]
        RewriteRule  .*  -  [F]
    </IfModule>

14.查看配置文件是否存在語法錯誤,並從新加載配置文件

[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@tianqi-01 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@tianqi-01 php-7.1.6]# 

15.用curl繼續訪問2.php

[root@tianqi-01 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php
123[root@tianqi-01 php-7.1.6]# 

//這裏就可使用不一樣的虛擬主機去限制不一樣的open_basedir

友情連接:阿銘Linux

相關文章
相關標籤/搜索