1,addslashes
php 指令
magic_quotes_gpc
為 on
,它主要是對所有的 get、post 和 cookie 資料自動執行
addslashes()
。不要對已經被
magic_quotes_gpc
轉義過的
字串使用
addslashes()
,因為這樣會導致雙層轉義。
遇到這種情況時可以使用
函式get_magic_quotes_gpc
() 進行檢測,當接收到的資料需要插入資料庫時,
如果magic_quotes_gpc沒有開啟,需要手動加addslashes函式,(開啟的話,一般不需要在處理,因為會自動加addslashes)
因為如果有單引號或雙引號,addslashes會自動在前面在加乙個轉義符號(反斜槓),
這樣資料庫不會報錯,插入到資料庫,加入的這個轉義符號是不會插入到資料庫的。
2,stripslashes
反引用乙個引用字串。
note:乙個使用範例是使用 php 檢測 magic_quotes_gpc 配置項的 開啟情況(在 php 5.4之 前預設是開啟的如果 magic_quotes_sybase 項開啟,反斜線將被去除,但是兩個反斜線將會被替換成乙個。
)並且你不需要將資料插入到乙個需要轉義的位置(例如資料庫)。例如,你只是簡單地將表單資料直接輸出。
因為你只是輸出,不儲存到資料庫,這樣當magic_quotes_gpc開啟,會執行addslashes多出乙個轉義符號,
所以在顯示的時候,會多出乙個轉義符號(上面說了,存入資料庫,需要這個轉義符號的,防止資料庫出錯),
因此需要將系統多加的乙個給去掉,就用此函式。
下面是關於這兩個函式的小例子:(magic_quotes_gpc
開啟)$a = '["\u82cf\u5434","abck","\u4e91\u7aef"]';
$a = addslashes($a);
if(get_magic_quotes_gpc())
$a = json_decode($a);
var_dump($a);
下面手動加的:(magic_quotes_gpc
開啟)$a =[\"\\u82
cf\\u5434\",\"abck\",\"\\u4e91\\u7aef\"]
//$a = addslashes($a);
if(get_magic_quotes_gpc())
$a = json_decode($a);
var_dump($a);
第乙個是呼叫函式加的,第二個是手動加的 第乙個可以正確解出,第二個卻不行(乙個反斜槓都沒有了),
自己分析可能是:通過addslashes加的 \ 應該是不被php當成轉義符號,
如果自己加的php會當成轉義符號來處理,[\"\\u82cf\\u5434\",\"abck\",\"\\u4e91\\u7aef\"]
這樣自己加的在用stripslashes是不行的(php把第乙個當成轉義符號,其實也就乙個\了);
但出現乙個問題,是我遇到的,我這邊post接收乙個json_encode中文的資料,unicode編碼了,格式如上\u***\u***x這種,magic_quotes_gpc
開啟的,系統會自動加addslashes,接收到的資料應該變成類似(\\u***x\\u***x),但我用stripslashes去除,卻把現在反斜槓都去掉了,變成了(u***xu***x),導致json_decode不出來, 不經過striptslashes就ok了,這點想不通,難到striptslashes會去掉兩個? 不對啊,為什麼呢? 難到對於接收到的資料,伺服器自動加的也會被當成轉義符號?不明白,希望有明白的高人,給指點下!
3,mysql_real_escape_string
mysql_real_escape_string — 轉義 sql 語句中使用的字串中的特殊字元,並考慮到連線的當前字符集
string
mysql_real_escape_string
( string$unescaped_string
[,
resource$link_identifier
] )
本函式將unescaped_string
中的特殊字元轉義,並計及連線的當前字符集,因此可以安全用於 mysql_query()
。
note:mysql_real_escape_string()並不轉義 % 和 _。example #1 mysql_real_escape_string()例子
<?php
$item
= "zak's and derick's laptop"
;$escaped_item
= mysql_real_escape_string
($item
);printf
("escaped string: %s\n"
, $escaped_item
);?>
以上例子將產生如下輸出:
escaped string: zak\'s and derick\'s laptop
上面是我直接複製官網手冊了,沒有細用過,不太了解,應該和addslashes一樣的功能。
4,htmlspecialchars
htmlspecialchars() 函式把一些預定義的字元轉換為 html 實體
預定義的字元是:
第二個引數是:
ent_compat - 預設。僅編碼雙引號。
ent_quotes - 編碼雙引號和單引號。
ent_noquotes - 不編碼任何引號。
轉變成實體,實體就是& "等,這樣的形式,瀏覽器是解析顯示出來,並不會執行它,
像這樣的是html語言,瀏覽器會執行它,所以才會看到a連線,p樣式的效果,但實體,是沒有只用於顯示的,
顯示的時候,防止有人在html帶js 如果有人提交alert(1)<\script>,只會顯示,不會執行。
5,urldecode
注:發現了點意外,有的伺服器並不對urlencode後的編碼自動解碼,而文中提到「對於編碼後的字串傳送到伺服器端,php總是會自動進行解碼」,猜測至少是5.3以上版本才會這樣。但這不影響urldecode是乙個危險的函式,目前發現多例因此函式而出錯的sql注入繞過.
以上是自己的經驗和理解,在加上網上的一些資料。 可能有誤區,希望指出!
php的建構函式理解
建構函式 是一種特殊的方法。主要用來在建立物件時初始化物件,即為物件成員變數 賦初始值,總與new運算子 一起使用在建立物件的語句中。特別的乙個類可以有多個建構函式 可根據其引數個數的不同或引數型別的不同來區分它們 即建構函式的過載 經常可以看到這樣 function construct param...
php字串函式理解
1.輸出函式 echo print print printer sprint echo print 都是輸出字串 或者變數 但是 echo 沒有返回值 print 有返回值 printer 可以將陣列進行遍歷輸出 如果用echo 只會輸出array print sprint 格式化並輸出乙個字串 例...
SetBkMode函式理解
輸出的字串時,發現存在背景色,這樣的輸出是破壞背景的。那需要使用什麼方法來保持背景不變,而又能輸出紅色的字串呢?比如按鈕的文字顏色是黑色的,而背景是灰色的。這就需要使用setbkmode函式來設定drawtext函式的輸出方式,顯示裝置共有兩種輸出方式 opaque和transparent。opaq...