首頁  >  文章  >  後端開發  >  PHP安全-輸出轉義

PHP安全-輸出轉義

黄舟
黄舟原創
2017-02-22 09:32:331418瀏覽



# 輸出轉義

       另外一個Web應用安全的基礎是對輸出進行轉義或對特殊字元進行編碼,以確保原意不變。例如,O'Reilly在傳送給MySQL資料庫前需要轉義成O\'Reilly。單引號前的反斜線代表單引號是資料本身的一部分,而不是不是它的本義。

       我所指的輸出轉義具體分為三個步驟:

l        辨識輸出

#l        辨識輸出

#l        輸出轉義

l        區分已轉義與未轉義數據

 

      只對已過濾資料進行轉義是很有必要的。儘管轉義能防止許多常見安全漏洞,但它不能取代輸入過濾。被污染資料必須先過濾然後轉義。

      在對輸出進行轉義時,你必須先識別輸出。通常,這要比識別輸入簡單得多,因為它依賴於你所進行的動作。例如,當識別到客戶端的輸出時,你可以在程式碼中尋找下列語句:


echo
print
printf
<?=

## 

       作為一個應用的開發者,你必須知道每一個輸出到外部系統的地方。它們構成了輸出。

       象過濾一樣,轉義過程在依情形的不同而不同。過濾對於不同類型的資料處理方法也是不同的,轉義也是根據你傳遞訊息到不同的系統而採用不同的方法。

       對於一些常見的輸出目標(包括客戶端、資料庫和URL)的轉義,PHP中有內建函數可用。如果你要寫一個自己演算法,做到萬無一失很重要。需要找到在外系統中特殊字符的可靠和完整的列表,以及它們的表示方式,這樣數據是被保留下來而不是轉譯了。

       最常見的輸出目標是客戶機,使用htmlentities( )在資料發出前進行轉義是最好的方法。與其它字串函數一樣,它輸入是一個字串,對其進行加工後進行輸出。但是使用htmlentities( )函數的最佳方式是指定它的兩個可選參數:引號的轉義方式(第二參數)及字元集(第三參數)。引號的轉義方式應該指定為ENT_QUOTES,它的目的是同時轉義單引號和雙引號,這樣做是最徹底的,字符集參數必須與該頁面所使用的字符集相必配。

      為了區分資料是否已轉義,我還是建議定義一個命名機制。對於輸出到客戶機的轉義數據,我使用$html數組進行存儲,該數據首先初始化成一個空數組,對所有已過濾和已轉義數據進行保存。

CODE:

 

#

<?php
 
  $html = array(  );
  $html[&#39;username&#39;] =
htmlentities($clean[&#39;username&#39;], ENT_QUOTES, &#39;UTF-8&#39;);
  echo "<p>Welcome back,
{$html[&#39;username&#39;]}.</p>";
 
  ?>

## 

小提示

       htmlspecialchars( )函數與htmlentities( )函數基本上相同,它們的參數定義完全相同,只不過是htmlentities( )的轉義更為徹底。

       透過$html['username']把username輸出到客戶端,你就可以確保其中的特殊字元不會被瀏覽器錯誤解釋。如果username只包含字母和數字的話,實際上轉義是沒有必要的,但這體現了深度防範的原則。轉義任何的輸出都是一個非常好的習慣,它可以戲劇性地提高你的軟體的安全性。 ############       另一個常見的輸出目標是資料庫。如果可能的話,你需要對SQL語句中的資料使用PHP內建函數來轉義。對於MySQL用戶,最好的轉義函數是mysql_real_escape_string( )。如果你使用的資料庫沒有PHP內建轉義函數可用的話,addslashes( )是最後的選擇。 ############       下面的範例說明了對於MySQL資料庫的正確的轉義技巧:############CODE:########## ### ######
<?php
 
  $mysql = array(  );
  $mysql[&#39;username&#39;] =
mysql_real_escape_string($clean[&#39;username&#39;]);
  $sql = "SELECT *
          FROM   profile
          WHERE  username =
&#39;{$mysql[&#39;username&#39;]}&#39;";
  $result = mysql_query($sql);
 
  ?>

以上就是PHP安全-输出转义的内容,更多相关内容请关注PHP中文网(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn