任務列表:
11.25 配置防盜鏈
11.26 訪問控制Directory
11.27 訪問控制FilesMatch
11.28 限定某個目錄禁止解析php
11.29 限制user_agent
11.30/11.31 php相關配置
11.32 php擴展模塊安裝
擴展
幾種限制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/6973php
pecl.php.net
pecl 安裝管理擴展模塊
pecl install redis
pecl install memcache
html
1、配置Apache防盜鏈git
防盜鏈,經過限制referer來實現防盜鏈的功能,通俗講就是不讓別人盜用你網站上的資源,這個資源指的是圖片、視頻、歌曲、文檔等,在這以前須要理解一下referer的概念,若是你經過A網站的一個頁面http://a.com/a.html裏面的連接去訪問B網站的一個頁面http://b.com/b.html,那麼這個B網站頁面的referer就是http://a.com/a.html。也就是說,一個referer就是一個網址。github
打開虛擬主機配置文件,按如下內容配置虛擬主機;redis
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf //編輯虛擬主機配置文件shell
/usr/local/apache2.4/bin/apachectl -t
/usr/local/apache2.4/bin/apachectl gracefulapache
SetEnvIfNoCase Referer "^$" local_ref 定義爲空referer,可直接訪問圖片vim
經過指定的referer來訪問:瀏覽器
可是這個只是針對如下幾種格式的內容: <FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">安全
定義111.com: SetEnvIfNoCase Referer "http://111.com" local_ref
定義aaa.com: SetEnvIfNoCase Referer "http://aaa.com" local_ref
若是把空referer註釋掉去訪問圖片的話,顯示以下
curl -x192.168.56.3:80 111.com/qq.jpg -I 直接訪問,狀態200,至關於空refer
模擬referer爲www.qq.com
curl -e "http://www.qq.com/123.txt" -x192.168.56.3:80 111.com/qq.jpg -I
curl -e 定義referer爲www.qq.com,返回Forbidden,禁止referer
curl -e "http://111.com/123.txt" -x192.168.56.3:80 111.com/qq.jpg -I 定義refer爲111.com,能夠訪問
2、Apache訪問控制– Directory
對於一些比較重要的網站內容,除了可使用用戶認證限制訪問以外,還能夠經過其餘一些方法作到限制,好比限制IP,也能夠限制user_agent。限制IP指的是限制訪問網址的來源IP,而限制user_agent,一般用來限制惡意或者不正常的請求.
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
order 用來定義順序,先deny或allow,無論ip是否匹配,都會按順序執行完
實驗:
/usr/local/apache2.4/bin/apachectl -t
/usr/local/apache2.4/bin/apachectl graceful
準備工做:
在容許IP 127.0.0.1下,訪問admin目錄
curl -x127.0.0.1:80 111.com/admin/index.php -I 能夠訪問
curl -x192.168.187.3:80 111.com/admin/index.php 當更改源ip即目標ip,訪問報錯403
curl測試狀態碼爲403則被限制訪問了
3、訪問控制FilesMatch
這種格式可使用FilesMatch去匹配
編輯虛擬主機配置文件,進行FilesMatch配置;既要匹配文件,又要限制IP;
<Filesmatch admin.php(.*)> //文件匹配admin.php後面跟任意的字符
Allow from 127.0.0.1 //只容許127.0.0.1訪問
403 Forbidden //由於只容許IP:127.0.0.1訪問
404 Not Found //可以鏈接,可是無此頁面
4、限定某個目錄禁止解析php
有這樣一種狀況,有些站點和論壇是容許上傳圖片到服務器,他們上傳一些php或者js到服務器,而後被咱們執行加載,從而對數據形成威脅。 爲了不這種事情的發生,咱們須要限制上傳類型。
編輯虛擬主機配置文件,進行如下配置;
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<Directory /data/wwwroot/111.com/upload>
php_admin_flag engine off
<FilesMatch (.*)\.php(.*)>
Order deny,allow
Deny from all
</Filesmatch>
</Directory>
加deny是爲了防止源代碼被訪問
/usr/local/apache2.4/bin/apachectl -t
/usr/local/apache2.4/bin/apachectl graceful
建立目錄,並把123.php複製到upload
進行測試,發現禁止解析php,也不能輸出源代碼;
curl -x127.0.0.1:80 http://111.com/upload/123.php -I
curl -x127.0.0.1:80 http://111.com/upload/123.php //禁止訪問,也不能輸出源代碼
再進行配置,把FilesMatch部分不執行,加上#號
進行測試,結果不能解析php,只能輸出源代碼;
把FilesMatch註釋取消,便可限制輸出源代碼,顯示403
所以爲了安全,咱們必須讓其根本不能訪問php(匹配.php),不給其解析機會,不能訪問源代碼
5、訪問控制,限制user_agent
User Agent中文名爲用戶代理,簡稱 UA,它是一個特殊字符串頭,使得服務器可以識別客戶使用的操做系統及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] //定義條件,在這兩個條件之間使用OR做爲鏈接符,user_agent匹配第一個條件或第二個條件,不加OR就是而且的關係(不推薦使用),NC表示忽略大小寫
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC] 定義條件
RewriteRule .* - [F]
</IfModule>
/usr/local/apache2.4/bin/apachectl -t
/usr/local/apache2.4/bin/apachectl graceful
curl -x127.0.0.1:80 'http://111.com/123.php' -I 直接用curl訪問111.com目錄下的123.php,禁止訪問,由於user_agent是匹配curl
用curl -A自定義user_agent的值
curl -A "tobe" -x127.0.0.1:80 'http://111.com/123.php' -I 指定user_agent爲tobe,能夠訪問
tail /usr/local/apache2.4/logs/111.com-access_20190512.log 查看日誌,能夠看出user_agent爲"curl/7.29.0" ,和tobe
curl -A 指定user_agent
curl -e指定referer "http://"
curl -x 至關於省略了hosts
-I 查看狀態碼
6、php相關配置
查看php配置文件位置
經過編輯index.php內容查看
<?php
phpinfo();
Configuration File (php.ini) Path 配置文件所在目錄:/usr/local/php7/etc
Loaded Configuration File 沒有加載
使Loaded Configuration File 加載:
到php源碼包配置文件中:cd /usr/local/src/php-7.1.25/
找到php.ini-development複製到/usr/local/php7/etc/目錄下
cp php.ini-development /usr/local/php7/etc/php.ini
/usr/local/apache2.4/bin/apachectl graceful
此時已經加載
date.timezone 設置時區
對php的安全函數配置
vim /usr/local/php7/etc/php.ini 編輯/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,phpinfo 這些函數都是比較危險的,爲了安全,通常要把他們禁用
/usr/local/apache2.4/bin/apachectl graceful 從新加載,此時已經禁用了phpinfo
在訪問時會報錯,而且會顯示錯誤信息,顯示目錄
在編輯腳本 vim /usr/local/php7/etc/php.ini
搜索display_errors display_errors = off //把on改成off
/usr/local/apache2.4/bin/apachectl -t
/usr/local/apache2.4/bin/apachectl graceful
此時顯示空頁面
設置php的錯誤日誌
vim /usr/local/php7/etc/php.ini
搜索log_errors
log_errors = On //定義錯誤日誌是否開啓,開啓on
用error_log定義路徑
設置error_reporting 錯誤級別
error_reporting = E_ALL 默認爲E_ALL
更改成error_reporting = E_ALL & ~E_NOTICE //在生產環境中,最經常使用的就是這個!有時候出現notice並非出錯
/usr/local/apache2.4/bin/apachectl -t
/usr/local/apache2.4/bin/apachectl graceful
curl -A "tobe" -x127.0.0.1:80 'http://111.com/index.php' 繼續訪問,沒有輸出
此時有設置的錯誤日誌出現
查看看這個錯誤日誌的權限,發現爲daemon;說明跟httpd配置文件相關,daemon用戶是httpd的屬主,日誌是已進程的身份進行的,若是定義了錯誤日誌,可是始終沒有生成,須要檢查一下定義錯誤日誌存放的目錄是否有寫權限,爲了防止這種狀況發生,能夠先建立該目錄,並給權限
查看php錯誤日誌cat /tmp/php_errors.log
模擬錯誤:
vim /data/wwwroot/111.com/2.php //新建2.php
curl -A "to" -x127.0.0.1:80 http://111.com/2.php 空頁面
curl -A "to" -x127.0.0.1:80 http://111.com/2.php -I 500狀態碼
查看錯誤日誌,能夠看出不一樣的錯誤級別
open_basedir配置
open_basedir安全選項
若是有一臺服務器跑了不少個站點,其中就有一個站的程序寫的很爛,漏洞百出,很容易被黑,一旦該站點被黑,整個服務器就會淪陷,其它站點一樣也會被黑。在php配置文件中設置open_basedir防止該狀況發生。
在php配置文件中,把111.com故意寫成1111.com
curl -A "to" -x127.0.0.1:80 http://111.com/2.php -I 返回狀態碼500
在php配置文件中,把錯誤的目錄1111.com改回111.com
curl -A "to" -x127.0.0.1:80 http://111.com/2.php -I 此時返回正常
針對不一樣的虛擬主機設定不一樣的open_basedir,當有多個站點時php.ini就沒法知足要求了,php.ini是針對全部站點的
針對不一樣的虛擬主機限定不一樣的open_basedir,能夠經過設置apache的虛擬主機配置文件設置
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/" 加入此命令
默認的臨時文件在tmp下,若是限制了tmp,臨時文件都沒法寫入
重啓配置後,能夠訪問成功
/usr/local/apache2.4/bin/apachectl -t
/usr/local/apache2.4/bin/apachectl graceful
7、PHP擴展模塊安裝
/usr/local/php/bin/php -m //查看模塊
1. 下載模塊包安裝
安裝一個redis的模塊,下載源碼包
cd /usr/local/src/ 進入目錄
wget https://codeload.github.com/phpredis/phpredis/zip/develop 下載
mv develop phpredis-develop.zip 把下載的包更名
unzip phpredis-develop.zip 解壓
cd phpredis-develop/ 進入目錄
生成configure 文件 :/usr/local/php7/bin/phpize 此時報錯,提示缺乏autoconf包
安裝:yum install -y autoconf
繼續執行生成configure文件,生成成功
配置、編譯,安裝
./configure --with-php-config=/usr/local/php7/bin/php-config
make && make install
編譯完成後會把redis.so放到 /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/這個目錄下
/usr/local/php7/bin/php -i |grep extension_dir //查看擴展模塊存放目錄,能夠在php.ini中去自定義該路徑
/usr/local/php7/lib/php/extensions/no-debug-zts-20160303/路徑和上面看的是一樣的
/usr/local/php7/bin/php -m |grep redis 此時尚未該模塊
目錄爲空,此時在php.ini加載一條擴展語句
vim /usr/local/php7/etc/php.ini
添加extension=redis.so
/usr/local/php7/bin/php -m |grep redis 此時已經加載
2. 編譯自帶的PHP源碼包
php7的源碼包中,有不少自帶的源碼包。咱們不須要再次下載,直接編譯便可!
cd /usr/local/src/php-7.1.25/
cd ext/
/usr/local/php7/bin/php -m |grep zip 此時沒有zip模塊
想要編譯zip模塊
進入zip目錄 cd zip/
/usr/local/php7/bin/phpize //生成configure文件
配置、編譯,安裝
./configure --with-php-config=/usr/local/php7/bin/php-config
make && make install
查看目錄,此時發現zip.so模塊
ls /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/