防盜鏈原理:
http標準協議中有專門的字段記錄referer,http請求中會包含來自哪個url的點擊來源,通過這個referer字段可以檢測是否別的網站發送的請求。一來可以追溯上一個入站地址是什麼
二來對於資源文件,可以跟蹤到包含顯示他的網頁地址是什麼因此所有防盜鏈方法都是基於這個referer字段
防盜鏈的作用:
所謂安全防盜鏈,是一種加了防盜鏈簽名的URL,經過簽名的URL能夠跟服務器的安全機制進行配合,可以將URL的使用權限定在您的APP上,惡意第三方拿到URL也不能使用和傳播。
防盜鏈是一種機制,也可以說是一種技術.目的就是防止自己網站上的東西(如圖片,文件 etc。)被其他用戶採用其他的技術手段來訪問或者下載,爲什麼設置防盜鏈呢,因爲涉及到一些利益的問題。因爲盜鏈的話就會分散主網站的流量,流量即利益所在。防盜鏈是如何實現的呢,或者是怎麼才能做到自己網站上的東西不被別人盜鏈呢,要說這個就有必要說說他的原理。我們知道在網絡上我們每次發送一個請求的時候都會生成一個http請求,然後服務器會對這個http請求進行解析,那麼一個http請求中有什麼標誌或者說是什麼作用來實現防止盜鏈的作用呢:主要是該站點在得知有請求時,會先判斷請求頭中的信息,如果請求頭中有referer信息,然後根據自己的規則來判斷referer頭信息是否符合要求,referer 信息是請求該圖片的來源地址。1、正常使用百度貼吧查看圖片的請求頭信息:referer:http://tieba.baidu.com/2、通過第三方查看圖片的請求頭信息:referer:http://localhost/booledu/http/index.html
配置虛擬機文件:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
#</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 ##把空的referer也加入白名單 <FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)"> ##定義規則 Order Allow,Deny ##order定義Allow和Deny的順序,是先允許還是否認掉,並不是以下面的允許規則或否認規則的先後順序來定的。 Allow from env=local_ref ##只寫了允許規則的內容,否認規則沒寫 </FilesMatch> </Directory> ErrorLog "logs/111.com-error_log"
檢查語法,加載配置
測試:
下面頁面的referer是由上面跳來的。直接在網址上輸入http://111.com/zz.png是看不到圖片的。
如果想直接在網址上輸入網址http://111.com/zz.png也可以直接看到圖片,需要更改配置
配置虛擬機文件:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
#SetEnvIfNoCase Referer "^$" local_ref ##把空的referer也加入白名單
把空的referer前面的#去掉註釋,啓用,檢查語法,加載配置
測試:
curl測試:-e加網址
[root@zyshanlinux-001 ~]# curl -e "http://111.com/123.txt" -x127.0.0.1:80 111.com/zz.png -I HTTP/1.1 200 OK Date: Sun, 01 Jul 2018 11:26:15 GMT Server: Apache/2.4.33 (Unix) PHP/7.1.6 Last-Modified: Wed, 16 Aug 2017 14:02:27 GMT ETag: "5a8a1-556df588ec2c0" Accept-Ranges: bytes Content-Length: 370849 Content-Type: image/png [root@zyshanlinux-001 ~]# curl -e "http://www.qq.com/123.txt" -x127.0.0.1:80 111.com/zz.png -I HTTP/1.1 403 Forbidden Date: Sun, 01 Jul 2018 11:26:22 GMT Server: Apache/2.4.33 (Unix) PHP/7.1.6 Content-Type: text/html; charset=iso-8859-1
訪問控制Directory(針對目錄)
配置虛擬機配置文件:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
#</Directory> <Directory /data/wwwroot/111.com/admin/> ##admin是一個後臺就是規定的目錄,必須用絕對路徑 Order deny,allow ##定義deny和allow的順序 Deny from all ##控制語句,拒絕所有IP Allow from 127.0.0.1 ##控制語句,控制的對象就是來源的IP,允許該IP </Directory> <Directory /data/wwwroot/111.com>
檢查語法,加載配置
測試:
用允許的IP去訪問是正常的,顯示200狀態碼
[root@zyshanlinux-001 ~]# curl -x127.0.0.1:80 111.com/admin/index.php -I HTTP/1.1 200 OK Date: Sun, 01 Jul 2018 11:52:51 GMT Server: Apache/2.4.33 (Unix) PHP/7.1.6 X-Powered-By: PHP/7.1.6 Content-Type: text/html; charset=UTF-8 [root@zyshanlinux-001 ~]# curl -x127.0.0.1:80 111.com/admin/index.php welcome!
用允許的IP以外的IP,拒絕訪問,顯示403狀態碼;用允許的IP訪問但不存在的頁面,顯示404狀態碼。
[root@zyshanlinux-001 ~]# curl -x192.168.106.150:80 111.com/admin/index.php -I HTTP/1.1 403 Forbidden Date: Sun, 01 Jul 2018 11:55:05 GMT Server: Apache/2.4.33 (Unix) PHP/7.1.6 Content-Type: text/html; charset=iso-8859-1 [root@zyshanlinux-001 ~]# curl -x127.0.0.1:80 111.com/admin/djisjfisdjfk -I HTTP/1.1 404 Not Found Date: Sun, 01 Jul 2018 11:55:31 GMT Server: Apache/2.4.33 (Unix) PHP/7.1.6 Content-Type: text/html; charset=iso-8859-1
查看日誌,訪問目標IP127.0.0.1的源IP也是127.0.0.1;訪問目標IP192.168.106.150的源IP是192.168.106.128;
[root@zyshanlinux-001 ~]# tail /usr/local/apache2.4/logs/111.com-access_20180701.log 127.0.0.1 - - [01/Jul/2018:19:52:51 +0800] "HEAD HTTP://111.com/admin/index.php HTTP/1.1" 200 - "-" "curl/7.29.0" 127.0.0.1 - - [01/Jul/2018:19:53:02 +0800] "GET HTTP://111.com/admin/index.php HTTP/1.1" 200 9 "-" "curl/7.29.0" 192.168.106.128 - - [01/Jul/2018:19:55:05 +0800] "HEAD HTTP://111.com/admin/index.php HTTP/1.1" 403 - "-" "curl/7.29.0" 127.0.0.1 - - [01/Jul/2018:19:55:31 +0800] "HEAD HTTP://111.com/admin/djisjfisdjfk HTTP/1.1" 404 - "-" "curl/7.29.0"
訪問控制-FilesMatch(針對單個訪問鏈接)
配置虛擬機配置文件:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
#</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>
檢查語法,加載配置
測試:
##沒有限制該目錄,正常訪問 [root@zyshanlinux-001 ~]# curl -x192.168.106.150:80 http://111.com/admin/fjdifjdijf -I HTTP/1.1 404 Not Found Date: Sun, 01 Jul 2018 12:14:23 GMT Server: Apache/2.4.33 (Unix) PHP/7.1.6 Content-Type: text/html; charset=iso-8859-1 ##限制了該訪問鏈接,顯示403 [root@zyshanlinux-001 ~]# curl -x192.168.106.150:80 http://111.com/admin.php?fjdifjd -I HTTP/1.1 403 Forbidden Date: Sun, 01 Jul 2018 12:17:26 GMT Server: Apache/2.4.33 (Unix) PHP/7.1.6 Content-Type: text/html; charset=iso-8859-1 ##允許的IP訪問了限制的鏈接,通過限制 [root@zyshanlinux-001 ~]# curl -x127.0.0.1:80 'http://111.com/admin.php?fjdifjd' -I ##有符號加單引號 HTTP/1.1 404 Not Found Date: Sun, 01 Jul 2018 12:17:43 GMT Server: Apache/2.4.33 (Unix) PHP/7.1.6 Content-Type: text/html; charset=iso-8859-1
限定某個目錄禁止解析php
配置虛擬機配置文件:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
#</Directory> <Directory /data/wwwroot/111.com/upload> ##目錄upload,靜態文件是不需要解析PHP的 php_admin_flag engine off ##禁止解析PHP </Directory> <Directory /data/wwwroot/111.com>
檢查語法,加載配置
測試:訪問禁止解析的php解析的upload目錄,會把php文件下載下來
[root@zyshanlinux-001 111.com]# curl -x192.168.106.128:80 http://111.com/upload/123.php -I HTTP/1.1 403 Forbidden Date: Sun, 01 Jul 2018 12:56:52 GMT Server: Apache/2.4.33 (Unix) PHP/7.1.6 Content-Type: text/html; charset=iso-8859-1
爲了避免下載這中情況,直接禁止掉返回就好,在虛擬機配置文件中加上下面四句
#</Directory> <Directory /data/wwwroot/111.com/upload> ##目錄upload,靜態文件是不需要解析PHP的 php_admin_flag engine off ##禁止解析PHP,只要有這句就夠了 <FilesMatch (.*)\.php(.*)> ##從這裏,加上這四行 Order allow,deny ## Deny from all ## </FilesMatch> ##到這裏,是爲了不解析的PHP的同時,也不要顯示該PHP的源代碼出來,403嘛 </Directory> <Directory /data/wwwroot/111.com>
訪問控制 - user_agent
配置虛擬機配置文件:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
#</Directory> <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] ##其中NC是忽略大小寫,OR是或者在兩條件之間代表是第一個或第二個條件 RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC] RewriteRule .* - [F] ##這行的Rule是直接[F]代表Forbidden的意思,這用法比較特殊 </IfModule> <Directory /data/wwwroot/111.com/upload>
檢查語法,加載配置
測試:
[root@zyshanlinux-001 111.com]# curl -x192.168.106.128:80 http://111.com/123.php -I HTTP/1.1 403 Forbidden ##限制了curl的用戶代理進行訪問 Date: Sun, 01 Jul 2018 13:23:56 GMT Server: Apache/2.4.33 (Unix) PHP/7.1.6 Content-Type: text/html; charset=iso-8859-1 ##用選項-A可以指定user_agent [root@zyshanlinux-001 111.com]# curl -A "zyshan zyshan" -x192.168.106.128:80 http://111.com/123.php -I HTTP/1.1 200 OK Date: Sun, 01 Jul 2018 13:25:27 GMT Server: Apache/2.4.33 (Unix) PHP/7.1.6 X-Powered-By: PHP/7.1.6 Content-Type: text/html; charset=UTF-8
查看日誌
192.168.106.128 - - [01/Jul/2018:21:23:56 +0800] "HEAD http://111.com/123.php HTTP/1.1" 403 - "-" "curl/7.29.0" 192.168.106.128 - - [01/Jul/2018:21:25:27 +0800] "HEAD http://111.com/123.php HTTP/1.1" 200 - "-" "zyshan zyshan"
-A指定user_agent、-e指定referer,必須"http://"開頭、-x相當於省略了host、-I僅顯示狀態碼
PHP相關配置
1、如何準確找到PHP的配置文件,用瀏覽器去找是最準的。
去下載目錄去拷貝開發版的配置文件到網址的根目錄去,重新加載配置
[root@zyshanlinux-001 111.com]# cd /usr/local/src/php-7.1.6/ [root@zyshanlinux-001 php-7.1.6]# cp php.ini-development /usr/local/php7/etc/php.ini [root@zyshanlinux-001 php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
上面就是最準確的該網站的PHP配置文件php.ini
2、在php.ini配置文件中添加規則,如下所示,隨便把phpinfo也禁掉,防止疏忽把phpinfo的網頁也上傳到服務器上讓黑客什麼的看到,該網頁中會暴露我們的配置文件路徑的重要信息,禁掉可以防止別有用心的舉動。
測試:打開顯示告警信息
3、定義時區,如果不定義有時候會有告警信息
vim /usr/local/php7/etc/php.ini 搜索/data.timezone可以定義上海或重慶
4、在禁止phpinfo時,爲了避免網頁顯示告警信息,可以修改配置讓告警信息不顯示
測試:
[root@zyshanlinux-001 php-7.1.6]# !curl curl -A "zyshan zyshan" -x192.168.106.128:80 http://111.com/123.php -I HTTP/1.1 200 OK Date: Sun, 01 Jul 2018 14:30:09 GMT Server: Apache/2.4.33 (Unix) PHP/7.1.6 X-Powered-By: PHP/7.1.6 Content-Type: text/html; charset=UTF-8 [root@zyshanlinux-001 php-7.1.6]# curl -A "zyshan zyshan" -x192.168.106.128:80 http://111.com/123.php 123.com[root@zyshanlinux-001 php-7.1.6]#
5、禁掉了告警信息,所以要定義一下錯誤日誌
vim /usr/local/php7/etc/php.ini 搜索/Log_errors = On 打開就是錯誤日誌開啓
定義錯誤日誌路徑
定義錯誤日誌記錄的級別
測試:
[root@zyshanlinux-001 php-7.1.6]# curl -A "a" -x127.0.0.1:80 http://111.com/123.php 123.com[root@zyshanlinux-001 php-7.1.6]# ls /tmp/ ##生成了錯誤日誌 mysql.sock systemd-private-566fa5b368384acbba075e59e85a8c81-chronyd.service-TgHAlN pear systemd-private-566fa5b368384acbba075e59e85a8c81-vgauthd.service-BB1UWC php_errors.log systemd-private-566fa5b368384acbba075e59e85a8c81-vmtoolsd.service-XrUIEy [root@zyshanlinux-001 php-7.1.6]# ls -l /tmp/php_errors.log -rw-r--r-- 1 daemon daemon 1752 7月 1 22:50 /tmp/php_errors.log ##日誌的所有者,所屬組 [root@zyshanlinux-001 php-7.1.6]# [root@zyshanlinux-001 php-7.1.6]# ps aux |grep httpd ##是httpd的服務的所有者 root 1922 0.0 0.7 258940 13696 ? Ss 19:25 0:01 /usr/local/apache2.4/bin/httpd -k start daemon 4679 0.0 0.6 545768 12380 ? Sl 22:50 0:00 /usr/local/apache2.4/bin/httpd -k start daemon 4680 0.0 0.5 545768 10356 ? Sl 22:50 0:00 /usr/local/apache2.4/bin/httpd -k start daemon 4681 0.0 0.7 613416 14520 ? Sl 22:50 0:00 /usr/local/apache2.4/bin/httpd -k start daemon 4765 0.0 0.7 613416 14524 ? Sl 22:50 0:00 /usr/local/apache2.4/bin/httpd -k start root 4829 0.0 0.0 112720 968 pts/0 R+ 22:53 0:00 grep --color=auto httpd [root@zyshanlinux-001 php-7.1.6]# 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@zyshanlinux-001 php-7.1.6]# ##爲了確保錯誤日誌的生成,可以先創建這個錯問文件賦予權限,這樣可以避免所有者和權限的問題無法生成日誌 [root@zyshanlinux-001 php-7.1.6]# touch /tmp/php_errors.log ; chmod 777 /tmp/php_errors.log^C [root@zyshanlinux-001 php-7.1.6]# cat /tmp/php_errors.log [01-Jul-2018 22:50:06 Asia/chongqing] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
6、open_basedir目錄隔離,避免一個網址的目錄被黑了導致其他網址的目錄同時被黑
配置虛擬機配置文件:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
還有另一個網址,都添加上php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"這行
路徑就是網址的根目錄路,tmp目錄是臨時文件存放目錄也要添加進去,否者臨時文件都寫不進去
PHP擴展模塊安裝
php編譯完成,發現缺少某個模塊,用擴展的方式去編譯
下面安裝一個redis的模塊
[root@zyshanlinux-001 wwwroot]# cd /usr/local/src [root@zyshanlinux-001 src]# wget https://codeload.github.com/phpredis/phpredis/zip/develop [root@zyshanlinux-001 src]# mv develop phpredis-develop.zip [root@zyshanlinux-001 src]# unzip phpredis-develop.zip [root@zyshanlinux-001 src]# cd phpredis-develop [root@zyshanlinux-001 phpredis-develop]# ls arrays.markdown config.w32 INSTALL.markdown mkdeb.sh redis_array_impl.c redis_commands.h cluster_library.c COPYING ISSUE_TEMPLATE.md package.xml redis_array_impl.h redis_session.c cluster_library.h crc16.h liblzf php_redis.h redis.c redis_session.h cluster.markdown CREDITS library.c README.markdown redis_cluster.c rpm common.h debian library.h redis_array.c redis_cluster.h serialize.list config.m4 debian.control mkdeb-apache2.sh redis_array.h redis_commands.c tests [root@zyshanlinux-001 phpredis-develop]# /usr/local/php7/bin/phpize Configuring for: PHP Api Version: 20131106 Zend Module Api No: 20131226 Zend Extension Api No: 220131226 Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script. [root@zyshanlinux-001 phpredis-develop]# yum install -y autoconf [root@zyshanlinux-001 phpredis-develop]# /usr/local/php7/bin/phpize ##這樣纔算生成configure文件 Configuring for: PHP Api Version: 20131106 Zend Module Api No: 20131226 Zend Extension Api No: 220131226
[root@zyshanlinux-001 phpredis-develop]# ./configure --with-php-config=/usr/local/php7/bin/php-config [root@zyshanlinux-001 phpredis-develop]# make [root@zyshanlinux-001 phpredis-develop]# make install Installing shared extensions: /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/ [root@zyshanlinux-001 phpredis-develop]# ls /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/ opcache.so redis.so
查看擴展模塊存放目錄,我們可以在php.ini中去自定義該路徑
[root@zyshanlinux-001 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 [root@zyshanlinux-001 phpredis-develop]# ls /usr/local/php7/lib/php/extensions/no-debug-zts-20160303 opcache.so redis.so [root@zyshanlinux-001 phpredis-develop]# vi /usr/local/php7/etc/php.ini
[root@zyshanlinux-001 phpredis-develop]# /usr/local/php7/bin/php -m |grep redis redis
如果PHP源碼包下的/usr/local/src/php-7.1.6/ext/目錄下有的模塊目錄,就不用下載,直接在該目錄下執行
/usr/local/php7/bin/phpize
./configure --with-php-config=/usr/local/php7/bin/php-config
make && make install
擴展:
幾種限制ip的方法 http://ask.apelearn.com/question/6519
apache 自定義header http://ask.apelearn.com/question/830
apache的keepalive和keepalivetimeout http://ask.apelearn.com/question/556
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
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
php開啓短標籤 http://ask.apelearn.com/question/120
php.ini詳解 http://legolas.blog.51cto.com/2682485/493917
Apache下開啓圖片防盜鏈功能
https://xiaozhou.net/enable_rewrite_module_of_apache-2012-02-15.html
Apache Options指令詳解 http://www.365mini.com/page/apache-options-directive.htm