基礎知識
What's
滲透測試
滲透測試(penetration test)并沒有一個標準的定義,國外一些安全組織達成共識的通用說法是:
滲透測試是通過模擬惡意黑客的攻擊方法,來評估計算機網絡系統安全的一種評估方法。這個過程包括對系統的任何弱點、技術缺陷或漏洞的主動分析,這個分析是從一個攻擊者可能存在的位置來進行的,并且從這個位置有條件主動利用安全漏洞。
其具有的兩個顯著特點是:
- 滲透測試是一個漸進的并且逐步深入的過程;
- 滲透測試是選擇不影響業務系統正常運行的攻擊方法進行的測試;
方法
攻擊者通過各種手段查找漏洞并加以利用達到目的。
基本概念
在進行Web滲透測試之前,攻擊者需要對Web服務的一些基本概念有所了解。知己知彼,才能百戰不殆。一個合格的Web滲透測試者一定對Web服務十分了解。
Basic
IP 地址####
網絡之間互連的協議(IP)是Internet Protocol的外語縮寫,中文縮寫為“網協”。網絡之間互連的協議也就是為計算機網絡相互連接進行通信而設計的協議。在因特網中,它是能使連接到網上的所有計算機網絡實現相互通信的一套規則,規定了計算機在因特網上進行通信時應當遵守的規則。任何廠家生產的計算機系統,只要遵守IP協議就可以與因特網互連互通。
IP協議中還有一個非常重要的內容,那就是給因特網上的每臺計算機和其它設備都規定了一個唯一的地址,叫做“IP 地址”。由于有這種唯一的地址,才保證了用戶在連網的計算機上操作時,能夠高效而且方便地從千千萬萬臺計算機中選出自己所需的對象來。
IP地址用二進制數來表示,每個IP地址長32比特,由4個小于256的數字組成,數字之間用點間隔,例如100.10.0.1表示一個IP地址。
域名
網絡是基于TCP/IP協議進行通信和連接的,每一臺主機都有一個唯一的標識固定的IP地址,以區別在網絡上成千上萬個用戶和計算機。網絡在區分所有與之相連的網絡和主機時,均采用了一種唯一、通用的地址格式,即每一個與網絡相連接的計算機和服務器都被指派了一個獨一無二的地址。網絡中的地址方案分為兩套:IP地址系統和域名地址系統。這兩套地址系統其實是一一對應的關系。由于IP地址是數字標識,使用時難以記憶和書寫,因此在IP地址的基礎上又發展出一種符號化的地址方案,來代替數字型的IP地址。每一個符號化的地址都與特定的IP地址對應,這樣網絡上的資源訪問起來就容易得多了。這個與網絡上的數字型IP地址相對應的字符型地址,就被稱為域名。
域名可分為不同級別,包括頂級域名、二級域名、三級域名、注冊域名。
DNS
DNS(Domain Name System,域名系統),因特網上作為域名和IP地址相互映射的一個分布式數據庫,能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串。通過主機名,最終得到該主機名對應的IP地址的過程叫做域名解析(或主機名解析)。DNS協議運行在UDP協議之上,使用端口號53(參見下文端口)。在RFC文檔中RFC 2181對DNS有規范說明,RFC 2136對DNS的動態更新進行說明,RFC 2308對DNS查詢的反向緩存進行說明。
端口
端口是英文port的意譯,可以認為是計算機與外界通訊交流的出口。端口可分為虛擬端口和物理端口,其中虛擬端口指計算機內部或交換機路由器內的端口,不可見。物理端口又稱為接口,是可見端口。通常在滲透測試中所指的端口是虛擬端口。
TCP/IP 協議
TCP/IP協議是Transmission Control Protocol/Internet Protocol的簡寫,中譯名為傳輸控制協議/因特網互聯協議,又名網絡通訊協議,是Internet最基本的協議、Internet國際互聯網絡的基礎,由網絡層的IP協議和傳輸層的TCP協議組成。TCP/IP定義了電子設備如何連入因特網,以及數據如何在它們之間傳輸的標準。TCP/IP協議是網絡應用程序與互聯網上的主機交換數據的基礎,包括后面的HTTP協議等都是建立在TCP/IP協議的基礎之上。
TCP與UDP
TCP/IP協議具體又分為TCP與UDP兩種通信方式。
TCP在正式通信前必須要與對方建立起連接。比如你給別人打電話,必須等線路接通了、對方拿起話筒才能相互通話。
UDP在正式通信前不必與對方先建立連接,不管對方狀態就直接發送。與風行的手機短信非常相似:你在發短信的時候,只需要輸入對方手機號就OK了。
HTTP協議
HTTP又稱為超文本傳輸協議(HTTP,HyperText Transfer Protocol),是互聯網上應用最為廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標準。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。HTTP是一個基于請求與響應模式的、無狀態的、應用層的協議,常基于TCP的連接方式,HTTP1.1版本中給出一種持續連接的機制,絕大多數的Web開發,都是構建在HTTP協議之上的Web應用。
URL
HTTP URL(URL是一種特殊類型的URI,包含了用于查找某個資源的足夠的信息)的格式如下:
http://host[":"port][absolut_path]
- http表示要通過HTTP協議來定位網絡資源;
- host表示合法的Internet主機域名或者IP地址;
- port指定一個端口號,為空則使用缺省端口80;
- absolut_path指定請求資源的URI,如果URL中沒有給出abs_path,那么當它作為請求URI時,必須以“/”的形式給出,通常這個工作瀏覽器自動幫我們完成。
例如:
1、輸入:www.baidu.com 瀏覽器自動轉換成:http://www.baidu.com/
2、訪問本地主機8080端口下的index.html文件:http:192.168.1.1:8080/index.html
HTTP請求
http請求由三部分組成,分別是:請求行、消息報頭、請求正文
請求行
請求行以一個方法符號開頭,以空格分開,后面跟著請求的URI和協議的版本,格式如下:
Method Request-URI HTTP-Version CRLF
-
其中 Method表示請求方法,請求方法(所有方法全為大寫)有多種,各個方法的解釋如下:
GET 請求獲取Request-URI所標識的資源; POST 在Request-URI所標識的資源后附加新的數據; HEAD 請求獲取由Request-URI所標識的資源的響應消息報頭; PUT 請求服務器存儲一個資源,并用Request-URI作為其標識; DELETE 請求服務器刪除Request-URI所標識的資源; TRACE 請求服務器回送收到的請求信息,主要用于測試或診斷; CONNECT 保留將來使用; OPTIONS 請求查詢服務器的性能,或者查詢與資源相關的選項和需求;
Request-URI是一個統一資源標識符;
HTTP-Version表示請求的HTTP協議版本;
CR與LF分別表示表示回車和換行(除了作為結尾的CRLF外,不允許出現 單獨的CR或LF字符)。
在滲透測試中常用到的是GET和POST方法:
GET方法:
在瀏覽器的地址欄中輸入網址的方式訪問網頁時,瀏覽器采用GET方法向服務器獲取資源,例如:
GET /form.html HTTP/1.1 CRLF
POST方法:
要求被請求服務器接受附在請求后面的數據,常用于提交表單。例如:
POST /index.php HTTP/1.1 (CRLF) //請求行,緊接著是消息報頭
HOST:www.baidu.cn (CRLF)
Content-Length:22 (CRLF)
Connection:Keep-Alive (CRLF)
Cache-Control:no-cache (CRLF)
(CRLF) //該CRLF表示消息報頭已經結束,在此之前為消息報頭
id=1234 //此行以下為提交的數據
消息報頭
HTTP消息報頭包括普通報頭、請求報頭、響應報頭、實體報頭。
每一個報頭域都是由名字+“:”+空格+值
組成,消息報頭域的名字是大小寫無關的。
-
普通報頭
在普通報頭中,有少數報頭域用于所有的請求和響應消息,但并不用于被傳輸的實體,只用于傳輸的消息。請求時的緩存指令包括:
Cache-Control、no-cache(用于指示請求或響應消息不能緩存)、no-store、max-age、max-stale、min-fresh、only-if-cached;
響應時的緩存指令包括:
public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.
Date 普通報頭域表示消息產生的日期和時間
Connection普通報頭域允許發送指定連接的選項。例如指定連接是連續,或者指定“close”選項,通知服務器,在響應完成后,關閉連接
-
請求報頭
請求報頭允許客戶端向服務器端傳遞請求的附加信息以及客戶端自身的信息。常用的請求報頭
Accept Accept請求報頭域用于指定客戶端接受哪些類型的信息。例如:Accept:image/gif,表明客戶端希望接受GIF圖象格式的資源;Accept:text/html,表明客戶端希望接受html文本。 Accept-Charset Accept-Charset請求報頭域用于指定客戶端接受的字符集。例如:Accept-Charset:iso-8859-1,gb2312.如果在請求消息中沒有設置這個域,缺省是任何字符集都可以接受。 Accept-Encoding Accept-Encoding請求報頭域類似于Accept,但是它是用于指定可接受的內容編碼。例如:Accept-Encoding:gzip.deflate.如果請求消息中沒有設置這個域服務器假定客戶端對各種內容編碼都可以接受。 Accept-Language Accept-Language請求報頭域類似于Accept,但是它是用于指定一種自然語言。eg:Accept-Language:zh-cn.如果請求消息中沒有設置這個報頭域,服務器假定客戶端對各種語言都可以接受。 Authorization Authorization請求報頭域主要用于證明客戶端有權查看某個資源。當瀏覽器訪問一個頁面時,如果收到服務器的響應代碼為401(未授權),可以發送一個包含Authorization請求報頭域的請求,要求服務器對其進行驗證。 Host 發送請求時,該報頭域是必需的,請求報頭域主要用于指定被請求資源的Internet主機和端口號,它通常從HTTP URL中提取出來的,例如:我們在瀏覽器中輸入:http://www.baidu.com/瀏覽器發送的請求消息中,就會包含Host請求報頭域,如下: Host:www.baidu.com User-Agent 我們上網登陸論壇的時候,往往會看到一些歡迎信息,其中列出了你的操作系統的名稱和版本,你所使用的瀏覽器的名稱和版本,這往往讓很多人感到很神奇,實際上,服務器應用程序就是從User-Agent這個請求報頭域中獲取到這些信息。User-Agent請求報頭域允許客戶端將它的操作系統、瀏覽器和其它屬性告訴服務器。不過,這個報頭域不是必需的,如果我們自己編寫一個瀏覽器,不使用User-Agent請求報頭域,那么服務器端就無法得知我們的信息了。
請求報頭舉例:
GET / HTTP/1.1 (CRLF) Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF) Accept-Language:zh-cn (CRLF) Accept-Encoding:gzip,deflate (CRLF) If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF) If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF) User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF) Host:www.baidu.com (CRLF) Connection:Keep-Alive (CRLF) (CRLF)
-
響應報頭
響應報頭允許服務器傳遞不能放在狀態行中的附加響應信息,以及關于服務器的信息和對Request-URI所標識的資源進行下一步訪問的信息。常用的響應報頭
Location Location響應報頭域用于重定向接受者到一個新的位置。Location響應報頭域常用在更換域名的時候。 Server Server響應報頭域包含了服務器用來處理請求的軟件信息。與User-Agent請求報頭域是相對應的。下面是Server響應報頭域的一個例子: Server:Apache-Coyote/1.1 WWW-Authenticate WWW-Authenticate響應報頭域必須被包含在401(未授權的)響應消息中,客戶端收到401響應消息時候,并發送Authorization報頭域請求服務器對其進行驗證時,服務端響應報頭就包含該報頭域。
-
實體報頭
請求和響應消息都可以傳送一個實體。一個實體由實體報頭域和實體正文組成,但并不是說實體報頭域和實體正文要在一起發送,可以只發送實體報頭域。實體報頭定義了關于實體正文(有無實體正文)和請求所標識的資源的元信息。常用的實體報頭
Content-Encoding Content-Encoding實體報頭域被用作媒體類型的修飾符,它的值指示了已經被應用到實體正文的附加內容的編碼,因而要獲得Content-Type報頭域中所引用的媒體類型,必須采用相應的解碼機制。Content-Encoding這樣用于記錄文檔的壓縮方法,eg:Content-Encoding:gzip Content-Language Content-Language實體報頭域描述了資源所用的自然語言。沒有設置該域則認為實體內容將提供給所有的語言閱讀者。 Content-Length Content-Length實體報頭域用于指明實體正文的長度,以字節方式存儲的十進制數字來表示。 Content-Type Content-Type實體報頭域用語指明發送給接收者的實體正文的媒體類型。 Last-Modified Last-Modified實體報頭域用于指示資源的最后修改日期和時間。 Expires Expires實體報頭域給出響應過期的日期和時間。為了讓代理服務器或瀏覽器在一段時間以后更新緩存中(再次訪問曾訪問過的頁面時,直接從緩存中加載,縮短響應時間和降低服務器負載)的頁面,我們可以使用Expires實體報頭域指定頁面過期的時間。HTTP1.1的客戶端和緩存必須將其他非法的日期格式(包括0)看作已經過期。
請求正文
在消息報頭后面緊接著的就是請求正文,正文前用回車換行()表示請求正文的開始。請求正文是用戶提交給服務器的數據,比如文件上傳時候的文件內容。
HTTP響應
在接收和解釋請求消息后,服務器返回一個HTTP響應消息。HTTP響應也是由三個部分組成,分別是:狀態行、消息報頭、響應正文
-
狀態行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLFHTTP-Version表示服務器HTTP協議的版本; Status-Code表示服務器發回的響應狀態代碼; Reason-Phrase表示狀態代碼的文本描述。
狀態代碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:
1xx:指示信息--表示請求已接收,繼續處理 2xx:成功--表示請求已被成功接收、理解、接受 3xx:重定向--要完成請求必須進行更進一步的操作 4xx:客戶端錯誤--請求有語法錯誤或請求無法實現 5xx:服務器端錯誤--服務器未能實現合法的請求
常見狀態代碼、狀態描述、說明:
200 OK //客戶端請求成功 400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解 401 Unauthorized //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用 403 Forbidden //服務器收到請求,但是拒絕提供服務 404 Not Found //請求資源不存在,eg:輸入了錯誤的URL 500 Internal Server Error //服務器發生不可預期的錯誤 503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
例如:
HTTP/1.1 200 OK (CRLF)
響應報頭請求部分已經描述,此處不再重述。
響應正文就是服務器返回的資源的內容
FTP協議
FTP(File Transfer Protocol,文件傳輸協議)是TCP/IP協議組中的協議之一。FTP協議包括兩個組成部分,其一為FTP服務器,其二為FTP客戶端。其中FTP服務器用來存儲文件,用戶可以使用FTP客戶端通過FTP協議訪問位于FTP服務器上的資源。在開發網站的時候,通常利用FTP協議把網頁或程序傳到Web服務器上。此外,由于FTP傳輸效率非常高,在網絡上傳輸大的文件時,一般也采用該協議。
默認情況下FTP協議使用TCP端口中的 20和21這兩個端口,其中20用于傳輸數據,21用于傳輸控制信息。但是,是否使用20作為傳輸數據的端口與FTP使用的傳輸模式有關,如果采用主動模式,那么數據傳輸端口就是20;如果采用被動模式,則具體最終使用哪個端口要服務器端和客戶端協商決定。
Web服務、網頁基礎
Web服務器便是滲透測試者攻擊的對象,掌握Web服務知識框架才能有效的進行滲透測試。我把Web服務分成了瀏覽器(客戶端)和服務器兩部分。由于種種原因,我并不會詳細介紹其中涉及到的編程方面的知識,知識簡單的講解一些基本的東西,所以不要把這個當成是學習相關知識的教程。其中涉及到的編程細節請具體查找相關的資料。
可視部分 - 瀏覽器
在客戶端所能直接體驗得到的Web服務便是瀏覽器提供的可視化網頁,也就是滲透測試將主要圍繞瀏覽器進行。當然,也有用遠程登錄服務等入侵的方式。
HTML
超級文本標記語言是通過標記符號來標記要顯示的網頁中的各個部分。網頁文件本身是一種文本文件,通過在文本文件中添加標記符,可以告訴瀏覽器如何顯示其中的內容(如:文字如何處理,畫面如何安排,圖片如何顯示等)。瀏覽器按順序閱讀網頁文件,然后根據標記符解釋和顯示其標記的內容,對書寫出錯的標記將不指出其錯誤,且不停止其解釋執行過程,編制者只能通過顯示效果來分析出錯原因和出錯部位。但需要注意的是,對于不同的瀏覽器,對同一標記符可能會有不完全相同的解釋,因而可能會有不同的顯示效果。
![知乎首頁源代碼][1]
網頁文件的源代碼保存為.html[后綴][2]的文件,瀏覽器會解釋后綴為.html的文件,并顯示在窗口。例如,將下面一段代碼保存到一個后綴為.html的文件中,用瀏覽器打開:
<html>
<head><title>Hello world</title></head>
<body>
<center>Hello world!</center>
</body>
<html>
就能看到如下的圖片:
![Hello world][3]
標簽
在HTML中形如<HTML>
的稱為標簽,他是HTML中的基本元素。HTML中有非常多的標簽,分別完成不同的功能。每個標簽擁有自己的屬性,比如:<hr size='9' width='80%' color='ff0000'>
中的size、width和color都是水平線hr的屬性。在標簽中的/
起到關閉標簽的作用,例如</html>
就將前面的html
標簽閉合,因此這兩個必須成對的出現。
HTML文件格式
根據[W3C標準][4],一個HTML文件必須按照下面的格式編寫:
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
</body>
<html>
<!-- 注釋 -->
其中:
<!DOCTYPE> 聲明必須是 HTML 文檔的第一行,位于 <html> 標簽之前。
<!DOCTYPE> 聲明不是 HTML 標簽;它是指示 web 瀏覽器關于頁面使用哪個 HTML 版本進行編寫的指令。
HTML文件中的所有標簽都必須包含在<html></html>中間,其中分成兩個部分,head和body。
<head> 標簽用于定義文檔的頭部,它是所有頭部元素的容器。<head>中的元素可以引用腳本、指示瀏覽器在哪里找到樣式表、提供元信息等等。文檔的頭部描述了文檔的各種屬性和信息,包括文檔的標題、在Web中的位置以及和其他文檔的關系等。絕大多數文檔頭部包含的數據都不會真正作為內容顯示給讀者。下面這些標簽可用在 head 部分:<base>, <link>, <meta>, <script>, <style>, 以及 <title>。<title> 定義文檔的標題,它是 head 部分中唯一必需的元素。
body 元素定義文檔的主體。body元素包含文檔的所有內容(比如文本、超鏈接、圖像、表格和列表等等。)
<!-- --> 是HTML文件中的注釋,就像C中的/* */一樣工作。
HTML表單
表單是一個包含表單元素的區域。表單元素是允許用戶在表單中(比如:文本域、下拉列表、單選框、復選框等等)輸入信息的元素。表單一般用于客戶端向服務器提交數據。表單使用表單標簽(<form>
)定義。具體如下:
<form> <input /></form>
其中的<input>
是輸入標簽,輸入標簽有多中輸入類型。輸入類型是由類型屬性(type)定義的。大多數經常被用到的輸入類型如下:
####### 文本域
當用戶要在表單中鍵入字母、數字等內容時,就會用到文本域(text fields)。
<form>
First name: <input type="text" name="firstname" /><br />
Last name: <input type="text" name="lastname" />
</form>
其中的name是該input的名稱,瀏覽器顯示如下:
![文本域][5]
####### 單選按鈕
當用戶從若干給定的的選擇中選取其一時,就會用到單選框(radio buttons)。
<form>
<input type="radio" name="sex" value="male"> Male
<input type="radio" name="sex" value="female"> Female
</form>
瀏覽器顯示如下:
![單選按鈕][6]
####### 復選框
當用戶需要從若干給定的選擇中選取一個或若干選項時,就會用到復選框(checkboxes)。
<form>
<input type="checkbox" name="bike" />I have a bike
<br />
<input type="checkbox" name="car" />I have a car
</form>
####### 確認按鈕
當用戶單擊確認按鈕(submit)時,表單的內容會被傳送到另一個文件。
####### 動作屬性
表單的動作屬性(action)定義了目的文件的文件名。由動作屬性定義的這個文件通常會對接收到的輸入數據進行相關的處理。
<form name="input" action="target" method="get">
Username: <input type="text" name="user">
<input type="submit" value="Submit">
</form>
action中的target是指表單數據提交的目標文件。
CSS
層疊樣式表,簡單來說就是光HTML做的網頁太難看了,人們就發明了這個玩意來美化的。具體細節請百度。
![CSS][7]
Javascript
JavaScript是一種屬于網絡的腳本語言,已經被廣泛用于Web應用開發,常用來為網頁添加各式各樣的動態動能,為用戶提供更流暢美觀的瀏覽效果。JavaScript被數百萬計的網頁用來改進設計、驗證表單、檢測瀏覽器、創建cookies,以及更多的應用。下面通過一個例子來說明:
<html>
<head>
<title>Test</title>
<script type="text/javascript">
function disp_alert()
{
alert("哈哈哈!!")
}
</script>
</head>
<body>
<input type="button" onclick="disp_alert()" value="點我" />
</body>
<html>
將上述代碼保存為HTML文件,在瀏覽器中運行結果如下:
![Javascript][8]
其中<script>
標簽表示插入腳本,屬性type
表明腳本語言為Javascript。<script></script>
中間部分為Javascript代碼,這里定義了disp_alert()
函數,用于顯示一個對話框。在<input type="button" onclick="disp_alert()" value="點我" />
中onclick
屬性表示當用戶點擊的時候,調用其值所指向的函數disp_alert()
。
Javascript具體的語法細節請百度。
Cookie
Cookie是由服務器端生成,發送給User-Agent(一般是瀏覽器),瀏覽器會將Cookie的key/value保存到某個目錄下的文本文件內,下次請求同一網站時就發送該Cookie給服務器(前提是瀏覽器設置為啟用cookie)。Cookie名稱和值可以由服務器端開發自己定義,這樣服務器可以知道該用戶是否合法用戶以及是否需要重新登錄等,服務器可以設置或讀取Cookies中包含信息,借此維護用戶跟服務器會話中的狀態。
服務器可以利用Cookies包含信息的任意性來篩選并經常性維護這些信息,以判斷在HTTP傳輸中的狀態。Cookies最典型的應用是判定注冊用戶是否已經登錄網站,用戶可能會得到提示,是否在下一次進入此網站時保留用戶信息以便簡化登錄手續,這些都是Cookies的功用。另一個重要應用場合是“購物車”之類處理。用戶可能會在一段時間內在同一家網站的不同頁面中選擇不同的商品,這些信息都會寫入Cookies,以便在最后付款時提取信息。
不可視部分 - 服務器
服務器也稱伺服器,是提供計算服務、響應用戶的服務請求的設備。服務器的構成包括處理器、硬盤、內存、系統總線等,和通用的計算機架構類似,但是由于需要提供高可靠的服務,因此在處理能力、穩定性、可靠性、安全性、可擴展性、可管理性等方面要求較高。普通的PC機都可以當服務器,讓外界通過IP地址訪問你的電腦。服務器上要有相應的服務器軟件,對于[WWW服務][9],服務器上需要Web服務軟件提供支持。
Web服務器軟件
Web服務器可以解析HTTP協議。當Web服務器接收到一個HTTP請求,會返回一個HTTP響應,例如送回一個HTML頁面。為了處理一個請求,Web服務器可以響應一個靜態頁面或圖片,進行頁面跳轉,或者把動態響應的產生委托給一些其它的程序例如CGI腳本,JSP(JavaServer Pages)腳本,servlets,ASP(Active Server Pages)腳本,PHP腳本,或者一些其它的服務器端技術。Web服務器的代理模型非常簡單。當一個請求被送到Web服務器里來時,它只單純的把請求傳遞給可以很好的處理請求的服務器端腳本。Web服務器僅僅提供一個可以執行服務器端程序和返回(程序所產生的)響應的環境,而不會超出職能范圍。
常見的Web服務器軟件有:
Apache Apache 源于NCSAhttpd服務器,經過多次修改,成為世界上最流行的Web服務器軟件之一。Apache取自"a patchy server"的讀音,意思是充滿補丁的服務器,因為它是自由軟件,所以不斷有人來為它開發新的功能、新的特性、修改原來的缺陷。Apache的特點是簡 單、速度快、性能穩定,并可做代理服務器來使用。
IIS 英文Internet Information Server的縮寫,譯成中文就是"Internet信息服務"的意思。它是微軟公司主推的服務器,最新的版本是Windows2008里面包含的IIS 7,IIS與Window Server完全集成在一起,因而用戶能夠利用Windows Server和NTFS(NT File System,NT的文件系統)內置的安全特性,建立強大,靈活而安全的Internet和Intranet站點。
Nginx 不僅是一個小巧且高效的HTTP服務器,也可以做一個高效的負載均衡反向代理,通過它接受用戶的請求并分發到多個Mongrel進程可以極大提高Rails應用的并發能力。
Lighttpd 由德國人 Jan Kneschke 領導開發的,基于BSD許可的開源WEB服務器軟件,其根本的目的是提供一個專門針對高性能網站,安全、快速、兼容性好并且靈活的web server環境。具有非常低的內存開銷,CPU占用率低,效能好,以及豐富的模塊等特點。
Zeus 是一個運行于Unix下的非常優秀的Web Server,據說性能超過Apache,是效率最高的Web Server之一。
Tomcat 是Apache 軟件基金會(Apache Software Foundation)的Jakarta 項目中的一個核心項目,由Apache、Sun 和其他一些公司及個人共同開發而成。由于有了Sun 的參與和支持,最新的Servlet 和JSP 規范總是能在Tomcat 中得到體現。因為Tomcat 技術先進、性能穩定,而且免費,因而深受Java 愛好者的喜愛并得到了部分軟件開發商的認可,成為目前比較流行的Web 應用服務器。
服務器腳本
處理Web服務器委托的請求并動態的生成HTML文件的一種腳本語言。因為網頁上有很多信息,隨時都在更新,不可能每次都去手工把信息輸到網頁中把,這些人為了偷懶,便發明了一種腳本語言來動態完成這個功能。基本思路是首先建立一個網頁的模板,然后用戶請求的時候調用腳本把數據加添加到模板上面然后返回給用戶。
常用的腳本有JSP,ASP,PHP。下面是我寫的一個PHP程序的源代碼:
<html>
<head>
<title>catch</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?php
include_once('util.php');
include_once('common.php');
include_once('page.php');
include_once('./lib/simple_html_dom.php');
checkPermission();
$target_url = 'http://zhihudaily.ahorn.me/page/';
$page = new page();
$html = file_get_html($target_url.'1');
$total = getPage($html);
$html->clear();
$start = microtime(true);
for ($pageCount = 1, $count = 0; $pageCount <= $total; $pageCount++) {
print('正在分析第'.$pageCount.'頁'."\n");
$begin = microtime(true);
$html = file_get_html($target_url.$pageCount);
foreach($html->find("div[class=item] a") as $post)
{
$page->loadPage($post->href);
$page->printToFile();
$count++;
}
$html->clear();
$end = microtime(true);
$total = $end - $begin;
print('第'.$pageCount.'頁分析結束。花費了:'.$total."\n");
}
$total = $end - $start; //計算差值
print('分析結束,共完成'.$count.'篇文章的分析。');
print('共花時間:'.$total.'秒'."\n");
?>
</body>
</html>
這些腳本語言的細節不是一丁點文章便能敘述清楚的,在這里我就不做展開,具體請查找相關的資料。
---
##### Dtabase
數據庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,可以快速方便的插入,查詢,更新,刪除數據。
常見的數據庫有:
ORACLE,
SQL SERVER,
MYSQL,
SQL SERVER CE
SQLITE
下面以Mysql代碼演示數據庫的常用操作:
1、建表格:
create table table_name(
column1 datatype [not null] [not null primary key],
column2 datatype [not null],
...);
說明:
datatype --是資料的格式,詳見表。
nut null --可不可以允許資料有空的(尚未有資料填入)。
primary key --是本表的主鍵。
2、更改表格
alter table table_name
add column column_name datatype
說明:增加一個欄位(沒有刪除某個欄位的語法。
alter table table_name
add primary key (column_name)
說明:更改表得的定義把某個欄位設為主鍵。
alter table table_name
drop primary key (column_name)
說明:把主鍵的定義刪除。
3、建立索引
create index index_name on table_name (column_name)
說明:對某個表格的欄位建立索引以增加查詢時的速度。
4、刪除
drop table_name
drop index_name
Mysql數據庫存放數據以表(table)為單位,每個表擁有多個欄目(column),下面為一個簡單的Mysql表的示例:
![Mysql][10]
關于數據庫的一些具體細節,這里不做展開,請查閱相關資料。
## 后記
精力有限,很多東西簡單介紹一下,并沒有做展開。姑且寫下這么點東西,倉促之間肯定會有不少缺失與紕漏,待到有閑時再做完善。剛學的時候并不要求全部掌握上面所講的知識,只需有個簡單了解,留下個印象,日后需要之時再結合百度等平臺查閱相關資料,事半功倍。
---
## 引用 ##
[IP地址 - 百度百科][11]
[DNS服務器 - 百度百科][12]
[端口 - 百度百科][13]
[域名 - 百度百科][14]
[TCP/IP協議 - 百度百科][15]
[HTTP協議詳解 - 博客園][16]
[HTTP協議 - 百度百科][17]
[FTP協議 - 百度百科][18]
[HTML - 百度百科][19]
[HTML表單 - 百度百科][20]
[CSS - 百度百科][21]
[Cookie - 百度百科][22]
[1]: http://git.oschina.net/thinkermao/MyBlog/raw/master/res/Image/WebSecurity/QQ%E6%88%AA%E5%9B%BE20150312165401.png
[2]: http://baike.baidu.com/view/70172.htm?fromtitle=%E6%96%87%E4%BB%B6%E5%90%8E%E7%BC%80&fromid=8663966&type=syn
[3]: http://git.oschina.net/thinkermao/MyBlog/raw/master/res/Image/WebSecurity/QQ%E6%88%AA%E5%9B%BE20150312173204.png
[4]: http://baike.baidu.com/link?url=BHxQECrJv4QxyzRLGvOiWtAA0e_PLVJ_28IMCAtvVR1UeEd06CrWjx6LzSlGHyig7cXJ5ZtqpY7tWfQ9vsj5F2m4hO5NL8ldUbYYMyYa1s2kIZFmaaGiRHXDYzo8Z0Yp
[5]: http://h.hiphotos.baidu.com/baike/s=250/sign=f82e02c6cb3d70cf48faad08c8ddd1ba/d043ad4bd11373f005123f60a60f4bfbfbed041b.jpg
[6]: http://h.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=deb45f189c22720e6fc3eaa81aa26123/9d82d158ccbf6c815749d692b83eb13533fa404a.jpg
[7]: http://a.hiphotos.baidu.com/baike/w=220/sign=f972daa2b11bb0518f24b42a067bda77/279759ee3d6d55fbe2fea0a66f224f4a20a4dd72.jpg
[8]: http://git.oschina.net/thinkermao/MyBlog/raw/master/res/Image/WebSecurity/QQ%E6%88%AA%E5%9B%BE20150312190907.png
[9]: http://baike.baidu.com/view/576458.htm
[10]: http://git.oschina.net/thinkermao/MyBlog/raw/master/res/Image/WebSecurity/QQ%E6%88%AA%E5%9B%BE20150312200002.png
[11]: http://baike.baidu.com/view/3930.htm
[12]: http://baike.baidu.com/view/443551.htm
[13]: http://baike.baidu.com/view/1075.htm
[14]: http://baike.baidu.com/view/43.htm
[15]: http://baike.baidu.com/view/7649.htm
[16]: http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html
[17]: http://baike.baidu.com/link?url=N8Kf-GHS6jo0iVbF9YaQst5DgKelq6cS6mrT8idS5rx6Ew-U48tJzRZ671RZkiaEYcTPAqjvVhLijhcBgIaP5K
[18]: http://baike.baidu.com/view/1157060.htm
[19]: http://baike.baidu.com/view/692.htm?fromtitle=%E8%B6%85%E6%96%87%E6%9C%AC%E6%A0%87%E8%AE%B0%E8%AF%AD%E8%A8%80&fromid=6972570&type=syn
[20]: http://baike.baidu.com/link?url=OBrYm0qKGxo8Xgsdn8eNN8QPtKvZEPaU0rVHJF4xIF9Wa2AWrBoE-rAW3BwAQEIjptaFJpyABHnmY7pkMJ4LLq
[21]: http://baike.baidu.com/link?url=kpnfYFuu91VyZodiGGysuHouMezOxtT361-crUuxzVLLEIpeidpR-vap7tHBKUpEB8RimYiBgZIBFTEk2j6qhkCNz-yZtVUvKXjh1oJxvkC
[22]: http://baike.baidu.com/link?url=XiuMaqVDjM1K3OJYXaUphA2a_3ZlPIeZ_Z5YYymhb9AgzOwFpOFo3zjqcoRepGlAe1Yvkx2oryPLXElaYSytqqrAnVseHa0EPYltt4nZ-MO