国产精品香蕉在线观看网,亚洲欧美精品综合在线观看,亚洲不卡av一区二区无码不卡,亚洲日本精品国产第一区二区

移動安全 安全管理 應用案例 網(wǎng)絡(luò)威脅 系統(tǒng)安全應用安全 數(shù)據(jù)安全 云安全
當前位置: 主頁 > 信息安全 > 應用安全 >

你必需體味的Session的本質(zhì)

時間:2014-02-11 13:38來源:TuZhiJiaMi企業(yè)信息安全專家 點擊:
有一點我們必需承認,大年夜大都web利用法度都離不開session的利用。這篇文章將會連絡(luò)php和http和談來闡發(fā)若何成立一個安然的會話治理機制。我們先簡單的體味一些http的常識,從而理解該和
Tags應用安全(1006)Session(1)  

  有一點我們必需承認,大年夜大都web利用法度都離不開session的利用。這篇文章將會連絡(luò)php和http和談來闡發(fā)若何成立一個安然的會話治理機制。我們先簡單的體味一些http的常識,從而理解該和談的無狀況特點。然后,進修一些關(guān)于cookie的根基把持。最后,我會一步步闡述若何利用一些簡單,高效的編制來進步你的php利用法度的安然性和不變行。

  我想大年夜大都的php初級法度員必然會覺得php默許的session機制的安然性仿佛是有必然保障的,事實剛好相反 – php團隊只是供給了一套便捷的session的解決方案供給給法度員利用,至于安然性的話,應當由法度員來加強,這是利用法度開辟團隊的責任。因為,這里面的編制良多,可以這么說吧,沒有最好,只有更好。報復打擊的編制在不竭改變,戍守方也需要不竭變招,所以,我小我覺得php團隊的做法仍是比較明智的。

  無狀況性

  Http是一種無狀況性的和談。這是因為此種和談不要求瀏覽器在每次要求中標明它本身的身份,并且瀏覽器和辦事器之間并沒有保持一個持久性的連接用于多個頁面之間的拜候。當一個用戶拜候一個站點的時辰,用戶的瀏覽器發(fā)送一個http要求到辦事器,辦事器返回給瀏覽器一個http響應。其實很簡單的一個概念,客戶端一個要求,辦事器端一個答復,這就是全部基于http和談的通信過程。

  因為web利用法度是基于http和談進行通信的,而我們已講過了http是無狀況的,這就增加了保護web利用法度狀況的難度, 對開辟者來講,是一個不小的挑戰(zhàn)。Cookies是作為http的一個擴大出世的,其首要用處是彌補http的無狀況特點,供給了一種保持客戶端與辦事器端之間狀況的路子,可是因為出于安然性的考慮,有的用戶在瀏覽器中是避免掉落cookie的。這類環(huán)境下,狀況信息只能經(jīng)由過程url中的參數(shù)來傳遞到辦事器端,不外這類編制的安然性很差。事實上,遵循凡是的設(shè)法,應當有客戶端來表白本身的身份,從而和辦事器之間保持一種狀況,可是出于安然性方面的考慮,我們都應當大白一點 – 來自客戶端的信息都是不克不及完全信賴的。

  雖然如許,針對保持web利用法度狀況的標題問題,相對來講,仍是有比較優(yōu)雅的解決方案的。不外,應當說是沒有完美的解決方案的,再好的解決方案也不成能合用所有的環(huán)境。這篇文章將介紹一些手藝。這些手藝可以用來比較不變地保持利用法度的狀況和抵抗一些針對session的報復打擊,好比會話劫持。并且你可以進修到cookie是如何工作的,php 的session做了那些工作,和如何才能劫持session。

  HTTP 概覽

  若何才能保持web利用法度的狀況和選擇最合適的解決方案呢?在答復這個標題問題之前,必需得先體味web的底層和談 – Hypertext Transfer Protocol (HTTP)。

  當用戶拜候http://example.com這個域名的時辰,瀏覽器就會主動和辦事器成立tcp/ip連接,然后發(fā)送http要求到example.com的辦事器的80端口。該個要求的語法以下所示:

  GET / HTTP/1.1

  Host: example.org

  以上第一行叫做要求行,第二個參數(shù)(一個反斜線在這個例子中)暗示所要求資本的路徑。反斜線代表了根目次;辦事器會轉(zhuǎn)換這個根目次為辦事器文件系統(tǒng)中的一個具體目次。

  Apache的用戶常常利用DocumentRoot這個號令來設(shè)置這個文檔根路徑。假定要求的url是http://example.org/path/to/script.php,那么要求的路徑就是/path/to/script.php。假定document root 被定義為usr/lcoal/apache/htdocs的話,全部要求的資本路徑就是/usr/local/apache/htdocs/path/to/script.php。

  第二行描述的是http頭部的語法。在這個例子中的頭部是Host, 它標識了瀏覽器??传@得資本的域名主機。還有良多其它的要求頭部可以包含在http要求中,好比user-Agent頭部,在php可以經(jīng)由過程$_SERVER['HTTP_USER_AGENT']獲得要求中所攜帶的這個頭部信息。

  可是遺憾的是,在這個要求例子中,沒有任何信息可以獨一標識當前這個發(fā)出要求的客戶端。有些開辟者借助要求中的ip頭部來獨一標識發(fā)出此次要求的客戶端,可是這類編制存在良多標題問題。因為,有些用戶是經(jīng)由過程代辦署理來拜候的,好比用戶A經(jīng)由過程代辦署理B連接網(wǎng)站www.example.com, 辦事器端獲得的ip信息是代辦署理B分派給A的ip地址,假定用戶這時候斷開代辦署理,然后再次連接代辦署理的話,它的代辦署理ip地址又再次改變,也就說一個用戶對應了多個ip地址,這類環(huán)境下,辦事器端按照ip地址來標識用戶的話,會覺得要求是來自不合的用戶,事實上是統(tǒng)一個用戶。 還用別的一種環(huán)境就是,好比良多用戶是在統(tǒng)一個局域網(wǎng)里經(jīng)由過程路由連接互聯(lián)網(wǎng),然后都拜候www.example.com的話,因為這些用戶共享統(tǒng)一個外網(wǎng)ip地址,這會導致辦事器覺得這些用戶是統(tǒng)一個用戶發(fā)出的要求,因為他們是來自統(tǒng)一個ip地址的拜候。

  保持利用法度狀況的第一步就是要知道若何來獨一地標識每個客戶端。因為只有在http中要求中攜帶的信息才能用來標識客戶端,所以在要求中必需包含某種可以用來標識客戶端獨一身份的信息。Cookie設(shè)計出來就是用來解決這一標題問題標。

  Cookies

  假定你把Cookies當作為http和談的一個擴大的話,理解起來就等閑的多了,其實本質(zhì)上cookies就是http的一個擴大。有兩個http頭部是專門負責設(shè)置和發(fā)送cookie的,它們別離是Set-Cookie和Cookie。當辦事器返回給客戶端一個http響應信息時,此中假定包含Set-Cookie這個頭部時,意思就是唆使客戶端成立一個cookie,并且在后續(xù)的http要求中主動發(fā)送這個cookie到辦事器端,直到這個cookie過時。假定cookie的保存時候是全部會話期間的話,那么瀏覽器會將cookie保留在內(nèi)存中,瀏覽器封鎖時就會主動斷根這個cookie。別的一種環(huán)境就是保留在客戶端的硬盤中,瀏覽器封鎖的話,該cookie也不會被斷根,下次打開瀏覽器拜候?qū)W(wǎng)站時,這個cookie就會主動再次發(fā)送到辦事器端。一個cookie的設(shè)置和發(fā)送過程分為以下四步:

  客戶端發(fā)送一個http要求到辦事器端

  辦事器端發(fā)送一個http響應到客戶端,此中包含Set-Cookie頭部

  客戶端發(fā)送一個http要求到辦事器端,此中包含Cookie頭部

  辦事器端發(fā)送一個http響應到客戶端

  這個通信過程也能夠用以下下示意圖來描述:

你必需體味的Session的本質(zhì)

  在客戶端的第二次要求中包含的Cookie頭部中,供給給了辦事器端可以用來獨一標識客戶端身份的信息。這時候,辦事器端也便可以鑒定客戶端是不是啟用了cookies。雖然,用戶可能在和利用法度交互的過程中突然禁用cookies的利用,可是,這個環(huán)境根基是不太可能產(chǎn)生的,所以可以不加以考慮,這在實踐中也被證實是對的。

  GET and POST Data

  除cookies,客戶端還可以將發(fā)送給辦事器的數(shù)據(jù)包含在要求的url中,好比要求的參數(shù)或要求的路徑中。 我們來看一個例子:

  GET /index.php?foo=bar HTTP/1.1

  Host: example.org

  以上就是一個常規(guī)的http get 要求,該get要求發(fā)送到example.org域名對應的web 辦事器下的index.php腳本, 在index.php腳本中,可以經(jīng)由過程$_GET['foo']來獲得對應的url中foo參數(shù)的值,也就是’bar’。大年夜大都php開辟者都稱如許的數(shù)據(jù)會GET數(shù)據(jù),也有少數(shù)稱它為查詢數(shù)據(jù)或url變量??墒谴竽暌辜倚枰耐稽c,不是說GET數(shù)據(jù)就只能包含在HTTP GET類型的要求中,在HTTP POST類型的要求中一樣可以包含GET數(shù)據(jù),只要將相干GET數(shù)據(jù)包含在要求的url中便可,也就是說GET數(shù)據(jù)的傳遞不依托與具體要求的類型。

  別的一種客戶端傳遞數(shù)據(jù)到辦事器端的別例是將數(shù)據(jù)包含在http要求的內(nèi)容區(qū)域內(nèi)。 這類編制需要要求的類型是POST的,看下面一個例子:

  POST /index.php HTTP/1.1

  Host: example.org

  Content-Type: application/x-www-form-urlencoded

  Content-Length: 7

  foo=bar

  在這類環(huán)境下,在腳本index.php可以經(jīng)由過程調(diào)用$_POST['foo']來獲得對應的值bar。開辟者稱這個數(shù)據(jù)為POST數(shù)據(jù),也就是大年夜家熟知的form以post編制提交要求的編制。

  在一個要求中,可以同時包含這兩種情勢的數(shù)據(jù):

  POST /index.php?myget=foo HTTP/1.1

  Host: example.orgContent-Type: application/x-www-form-urlencoded

  Content-Length: 11

  mypost=bar

  這兩種傳遞數(shù)據(jù)的編制,比起用cookies來傳遞數(shù)據(jù)更不變,因為cookie可能被禁用,可是以GET和POST編制傳遞數(shù)據(jù)時,不存在這類環(huán)境。我們可以將PHPSESSID包含在http要求的url中,就像下面的例子一樣:

  GET /index.php?PHPSESSID=12345 HTTP/1.1

  Host: example.org

  以這類編制傳遞session id的話,可以跟用cookie頭部傳遞session id一樣,達到一樣的結(jié)果, 可是,錯誤謬誤就是需要開辟者覺得地將session id附加在url中或作為隱躲字段加進到表單中。不像cookie一樣,只要辦事器端唆使客戶端成立cookie成功今后,客戶端在后續(xù)的要求中,會主動第將對應的沒有過時的cookie傳遞給辦事器端。當然,php在開啟session.use_trans_sid后,也能夠主動地將session id 附加在url中和表單的隱躲字段中,可是這個選項不建議開啟,因為存在安然標題問題。如許的話,等閑泄漏session id, 好比有的用戶會bookmark一個url或分享一個url,那么session id也就透露了,加進這個session id還沒有過時,那是有必然的安然標題問題存在的,除非辦事器端,除session id外,還附加了其它編制進行驗證用戶的合法性!

  雖然以POST的編制來傳遞session id的話,相對GET的編制來講,會安然的多??墒?,這類編制的錯誤謬誤就是比較麻煩,因為如許的話,在你的利用法度中比較將所有的要求都轉(zhuǎn)換成post的要求,這明顯是不太合適的。

  Session的治理

  直到此刻,我只會商了若何保護利用法度的狀況,只是簡單地觸及到了假定保持要求之間的關(guān)系。接下來,我闡述下在實際頂用到比較多的手藝 – Session的治理。觸及到session的治理,就不是單單地保持各個要求之間的狀況,還需要保持會話期間針對每個特定用戶利用到的數(shù)據(jù)。我們常常把這類數(shù)據(jù)叫做session數(shù)據(jù),因為這些數(shù)據(jù)是跟某個特定用戶與辦事器之間的會話相聯(lián)系關(guān)系的。假定你利用php內(nèi)置的session的治理機制,那么session數(shù)據(jù)通常為保留在/tmp這個辦事器端的文件夾中,并且此中的session數(shù)據(jù)會被主動地保留到超等數(shù)組$_SESSION中。一個最簡單的利用session的例子,就是將相干的session數(shù)據(jù)從一個頁面?zhèn)鬟f(寄望:實際傳遞的是session id)到另外一個頁面。下面用示例代碼1, start.php, 對這個例子加以演示:

  

  session_start();

  $_SESSION['foo'] = 'bar';

  ?>  session_start();

  $_SESSION['foo'] = 'bar';

  >  session_start();

  $_SESSION['foo'] = 'bar';

  >

  continue.php

  假定用戶點擊start.php中的鏈接拜候continue.php,那么在continue.php中便可以經(jīng)由過程$_SESSION['foo']獲得在start.php中的定義的值’bar’??聪旅娴氖纠a2:

  示例代碼2 – continue.php

  

  session_start();

  echo $_SESSION['foo']; /* bar */

  ?>  session_start();

  echo $_SESSION['foo']; /* bar */

  >  session_start();

  echo $_SESSION['foo']; /* bar */

  >

  是不是是很是簡單,可是我要指出的話,假定你真的如許來寫代碼的話,申明你對php底層的對session的實現(xiàn)機制還不是很是體味透辟。在不體味php內(nèi)部給你主動做了多少工作的環(huán)境下,你會發(fā)現(xiàn)假定法度犯錯的話,如許的代碼將變的很難調(diào)試,事實上,如許的代碼也完全沒有安然性可言。

  Session的安然性標題問題

  一向以來良多開辟者都覺得php內(nèi)置的session治理機制是具有必然的安然性,可以對一般的session報復打擊起到防御。事實上,這是一種曲解,php團隊只實現(xiàn)了一種便利有效的機制。具體的安然辦法,應當有益用法度的開辟團隊來實施。 就像開篇談到的,沒有最好的解決方案,只有最合適你的方案。

  此刻,我們來看下一個比較常規(guī)的針對session的報復打擊:

  用戶拜候http://www.example.org,并且登錄。

  example.org的辦事器設(shè)置唆使客戶端設(shè)置相干cookie – PHPSESSID=12345

  報復打擊者這時候拜候http://www.example.org/,并且在要求中攜帶了對應的cookie – PHPSESSID=12345

  如許環(huán)境下,因為example.orge的辦事器經(jīng)由過程PHPSESSID來辨認對應的用戶的,所以辦事器錯把報復打擊者當作了合法的用戶。

  全部過程的描述,請看下面的示例圖:

你必需體味的Session的本質(zhì)

  當然這類報復打擊的編制,前提前提是報復打擊者必需經(jīng)由過程某種手段固定,劫持或猜想出某個合法用戶的PHPSESSID。當然這看起來難度很高,可是也不是不成能的工作。

  安然性的加強

  有良多手藝可以用來加強Session的安然性,首要思惟就是要使驗證的過程對合法用戶來講,越簡單越好,然后對報復打擊者來講,步調(diào)要越復雜越好。當然,這仿佛是比較難于均衡的,要按照你利用法度的具體設(shè)計來做決定計劃。

  最簡單的居于HTTP/1.1要求包含要求行和一些Host的頭部:

  GET / HTTP/1.1

  Host: example.org

  假定客戶端經(jīng)由過程PHPSESSID傳遞相干的session標識符,可以將PHPSESSID放在cookie頭部中進行傳遞:

  GET / HTTP/1.1

  Host: example.org

  Cookie: PHPSESSID=12345

  一樣地,客戶端也能夠?qū)ession標識符放在要求的url中進行傳遞。

  GET /?PHPSESSID=12345

  HTTP/1.1Host: example.org

  當然,session標識符也能夠包含在POST數(shù)據(jù)中,可是這對用戶體驗有影響,所以這類編制很少采取。

  因為來自TCP/IP信息也不必然可以完全信賴的,所以,對web開辟者來講,操縱TCP/IP中的信息來加強安然性也是不太合適的。 不外,報復打擊者也必需供給一個合法用戶的獨一的標識符,才能假扮成合法用戶進進系統(tǒng)。是以,看起來獨一可以或許有效的呵護系統(tǒng)的辦法,就是盡可能地隱躲session標識符或使之難于猜想出來。最好就是二者都能實施。

  PHP會主動生成一個隨機的session ID,基本來說是不成能被猜想出來的,所以這方面的安然仍是有必然保障的??墒?,要避免報復打擊者獲得一個合法的session ID是相當堅苦的,這根基上不是開辟者所能節(jié)制的。

  事實上,良多環(huán)境下都有可能導致session ID的泄漏。 好比說,假定經(jīng)由過程GET數(shù)據(jù)來傳遞session ID的話,就有可能透露這個敏感的身份信息。因為,有的用戶可能會將帶有session ID的鏈接緩存,收躲或發(fā)送在郵件內(nèi)容中。Cookies是一種像相對來講安然一點的機制,可是用戶是可以在客戶端中避免掉落cookies的!在一些IE的版本中也有比較嚴重的安然縫隙,比較馳名的就是會泄漏cookies給一些有安然隱患的***站點。

  是以,作為一個開辟者,可以必定session ID是不克不及被猜想出來的,可是仍是有可能被報復打擊者利用某些編制獲得到。所以,必需采納一些額外的安然辦法來避免此類環(huán)境在你的利用法度中產(chǎn)生。

  實際上,一個尺度的HTTP要求中除Host等必需包含的頭部,還包含了一些可選的頭部.舉一個例子,看下面的一個要求:

  GET / HTTP/1.1

  Host: example.org

  Cookie: PHPSESSID=12345

  User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1

  Accept: text/html;q=0.9, */*;q=0.1

  Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66

  Accept-Language: en

  我們可以看到,在以上的一個要求例子中包含了四個額外的頭部,別離是User-Agent, Accept, Accept-Charset和Accept-Language。因為這些頭部不是必需的,所以完全依托他們在你的利用法度中闡揚感化是不太明智的??墒?,假定一個用戶的瀏覽器確切發(fā)送了這些頭部到辦事器,那么可以必定的是在接下來的統(tǒng)一個用戶經(jīng)由過程統(tǒng)一個瀏覽器發(fā)送的要求中,必定也會攜帶這些頭部。當然,這此中也會有極少數(shù)的特別環(huán)境產(chǎn)生。假定以上例子是由一個當前的跟辦事器成立了會話的用戶發(fā)出的要求,考慮下面的一個要求:

  GET / HTTP/1.1

  Host: example.org

  Cookie: PHPSESSID=12345

  User-Agent: Mozilla/5.0

  因為有不異的session id包含在要求的Cookie頭部中,所以不異的php session將會被拜候到??墒牵罄锏腢ser-Agent頭部跟先前的要求中的信息是不合的,系統(tǒng)是不是可以假定這兩個要求是統(tǒng)一個用戶發(fā)出的?

  像這類環(huán)境下,發(fā)現(xiàn)瀏覽器的頭部改變了,可是不克不及必定這是不是是一次來自報復打擊者的要求的話,比較好的辦法就是彈出一個要求輸進暗碼的輸進框讓用戶輸進,如許的話,對用戶體驗的影響不會很大年夜,又能很有效地避免報復打擊。

  當然,你可以在系統(tǒng)中加進查對User-Agent頭部的代碼,近似示例3中的代碼:

  示例代碼3

  

  session_start();

  if (md5($_SERVER['HTTP_USER_AGENT']) != $_SESSION['HTTP_USER_AGENT'])

  { /* 彈出暗碼輸進框 */ exit;

  }

  ?>  session_start();

  if (md5($_SERVER['HTTP_USER_AGENT']) != $_SESSION['HTTP_USER_AGENT'])

  { /* 彈出暗碼輸進框 */ exit;

  }

  >  session_start();

  if (md5($_SERVER['HTTP_USER_AGENT']) != $_SESSION['HTTP_USER_AGENT'])

  { /* 彈出暗碼輸進框 */ exit;

  }

  >

  當然,你先必需在第一次要求時,初始化session的時辰,用MD5算法加密user agent信息并且保留在session中,近似下面示例4中的代碼:

  示例代碼4

  

  session_start();

  $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);

  ?>  session_start();

  $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);

  >  session_start();

  $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);

  >

  當然不必然需要用MD5來加密這個User-Agent信息,但利用這類編制今后就不需要再過濾這個$_SERVER['HTTP_USER_AGENT']數(shù)據(jù)了。不然的話,在利用這個數(shù)據(jù)之前必需要進行數(shù)據(jù)過濾,因為任何來自客戶端的數(shù)據(jù)都是不成信賴的,必需要寄望這一點。

  在你查抄這個User-Agent客戶端頭部信息今后,做為一個報復打擊者必需要完成兩步才能劫持一個session:

  獲得一個合法的session id

  包含一個不異的User-Agent頭部在捏造的要求中

  你可能會說,竟然報復打擊者能獲得有效的session id,那么以他的程度,捏造一個不異的User-Agent不是件難事。不錯,可是我們可以說這起碼給他添加了一些麻煩,在必然程度上也增加了session機制的安然性。

  你應當也能想到了,既然我們可以查抄User-Agent這個頭部來加強安然性,那么無妨再操縱其它的一些頭部信息,把他們組合起來生成一個加密的token,并且讓客戶端在后續(xù)的要求中攜帶這個token!如許的話,報復打擊者根基上不成能猜想出如許一個token是如何生成出來的。這好比你用諾言卡在超市付款,一個你必需有諾言卡(好比session id),別的你也必需輸進一個付出暗碼(好比token),這有這二者都合適的環(huán)境下,你才能成功進進賬號付款。 看下面一段代碼:

  

  session_start();

  $token = 'SHIFLETT' . $_SERVER['HTTP_USER_AGENT'];

  $_SESSION['token'] = md5($token . session_id());

  ?>  session_start();

  $token = 'SHIFLETT' . $_SERVER['HTTP_USER_AGENT'];

  $_SESSION['token'] = md5($token . session_id());

  >  session_start();

  $token = 'SHIFLETT' . $_SERVER['HTTP_USER_AGENT'];

  $_SESSION['token'] = md5($token . session_id());

  >

  寄望:Accept這個頭部不該該被用來生成token,因為有些瀏覽器會主動改變這個頭部,當用戶刷新瀏覽器的時辰。

  在你的驗證機制中加進了這個很是難于猜想出來的token今后,安然性會獲得很大年夜的晉升。假定這個token經(jīng)由過程像session id一樣的編制來進行傳遞,這類環(huán)境下,一個報復打擊者必需完成需要的3步來劫持用戶的session:

  獲得一個合法的session ID

  在要求中加進不異的User-Agent頭部,用與生成token

  在要求中攜帶被報復打擊者的token

  這里面有個標題問題。假定session id和token都是經(jīng)由過程GET數(shù)據(jù)來傳遞的話,那么對能獲得session ID的報復打擊者,一樣就可以夠獲得到這個token。所以,比較安然靠譜的編制應當是操縱兩種不合的數(shù)據(jù)傳遞編制來額別傳遞session id和token。例如,經(jīng)由過程cookie來傳遞session id,然后經(jīng)由過程GET數(shù)據(jù)來傳遞token。是以,假定報復打擊者經(jīng)由過程某種手段獲得了這個獨一的用戶身份標識,也是不太可能同時輕松地獲得到這個token,它相對來講仍然是安然的。

  還有良多的手藝手段可以用來加強你的session機制的安然性。??茨阍诖竽暌怪麦w味session的內(nèi)部本質(zhì)今后,可以設(shè)計出合適你的利用系統(tǒng)的驗證機制,從而大年夜大年夜的進步系統(tǒng)的安然性。事實,你是最熟諳當下你開辟的系統(tǒng)的開辟者之一,可以按照實際環(huán)境來實施一些獨有的,額外的安然辦法。

  總結(jié)

  以上只是大年夜概地描述了session的工作機制,和簡單地闡述了一些安然辦法。但要記住,以上的編制都是可以或許加強安然性,不是說可以或許完全呵護你的系統(tǒng),??醋x者本身再往調(diào)研相干內(nèi)容。在這個調(diào)研過程中,相信你會學到很有實際利用價值的方案。

------分隔線----------------------------

推薦內(nèi)容