PHP字串轉義

2021-09-30 11:49:39 字數 3943 閱讀 2689

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)、( \n)、( \r )、(\)、( ')、 (")、( \x1a)

addcslashes()‍以c 語言風格使用反斜線轉義字串中的字元,這個函式很少人去用,但是應該注意的是:當選擇對字元 0,a,b,f,n,r,t 和 v 進行轉義時,它們將被轉換成 \0,\a,\b,\f,\n,\r,\t 和 \v。在 php 中,只有 \0(null),\r(回車符),\n(換行符)和 \t(製表符)是預定義的轉義序列, 而在 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() < '5.3.0')

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

通過addslashes對gpc進行時候轉義時,應注意當使用者提交陣列資料時對鍵值和值的過濾

複製**

**如下:

if(!get_magic_quotes_gpc())

function daddslashes($string, $force = 1)

} else

return $string; }

‍>> 利用在使用者輸入或輸出時候轉義html實體以防止xss漏洞的產生!

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

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

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

\n 換行(lf 或 ascii 字元 0x0a(10)) 

\r 回車(cr 或 ascii 字元 0x0d(13)) 

\t 水平製表符(ht 或 ascii 字元 0x09(9)) 

\\ 反斜線 

\$ 美元符號 

\" 雙引號 

\[0-7]               此正規表示式序列匹配乙個用八進位制符號表示的字元  

\x[0-9a-fa-f]  此正規表示式序列匹配乙個用十六進製制符號表示的字元  

舉幾個例子:

乙個包含\0特殊字元的例子:

$str = "ffff\0ffff";

echo(strlen($str));

echo("\n");

for($i=0;$iecho("\n");

輸出結果:

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

9 102     102     102     102     0       102     102     102     102

替換特殊字元的例子

$str = "ffff\0ffff";

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

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

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

echo(strlen($str));

echo("\n");

for($i=0;$iecho("\n");

輸出結果:

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

8 102     102     102     102     102     102     102     102

八進位制ascii碼例子:

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

$str = "\0\01\02\3\7\10\011\08\8";  //這裡的\8不符合要求,被修正為"\\8" (ascii為92和56)

echo(strlen($str));

echo("\n");

for($i=0;$iecho("\n");

輸出結果:

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

11 0       1       2       3       7       8       9       0       56      92      56

十六進製制ascii碼例子:

$str = "\x0\x1\x2\x3\x7\x8\x9\x10\x11\xff";

echo(strlen($str));

echo("\n");

for($i=0;$iecho("\n");

輸出結果:

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

10 0       1       2       3       7       8       9       16      17      255

php 字串轉義

單引號 想表達單引號自身,需要用反斜線 轉義 想表達反斜線 自身,需要用雙反斜線 其他任何轉義序列 r n等,都會當作字串處理 輸出 a bcd echo a bcd 輸出 a bcd echo a bcd 輸出 a bcd echo a bcd 輸出 a nbcd echo a nbcd 雙引號 ...

php字串。轉義字元

輸出時是雙引號時,變數會被解析。單引號包裹的 不識別變數名。在雙引號裡 變數名後緊跟乙個非空字元,會變數識別失敗。name 張三 echo 名字是 name 輸出 名字是 張三 echo 名字是 name 輸出 名字是 name echo 名字是 name 北京 輸出 名字是 name背景 其實是找...

注意php的轉義字串

今天碰到乙個處理檔案特殊字元的事情,再次注意到這個問題,在php中 以單引號為定界符的php字串,支援兩個轉義 和 以雙引號為定界符的php字串,支援下列轉義 n 換行 lf 或 ascii 字元 0x0a 10 r 回車 cr 或 ascii 字元 0x0d 13 t 水平製表符 ht 或 asc...