對于一些常見的輸出目標(包括客戶端、數據庫教程和URL)的轉義,PHP 中有內置函數可用.
如果你要寫一個自己算法,做到萬無一失很重要,需要找到在外系統中特殊字符的可靠和完整的列表,以及它們的表示方式,這樣數據是被保留下來而不是轉譯了.
最常見的輸出目標是客戶機,使用htmlentities( )在數據發出前進行轉義是最好的方法,與其它字符串函數一樣,它輸入是一個字符串,對其進行加工后進行輸出,但是使用htmlentities( )函數的最佳方式是指定它的兩個可選參數:引號的轉義方式(第二參數)及字符集(第三參數),引號的轉義方式應該指定為ENT_QUOTES,它的目的是同時轉義單引號和雙引號,這樣做是最徹底的,字符集參數必須與該頁面所使用的字符集相必配.
為了區分數據是否已轉義,我還是建議定義一個命名機制,對于輸出到客戶機的轉義數據,我使用$html 數組進行存儲,該數據首先初始化成一個空數組,對所有已過濾和已轉義數據進行保存,實例代碼如下:
- <?php
- $html = array( );
- $html['username'] = htmlentities($clean['username'], ENT_QUOTES, 'UTF-8');//開源代碼Vevb.com
- echo "<p>Welcome back, {$html['username']}.</p>";
- ?>
小提示:htmlspecialchars( )函數與htmlentities( )函數基本相同,它們的參數定義完全相同,只不過是htmlentities( )的轉義更為徹底,通過$html['username']把username 輸出到客戶端,你就可以確保其中的特殊字符不會被瀏覽器所錯誤解釋,如果username 只包含字母和數字的話,實際上轉義是沒有必要的,但是這體現了深度防范的原則,轉義任何的輸出是一個非常好的習慣,它可以戲劇性地提高你的軟件的安全性.
另外一個常見的輸出目標是數據庫,如果可能的話,你需要對SQL 語句中的數據使用PHP內建函數進行轉義,對于MySQL 用戶,最好的轉義函數是mysql_real_escape_string(),如果你使用的數據庫沒有PHP 內建轉義函數可用的話,addslashes( )是最后的選擇.
下面的例子說明了對于MySQL 數據庫的正確的轉義技巧:
- <?php
- $mysql = array( );
- $mysql['username'] = mysql_real_escape_string($clean['username']);
- $sql = "SELECT *
- FROM profile
- WHERE username = '{$mysql['username']}'";
- $result = mysql_query($sql);
- ?>
新聞熱點
疑難解答