0511課的預習任務 +課堂筆記

11.25 配置防盜鏈

·通過限制referer來實現防盜鏈的功能

現象:帶寬異常升高,有可能是被倒鏈

  • 編輯配置文件(定義 referer 的白名單)

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

1.png

</Directory /data/wwwroot/111.com>
SetEnvIfNoCase Referer "http://www.111.com" local_ref
SetEnvIfNoCase Referer "http://111.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)">
Order Allow,Deny
Allow from env=local_ref
</filesmatch>
</Directory>

--實際測試時,我們將第三條規則註釋掉,因爲如果不註釋掉,那麼刷新圖片其實就是空referer,沒法看出效果

2.png

  • 定義訪問控制

Order Allow,Deny

先允許,後拒絕。先允許白名單的 referer 通過,再拒絕掉其餘的

Allow from env=local_ref

設置允許的規則,就是上方後綴爲 local_ref 的規則

(注意:“Allow,Deny”中間只有一個逗號,也只能有一個逗號,有空格都會出錯;單詞的大小寫不限。上面設定的含義是先設定“先檢查允許設定,沒有允許的全部禁止”,而第二句允許變量 local_ref 的 referer


  • 配置說明:

<Directory /data/wwwroot/111.com>                             定義防盜鏈的目錄

SetEnvIfNoCase Referer                                                  白名單

<filesmatch>                                                                 匹配規則

<FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">            針對這些文件做防盜鏈


  • 測試

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

配置生效之後,訪問 111.com/doge.gif,結果是Not Found

3.png

--將白名單中加入51cto博客

4.png

--在51cto中發一個鏈接貼

5.png

--點擊鏈接,實測可以訪問圖片

6.png

將白名單51cto去掉後,圖片就無法訪問了

直接訪問圖片地址是空referer,而通過鏈接訪問圖片,那麼referer是該鏈接所在論壇地址

空referer :直接輸入地址訪問或者刷新網頁的情況


·模擬referer(curl -e   (referer必須http開頭))

[root@arslinux-01 ~]# curl -e "http://www.qq.com" -x127.0.0.1:80 111.com/doge.gif -I
HTTP/1.1 403 Forbidden
Date: Sat, 11 May 2019 06:09:21 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
Content-Type: text/html; charset=iso-8859-1

[root@arslinux-01 ~]# curl -e "http://111.com" -x127.0.0.1:80 111.com/doge.gif -I
HTTP/1.1 200 OK
Date: Sat, 11 May 2019 06:09:33 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
Last-Modified: Wed, 19 Apr 2017 14:13:29 GMT
ETag: "2a44e3-54d85a0e67440"
Accept-Ranges: bytes
Content-Length: 2770147
Content-Type: image/gif

擴展:https://www.cnblogs.com/bonelee/p/7875163.html


11.26 訪問控制Directory

·用戶認證可以在一定程度起到安全作用,有時想要讓安全更加嚴格一些

爲了防止訪問衝突產生,把訪問控制放到上方,那麼上方爲訪問控制,下方位防盜鏈

  • 編輯配置文件

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

7.png

<Directory /data/wwwroot/111.com/admin/>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>


  • 定義訪問控制規則

Order deny,allow 順序,先deny,後allow

Deny from all 控制語句

Allow from 127.0.0.1 控制語句    控制對象:來源ip

先deny,後allow,那麼只有127.0.0.1不受限制;先allow,後deny,那麼就是deny

無論是先 deny 還是先 allow,Order 都會按順序執行完,控制語句順序不影響結果


  • 測試

1、在 /data/wwwroot/111.com/ 創建 admin/ 目錄,並在目錄下創建 index.php,任意內容

[root@arslinux-01 ~]# mkdir /data/wwwroot/111.com/admin/
[root@arslinux-01 ~]# vim /data/wwwroot/111.com/admin/index.php
testtesttesttest

2、訪問測試 curl -x是訪問目標ip,而配置中也是同一個ip,這是本機和本機通訊

[root@arslinux-01 ~]# curl -x127.0.0.1:80 111.com/admin/index.php -I
HTTP/1.1 200 OK
Date: Sat, 11 May 2019 06:32:02 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
X-Powered-By: PHP/7.1.25
Content-Type: text/html; charset=UTF-8

[root@arslinux-01 ~]# curl -x192.168.194.150:80 111.com/admin/index.php -I
HTTP/1.1 403 Forbidden
Date: Sat, 11 May 2019 06:32:51 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
Content-Type: text/html; charset=iso-8859-1

3、111.com/admin 不存在連接的也是無法訪問

8.png


11.27 訪問控制FilesMatch

·訪問控制除了目錄之外也可以去匹配文件名

  • 編輯配置文件

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

9.png

<FilesMatch  "admin.php(.*)">
Order deny,allow
Deny from all
Allow from 127.0.0.1
</FilesMatch>
  • 測試

[root@arslinux-01 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@arslinux-01 ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@arslinux-01 ~]# curl -x192.168.194.150:80 111.com/admin.php -I
HTTP/1.1 403 Forbidden
Date: Sat, 11 May 2019 06:49:31 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
Content-Type: text/html; charset=iso-8859-1     //ip沒有通過,403,禁止訪問

[root@arslinux-01 ~]# curl -x127.0.0.1:80 111.com/admin.php -I
HTTP/1.1 404 Not Found
Date: Sat, 11 May 2019 06:46:50 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
Content-Type: text/html; charset=iso-8859-1    //更換ip,404,允許訪問

雖然文件不存在,但是可以訪問


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

目的:禁止php解析:防止被上傳有害php文件,而被執行,php中可能有危險的函數,如果開放了上傳權限,肯定會被上傳惡意***文件,會被拿到服務器權限,root權限,非常危險。

  • 編輯配置文件

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

10.png

<Directory /data/wwwroot/www.111.com/upload>
php_admin_flag engine off
</Directory>

·藍色框中可加可不加,加上限制訪問文件.php


  • 重新加載配置

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

1、創建在111.com下創建upload目錄,並在目錄下創建 php 文件

[root@arslinux-01 ~]# mkdir /data/wwwroot/111.com/upload/
[root@arslinux-01 ~]# cp /data/wwwroot/111.com/123.php /data/wwwroot/111.com/upload/

2、訪問123.php,直接403,被禁止

[root@arslinux-01 ~]# curl -x127.0.0.1:80 111.com/upload/123.php -I
HTTP/1.1 403 Forbidden
Date: Sat, 11 May 2019 07:27:21 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
Content-Type: text/html; charset=iso-8859-1

--將filesmatch註釋掉,只保留php_admin_flag_engine off,再測試結果

11.png

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

無法解析 php,只能顯示源代碼


--而在瀏覽器中輸入111.com/upload/123.php時,文件準備開始下載,說明無法解析

--再將配置文件恢復,進一步限制

12.png

靜態文件存放的目錄時禁止解析php的


11.29 限制user_agent

user_agent 訪問控制的需求背景:網站會受到CC***,原理爲***者通過手段(軟件,肉機)讓成千上萬肉機同時去訪問某個站點,站點可能掛掉

CC***非常有規律,他們的user_agent非常有規律

  • 編輯配置文件

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

13.png

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC]
RewriteRule  .*  -  [F]
</IfModule>


  • 配置說明

上方爲條件,下方位規則

OR爲或,user_agent匹配上面條件的或下方的條件,比價OR則爲並且,但是不可能同時匹配curl和baidu.com

NC 表示忽略大小寫   (user_agent中類似於Mozilla就有大小寫)

F爲forbidden

  • 測試

[root@arslinux-01 ~]# curl -x127.0.0.1:80 111.com/upload/123.php -I
HTTP/1.1 403 Forbidden
Date: Sat, 11 May 2019 10:24:20 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
Content-Type: text/html; charset=iso-8859-1

[root@arslinux-01 ~]# curl -x127.0.0.1:80 111.com/123.php -I
HTTP/1.1 403 Forbidden
Date: Sat, 11 May 2019 10:25:01 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
Content-Type: text/html; charset=iso-8859-1
  • curl -A 指定 user_agent 來測試

[root@arslinux-01 ~]# curl -A "arslinux" -x127.0.0.1:80 111.com/123.php -I
HTTP/1.1 200 OK
Date: Sat, 11 May 2019 10:30:03 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
X-Powered-By: PHP/7.1.25
Content-Type: text/html; charset=UTF-8

[root@arslinux-01 ~]# curl -A "arslinux arslinux" -x127.0.0.1:80 111.com/123.php -I
HTTP/1.1 200 OK
Date: Sat, 11 May 2019 10:31:09 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
X-Powered-By: PHP/7.1.25
Content-Type: text/html; charset=UTF-8

查看日誌,可以看到之前被拒絕訪問的和 curl -A 之後允許訪問

[root@arslinux-01 ~]# tail /usr/local/apache2.4/logs/111.com-access_20190511.log

14.png


  • curl常用配置選項:

-e        指定referer (必須 http:// 開頭)

-A        指定user_agent

-x        指定ip,相當於省略了hosts

-I        查看狀態碼


擴展:

CC***:https://baike.baidu.com/item/cc%E6%94%BB%E5%87%BB/10959545?fr=aladdin


11.30/11.31 php相關配置

  • 查看 php 配置文件位置

方法1:命令 /usr/local/php/bin/php -i | grep -i "loaded configuration file"

方法2:創建 phpinfo,在 phpinfo 中查看

[root@arslinux-01 ~]# vim /data/wwwroot/111.com/index.php
<?php
phpinfo();

在瀏覽器中訪問 111.com/index.php

15.png

我們可以看到php配置目錄在/usr/local/php7/etc下,但是並沒有加載


--既然沒有加載,那麼可以去源碼包中複製

[root@arslinux-01 ~]# cd /usr/local/src/php-7.1.25/
[root@arslinux-01 php-7.1.25]# cp php.ini-development /usr/local/php7/etc/php.ini
[root@arslinux-01 php-7.1.25]# /usr/local/apache2.4/bin/apachectl graceful

--重新加載後,刷新網頁,php.ini 已經加載了

16.png


  • 配置文件 php.ini

1、限定disable_fuctions(危險函數)

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

17.png

·危險函數: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會將系統的一些目錄暴露給他人,很危險。


·配置完成後,查看111.com/index.php,已經被禁掉

18.png

2、定義date.timezone(時區)

19.png

時區定爲 Asia/Shanghai 或者 Asia/Chongqing


3、日誌相關

1.display_errors

display_errors 顯示錯誤信息,如果on,打開的話,那麼會把錯誤信息顯示在瀏覽器上,很可能會暴露目錄

20.png

--那麼,設置爲off之後,再訪問,則會顯示白頁,那麼一切都是未知,不太好找問題所在

[root@arslinux-01 php-7.1.25]# curl -A "a" -x127.0.0.1:80 111.com/123.php -I
HTTP/1.1 200 OK
Date: Sat, 11 May 2019 11:02:47 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
X-Powered-By: PHP/7.1.25
Content-Type: text/html; charset=UTF-8


--因此,再將 display_errors 改爲off之後,需要編輯錯誤日誌 log_errors,方便查看錯誤


2.log_errors

1)log_errors:錯誤日誌打開

21.png

2)log_errors:錯誤日誌記錄到一個目錄下,自行編輯

22.png

3)error_reporting:還要定義一個error_log的級別,非常嚴謹的話,那麼只會記錄一些嚴重的錯誤,一些不太嚴重的錯誤則不記錄,忽被略掉,我麼可以放鬆一些,級別低一點

23.png

★生產環境中,一般使用E_ALL & ~E_NOTICE


[root@arslinux-01 php-7.1.25]# curl -A "a" -x127.0.0.1:80 111.com/index.php
<br />
<b>Warning</b>:  phpinfo() has been disabled for security reasons in <b>/data/wwwroot/111.com/index.php</b> on line <b>2</b><br />
[root@arslinux-01 php-7.1.25]# cat /tmp/php_errors.log
[11-May-2019 19:17:10 Asia/Shanghai] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2

php errors.log的屬主和屬組是deamon,而demon是httpd的屬主,php errors.log是以httpd進程的身份生成的

爲了防止該文件沒有生成,可以先創建 php_errors.log,在給它一個 777 的權限


--再模擬一個錯誤

[root@arslinux-01 php-7.1.25]# vim /data/wwwroot/111.com/2.php
<?php
echo 123;
adkfhlakdf

[root@arslinux-01 php-7.1.25]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php
<br />
<b>Parse error</b>:  syntax error, unexpected end of file in <b>/data/wwwroot/111.com/2.php</b> on line <b>4</b><br />
[root@arslinux-01 php-7.1.25]# tail -1 /tmp/php_errors.log
[11-May-2019 19:19:08 Asia/Shanghai] PHP Parse error:  syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4

查看日誌可以發現,Parse error比之前Warning更嚴重


4、open_basedir

--比如一個服務器上跑了很多站點,其中一個站點寫的漏洞比較多,被人黑了,被人拿到了權限,那麼可定會被進一步***,進到另一個站點

--但是如果增加了open_basedir,那麼就有可能黑不了

--A網站在A目錄,B網站在B目錄,即使被黑,那也是黑一個目錄,不會連帶其他目錄被黑

--修改 /usr/local/php7/etc/php.ini  ( : 爲分隔符,分割需要限制的多個目錄,默認的臨時文件在tmp下,所以要帶上tmp目錄)

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

24.png

[root@arslinux-01 php-7.1.25]# /usr/local/apache2.4/bin/apachectl graceful
[root@arslinux-01 php-7.1.25]# curl -A "a" -x127.0.0.1:80 111.com/2.php
123

php.ini是針對站所有站點做限制,但如果有多個網站運行,多個網站運行在同一個文件夾下,那麼等於是沒有分開限制。


只有針對站點去做 open_basedir 才行,php.in i做不到,只有在apache的虛擬主機中定義才行


php_admin_value可以定義php.ini中的參數,如error_log,error_reporting,可以針對不同虛擬主機限制不同的open_basedir


  • 針對不同虛擬主機限制不同的open_basedir

用php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/" 限定目錄,而針對多個不同的虛擬主機限制不同的 open_basedir,可以用上方第一個虛擬主機來限制

25.png

默認臨時文件在 /tmp/ 下,tmp 被限制的話,就無法上傳圖片了


11.32 php動態擴展模塊安裝

·忘記安裝或者需求變更,需要增加模塊

  • 查看 php 模塊

[root@arslinux-01 php-7.1.25]# /usr/local/php7/bin/php -m
[PHP Modules]
bz2
Core
ctype
date
dom
exif
fileinfo
filter
gd
hash
iconv
json
libxml
mbstring
mcrypt
mysqli
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
Reflection
session
SimpleXML
soap
sockets
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]
  • 安裝一個 redis 模塊(通常在LAMP架構下當做緩存來用)

1、下載解壓 redis-php 包

[root@arslinux-01 php-7.1.25]# cd /usr/local/src/
[root@arslinux-01 src]# wget https://codeload.github.com/phpredis/phpredis/zip/develop
[root@arslinux-01 src]# mv develop phpredis-develop.zip
[root@arslinux-01 src]# unzip phpredis-develop.zip
[root@arslinux-01 phpredis-develop]# ls
acinclude.m4       config.guess  debian             ltmain.sh         README.markdown     redis_commands.c
aclocal.m4         config.m4     debian.control     Makefile.global   redis_array.c       redis_commands.h
arrays.markdown    config.sub    INSTALL.markdown   missing           redis_array.h       redis_session.c
build              configure.in  install-sh         mkdeb-apache2.sh  redis_array_impl.c  redis_session.h
cluster_library.c  config.w32    ISSUE_TEMPLATE.md  mkdeb.sh          redis_array_impl.h  rpm
cluster_library.h  COPYING       liblzf             mkinstalldirs     redis.c             run-tests.php
cluster.markdown   crc16.h       library.c          package.xml       redis_cluster.c     serialize.list
common.h           CREDITS       library.h          php_redis.h       redis_cluster.h     tests

2、生成 configure 文件

[root@arslinux-01 src]# cd phpredis-develop/
[root@arslinux-01 phpredis-develop]# yum install -y autoconf
[root@arslinux-01 phpredis-develop]# /usr/local/php7/bin/phpize
Configuring for:
PHP Api Version:         20160303
Zend Module Api No:      20160303
Zend Extension Api No:   320160303
[root@arslinux-01 phpredis-develop]# ls
acinclude.m4       config.guess  CREDITS            ltmain.sh         redis_array.c       redis_session.c
aclocal.m4         config.h.in   debian             Makefile.global   redis_array.h       redis_session.h
arrays.markdown    config.m4     debian.control     missing           redis_array_impl.c  rpm
autom4te.cache     config.sub    INSTALL.markdown   mkdeb-apache2.sh  redis_array_impl.h  run-tests.php
build              configure     install-sh         mkdeb.sh          redis.c             serialize.list
cluster_library.c  configure.in  ISSUE_TEMPLATE.md  mkinstalldirs     redis_cluster.c     tests
cluster_library.h  config.w32    liblzf             package.xml       redis_cluster.h
cluster.markdown   COPYING       library.c          php_redis.h       redis_commands.c
common.h           crc16.h       library.h          README.markdown   redis_commands.h

3、安裝

[root@arslinux-01 phpredis-develop]# ./configure --with-php-config=/usr/local/php7/bin/php-config
[root@arslinux-01 phpredis-develop]# make && make install

make install會把redis.so放在 /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/ 中

[root@arslinux-01 phpredis-develop]# ls /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/
opcache.so  redis.so

現在PHP還不支持redis,需要加載redis.so


·查看擴展模塊存放目錄,我們可以在php.ini中去自定義該路徑

[root@arslinux-01 phpredis-develop]# /usr/local/php7/bin/php -i |grep -i extension_dir
extension_dir => /usr/local/php7/lib/php/extensions/no-debug-zts-20160303 => /usr/local/php7/lib/php/extensions/no-debug-zts-20160303
sqlite3.extension_dir => no value => no value


·編輯/usr/local/php7/etc/php.ini,增加一行配置extension = redis.so(可以放到文件最後一行)

[root@arslinux-01 phpredis-develop]# vim /usr/local/php7/etc/php.ini

26.png

[root@arslinux-01 phpredis-develop]# /usr/local/php7/bin/php -m|grep redis
redis

--如果想編譯一個模塊時,如果php源碼包中的ext文件夾下自帶了該目錄,那麼不用下載就可以直接編譯,如果沒有,那麼就需要去下載

--在php源碼包裏有很多模塊,我們安裝一個沒有加載的zip模塊

·嘗試編譯安裝一個模塊

[root@arslinux-01 phpredis-develop]# cd /usr/local/src/
[root@arslinux-01 src]# cd php-7.1.25/
[root@arslinux-01 php-7.1.25]# cd ext/zip/
[root@arslinux-01 zip]# ls
config.m4  config.w32  CREDITS  examples  lib  LICENSE_libzip  php_zip.c  php_zip.h  tests  TODO  zip_stream.c

·創建 configure

[root@arslinux-01 zip]# /usr/local/php7/bin/phpize
Configuring for:
PHP Api Version:         20160303
Zend Module Api No:      20160303
Zend Extension Api No:   320160303
[root@arslinux-01 zip]# ls
acinclude.m4    config.guess  configure     examples        ltmain.sh        php_zip.c      TODO
aclocal.m4      config.h.in   configure.in  install-sh      Makefile.global  php_zip.h      zip_stream.c
autom4te.cache  config.m4     config.w32    lib             missing          run-tests.php
build           config.sub    CREDITS       LICENSE_libzip  mkinstalldirs    tests

·安裝

[root@arslinux-01 zip]# ./configure --with-php-config=/usr/local/php7/bin/php-config
[root@arslinux-01 zip]# make && make install
[root@arslinux-01 zip]# ls /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/
opcache.so  redis.so  zip.so

·添加extension=zip.so

[root@arslinux-01 zip]# vim /usr/local/php7/etc/php.ini
extension=zip.so
[root@arslinux-01 zip]# /usr/local/php7/bin/php -m |grep zip
zip


擴展

幾種限制ip的方法 http://ask.apelearn.com/question/6519

apache 配置https 支持ssl http://ask.apelearn.com/question/1029

apache rewrite教程 http://coffeelet.blog.163.com/blog/static/13515745320115842755199/   http://www.cnblogs.com/top5/archive/2009/08/12/1544098.html

apache rewrite 出現死循環 http://ask.apelearn.com/question/1043

php錯誤日誌級別參考  http://ask.apelearn.com/question/6973



課堂筆記


/usr/local/php

/usr/local/php/bin/

pecl

pecl  install  redis

pecl install  memcache

http://pecl.php.net/package-search.php



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章