當前位置:
首頁 > 知識 > PHP字元轉義相關函數小結

PHP字元轉義相關函數小結

與PHP字元串轉義相關的配置和函數如下:

1.magic_quotes_runtime

2.magic_quotes_gpc

3.addslashes()和stripslashes()

4.mysql_escape_string()

5.addcslashes()和stripcslashes()

6.htmlentities() 和html_entity_decode()

7.htmlspecialchars()和htmlspecialchars_decode()

當magic_quotes_runtime打開時,php的大部分函數自動的給從外部引入的(包括資料庫或者文件)數據中的溢出字元加上反斜線。

可以使用set_magic_quotes_runtime()與get_magic_quotes_runtime()?設置和檢測其狀態。

注意:PHP5.3.0以上的版本已將這兩個函數廢棄,也就說在PHP5.3.0或以上版本時該選項已經為關閉了。

?

magic_quotes_gpc設置是否自動為GPC(GET,POST,COOKIE)傳來的數據中的某些字元進行轉義,

可以使用get_magic_quotes_gpc()檢測其設置。

如果沒有打開這項設置,可以使用addslashes()函數添加給字元串進行轉義

addslashes()? 在指定的預定義字元前添加反斜杠。

預定義字元包括單引號(")、雙引號(")、反斜線()與 NUL(NULL 字元)。

以上是W3SCHOOL.COM.CN給出的解釋俺一直覺的不是很準確

因為在magic_quotes_sybase=on時它將單引號(")轉換成雙引號(") 在magic_quotes_sybase=off時才將單引號(")轉換成(")

stripslashes()函數的功能與addslashes()?正好相反,它的功能是去除轉義的效果。

mysql_escape_string() 轉義 SQL語句中使用的字元串中的特殊字元。?

這裡的特殊包括(x00)、(
)、(
)、()、( ")、 (")、( x1a)

addcslashes()?以C 語言風格使用反斜線轉義字元串中的字元,這個函數很少人去用,但是應該注意的是:當選擇對字元 0,a,b,f,n,r,t 和 v 進行轉義時,它們將被轉換成 ,a,,f,

, 和 v。在 PHP 中,只有 (NULL),
(回車符),
(換行符)和 (製表符)是預定義的轉義序列, 而在 C 語言中,上述的所有轉換後的字元都是預定義的轉義序列。同理stripcslashes()的功能就是去除其轉義。

htmlentities() 把字元轉換為 HTML 實體。(什麼是HTML實體?自己GOOGLE吧~~)

具體參數請見這裡,其逆反的函數html_entity_decode() -?把 HTML 實體轉換為字元。

htmlspecialchars()函數把一些預定義的字元轉換為 HTML 實體。

這些預定義的字元是:

& (和號) 成為 &

" (雙引號) 成為 "

" (單引號) 成為 "

> (大於) 成為 >

?詳細參數請見這裡,其逆反函數是htmlspecialchars_decode() 把一些預定義的 HTML 實體轉換為字元。

一點自己的體會:

>>多次的單引號轉義可能引起資料庫的安全問題

>> 不建議使用mysql_escape_string 來進行轉義,建議在獲取用戶輸入時候進行轉義

>> 由於set_magic_quotes_runtime()?在PHP5.3.0和以後版本已被廢棄了, 所以之前的版本建議統一配置關閉:

if(phpversion()

set_magic_quotes_runtime(0);

}

?>> 無法通過函數來定義magic_quotes_gpc,因此建議在伺服器上統一開啟,寫程序的時候應該在來判斷下,避免沒開啟GPC引起安全問題

通過addslashes對GPC進行時候轉義時,應注意當用戶提交數組數據時對鍵值和值的過濾

if(!get_magic_quotes_gpc()) {

$_GET = daddslashes($_GET);

$_POST = daddslashes($_POST);

$_COOKIE = daddslashes($_COOKIE);

$_FILES = daddslashes($_FILES);

}

function daddslashes($string, $force = 1) {

if(is_array($string)) {

foreach($string as $key => $val) {

unset($string[$key]);

$string[addslashes($key)] = daddslashes($val, $force);

}

} else {

$string = addslashes($string);

}

return $string;

}

?>> 利用在用戶輸入或輸出時候轉義HTML實體以防止XSS漏洞的產生!

今天碰到一個處理文件特殊字元的事情,再次注意到這個問題,在php中:

* 以單引號為定界符的php字元串,支持兩個轉義"和\

* 以雙引號為定界符的php字元串,支持下列轉義:


換行(LF 或 ASCII 字元 0x0A(10))


回車(CR 或 ASCII 字元 0x0D(13))

水平製表符(HT 或 ASCII 字元 0x09(9))

\ 反斜線

$ 美元符號

" 雙引號

[0-7] 此正則表達式序列匹配一個用八進位符號表示的字元

x[0-9A-Fa-f] 此正則表達式序列匹配一個用十六進位符號表示的字元

舉幾個例子:

一個包含特殊字元的例子:

$str = "ffffffff";

echo(strlen($str));

echo("
");

for($i=0;$i

echo("
");

輸出結果:

----------------------

9

102 102 102 102 0 102 102 102 102

替換特殊字元的例子

$str = "ffffffff";

$str = str_replace("x0", "", $str);

//或者用$str = str_replace("", "", $str);

//或者用$str = str_replace(chr(0), "", $str);

echo(strlen($str));

echo("
");

for($i=0;$i

echo("
");

輸出結果:

----------------------

8

102 102 102 102 102 102 102 102

八進位ascii碼例子:

//注意,符合正則[0-7]的字元串,表示一個八進位的ascii碼。

$str = "1237101188"; //這裡的8不符合要求,被修正為"\8" (ascii為92和56)

echo(strlen($str));

echo("
");

for($i=0;$i

echo("
");

輸出結果:

----------------------

11

0 1 2 3 7 8 9 0 56 92 56

十六進位ascii碼例子:

$str = "x0x1x2x3x7x8x9x10x11xff";

echo(strlen($str));

echo("
");

for($i=0;$i

echo("
");

輸出結果:

----------------------

10

0 1 2 3 7 8 9 16 17 255

更多分享,敬請關注

本文來源網路,侵立刪!


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 PHP技術大全 的精彩文章:

《PHP技術大全·第一卷》foreach細緻解讀

TAG:PHP技術大全 |