44.限定某個禁止解析php 限制useragenr php相關配置
11.28 限定某個目錄禁止解析php
11.29 限制user_agent(防止cc攻擊)
11.30/11.31 php相關配置
擴充套件
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
11.28 限定某個目錄禁止解析php:
一般針對放圖片的目錄禁止解析php檔案。防止被黑客拿到root許可權,把php檔案放到圖片的目錄下,就會很危險。因為php有一些危險的函式,如果開放了,肯定會被上傳一些木馬檔案,這種行為一般存在放允許上傳圖片的那個目錄下,在這個目錄裡上傳了php檔案
知識點:上傳圖片的目錄,99%的概率不需要解析php
核心配置檔案內容
<Directory /data/wwwroot/111.com/upload>
php_admin_flag engine off 如果只是單純禁止解析.php的,只加這一行即可
<FilesMatch (.*)\.php(.*)> 此處又使用了FilesMatch,其實upload目錄下的,php目錄就被限制了
Order allow,deny
deny from all 此處的deny是因為,如果不加deny會直接訪問原始碼,不太友好
<FilesMatch>
</Directory>
curl測試時直接返回了php原始碼,並未解析。-I會顯示200,但已提示無法解析php
瀏覽器上測試會直接下載這個檔案
例項:
[root@localhost ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<Directory /data/wwwroot/111.com/upload>
php_admin_flag engine off
<FilesMatch (.*)\.php(.*)> 此處並加入了限制php的訪問。更加安全
Order allow,deny 需注意此處,deny放在後面為最終結果
deny from all
</FilesMatch>
</Directory>
[root@localhost upload]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost upload]# /usr/local/apache2.4/bin/apachectl graceful
curl -x192.168.30.133:80 http://111.com/upload/123.php
<?php 顯示403原因不明
[[email protected]]# curl -x192.168.30.133:80 'http://111.com/upload/123.php' -I
HTTP/1.1 200 OK 顯示403原因不明
Date: Tue, 07 Aug 2018 14:10:00 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
Last-Modified: Tue, 07 Aug 2018 14:03:35 GMT
ETag: "1a-572d8dc218805"
Accept-Ranges: bytes
Content-Length: 26
Content-Type: application/x-httpd-php
cp /usr/local/apache2.4/htdocs/1.php /data/wwwroot/111.com/upload/
curl -x192.168.30.133:80 'http://111.com/upload/1.php' -I
curl -x127.0.0.1:80 'http://111.com/upload/1.php' -I
顯示403原因不明
----------------------------------------------------------------------------------------------------------------------------------------------------
11.29 限制user_agent:
cc攻擊:黑客利用自己手裡的肉雞同時去訪問一個網站或論壇,訪問量過大,被攻擊伺服器必然會掛掉。稱為cc攻擊
cc攻擊的規律:就是他的user_agent是一致的,而且訪問頻率很快,一秒訪問N次。滿足這樣的特徵就能判定為cc攻擊
可通過限制他的user_agent,實現減輕伺服器的壓力:
user_agent可以理解為瀏覽器標識
核心配置檔案內容
<IfModule mod_rewrite.c> 用到了rewrite模組(之前實現了域名跳轉)
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] 這兩行都是定義條件
NC代表忽略大小寫(因為user_agent裡會有大寫),OR是這兩行的連線符,是這兩行的滿足條件為或者關係。不加OR就是並且關係。也就是上下兩行同時滿足(user_agenr中不可能同時滿足)
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F] F代表Forbidden的意思。就是直接Forbidden(用法比較特殊)
</IfModule>
curl -A "123123" 指定user_agent
例項:
[root@localhost upload]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F]
</IfModule>
[root@localhost upload]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost upload]# /usr/local/apache2.4/bin/apachectl graceful
[root@localhost upload]# curl -x192.168.30.133:80 http://111.com/123.php -I
HTTP/1.1 403 Forbidden
Date: Fri, 19 Jul 2019 09:53:47 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.32
Content-Type: text/html; charset=iso-8859-1
[root@localhost upload]# curl -A "axin axin" -x192.168.30.133:80 http://111.com/123.php -I -A指定user_agent 不顯示,原因不明。
HTTP/1.1 200 OK
Date: Tue, 07 Aug 2018 14:55:04 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
X-Powered-By: PHP/5.6.32
Content-Type: text/html; charset=UTF-8
----------------------------------------------------------------------------------------------------------------------------------------------------
11.30/11.31 php相關配置:
~1.
關於查詢準確的php配置檔案:
檢視php配置檔案位置
比如要找111.com的PHP位置。在111.com的目錄下建立phpinfo的檔案,在到瀏覽器上查詢。詳見例項1
/usr/local/php/bin/php -i|grep -i "loaded configuration file" 這個方法不太準
~2.
關於定義時區:
date.timezone 定義時區(有時候會有告警資訊) date.timezone=Asis/Shanghai 詳見例項2
~3.
關於禁掉危險函式:
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來獲取資訊。避免暴露
以上為,較危險的php函式(其中eval就是一句話木馬所用到的函式)。針對這些做一些限制。詳見例項3
~4.
關於錯誤日誌:
display_errors, log_errors,error_log,error_reporting
display_errors:我們如果把phpinfo禁掉的話,他會在瀏覽器裡顯示錯誤日誌,一樣會暴露。改為display_errors=Off
log_errors,error_log,error_reporting:我們改為display_errors=Off之後,要設定錯誤日誌。步驟為,檢查是否開啟>設定路徑>錯誤級別
以上詳見例項4
~5.
open_basedir
一臺伺服器上多個站點做隔離。比如A網站在A目錄下,B網站在B目錄下,即時被攻擊了A網站也只能在A目錄裡,B不受影響
假如這臺伺服器所有的站點都在111.com下。我們在PHP的配置檔案裡設定open_basedir=/data/wwwroot/111.com:/tmp,也沒有什麼用。因為都在一個目錄下。所以我們可以在Apache的虛擬配置檔案裡設定,下面的配置:
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"
以上加:/tmp/是因為,預設的臨時檔案在tmp下,如果被限制了,他自己臨時的檔案也寫不了
php_admin_value這個命令可以定義php.ini裡面的引數
不同的虛擬主機限制不同的 open_basedir
例項:
1.
[root@localhost 111.com]# ls
123.php abc.jpg admin index.php upload
[root@localhost 111.com]# vim index.php
(如果第二行沒有載入就要複製一個
[root@localhost php-5.6.32]# cd /usr/local/src/php-7.1.6/
[root@localhost php-7.1.6]# cp php.ini-development /usr/local/php7/etc/php.ini
cp:是否覆蓋"/usr/local/php7/etc/php.ini"? y
[root@localhost php-7.1.6]# /usr/local/apache2/bin/apachectl graceful)
以上我們就找到了php的配置檔案。(最準的)
2.
[root@localhost php-7.1.6]# vim /usr/local/php7/etc/php.ini
;date.timezone =Asis/Shanghai 注意首字母大寫(A S)
[root@localhost php-7.1.6]# /usr/local/apache2/bin/apachectl graceful
3.
[root@localhost ~]# vim /usr/local/php7/etc/php.ini 我們第一步驟得到的配置檔案路徑
搜尋 disable_functions,後面直接加上哪些危險的函式即可。因為我們實驗要用phpinfo,所以沒有禁掉
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@localhost ~]# /usr/local/apache2/bin/apachectl graceful
4.
[root@localhost php-7.1.6]# vim /usr/local/php7/etc/php.ini
display_errors = Off 搜尋display_errors,改為Off(首字母大寫)
以上為白頁
定義錯誤日誌,首先檢查log_errors是否開啟(On)
log_errors = On
搜尋error_log,設定錯誤路徑
; Example:
error_log = /tmp/php_errors.log 這一行,前面加上目錄即可,不要改名字
; Log errors to syslog (Event Log on Windows)
如果我們在建立錯誤日誌的時候,不能生成php_errors.log。就要先touch一個,並給他設定一個777的許可權
[root@localhost php-7.1.6]# touch /tmp/php_errors.log ; chmod 777 /tmp/php_errors.log
[root@localhost php-7.1.6]# /usr/local/apache2/bin/apachectl -t
Syntax OK
[root@localhost php-7.1.6]# /usr/local/apache2/bin/apachectl graceful
[root@localhost php-7.1.6]# cat /tmp/php_errors.log
[07-Aug-2018 17:02:32 UTC] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
搜尋error_reporting,設定錯誤的記錄級別。生產環境設定為E_ALL & ~E_NOTICE。搜尋的時候上面有選擇,直接複製,後面括號的不用複製。
error_reporting = E_ALL ALL代表所有的都記錄
5.
[root@localhost php-7.1.6]# !vim
vim /usr/local/php7/etc/php.ini
open_basedir = /data/wwwroot/111.com/:/tmp
[root@localhost php-7.1.6]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/" 在不同的虛擬主機里加上不同的 open_basedir 即可,直接輸入這一行
[root@localhost php-7.1.6]# /usr/local/apache2/bin/apachectl -t
Syntax OK
[root@localhost php-7.1.6]# /usr/local/apache2/bin/apachectl graceful
apache開啟壓縮 http://ask.apelearn.com/question/5528
/usr/local/apache2.4/bin/apachectl -l
Compiled in modules:
core.c
mod_so.c
http_core.c
event.c
ls /usr/local/apache2.4/modules/
httpd.exp mod_authn_dbd.so mod_buffer.so mod_ext_filter.so mod_logio.so mod_proxy_http.so mod_session_dbd.so mod_unixd.so
libphp5.so mod_authn_dbm.so mod_cache_disk.so mod_file_cache.so mod_macro.so mod_proxy_scgi.so mod_session.so mod_userdir.so
libphp7.so mod_authn_file.so mod_cache.so mod_filter.so mod_mime.so mod_proxy.so mod_setenvif.so mod_version.so
mod_access_compat.so mod_authn_socache.so mod_cache_socache.so mod_headers.so mod_negotiation.so mod_proxy_uwsgi.so mod_slotmem_shm.so mod_vhost_alias.so
mod_actions.so mod_authz_core.so mod_cgid.so mod_include.so mod_proxy_ajp.so mod_proxy_wstunnel.so mod_socache_dbm.so mod_watchdog.so
mod_alias.so mod_authz_dbd.so mod_dav_fs.so mod_info.so mod_proxy_balancer.so mod_ratelimit.so mod_socache_memcache.so
mod_allowmethods.so mod_authz_dbm.so mod_dav.so mod_lbmethod_bybusyness.so mod_proxy_connect.so mod_remoteip.so mod_socache_redis.so
mod_auth_basic.so mod_authz_groupfile.so mod_dbd.so mod_lbmethod_byrequests.so mod_proxy_express.so mod_reqtimeout.so mod_socache_shmcb.so
mod_auth_digest.so mod_authz_host.so mod_dir.so mod_lbmethod_bytraffic.so mod_proxy_fcgi.so mod_request.so mod_speling.so
mod_auth_form.so mod_authz_owner.so mod_dumpio.so mod_lbmethod_heartbeat.so mod_proxy_fdpass.so mod_rewrite.so mod_status.so
mod_authn_anon.so mod_authz_user.so mod_env.so mod_log_config.so mod_proxy_ftp.so mod_sed.so mod_substitute.so
mod_authn_core.so mod_autoindex.so mod_expires.so mod_log_debug.so mod_proxy_hcheck.so mod_session_cookie.so mod_unique_id.so