當使用thinkphp框架接受表達內容。
如果使用i函式獲取表單資料,如i("data");這個資料是預設被過濾的。
預設的過濾方法
'default_filter' => 'htmlspecialchars', // 預設引數過濾方法 用於i函式...
如果對輸入的引數進行正則匹配,當遇到特殊字元時會出問題。
htmlspecialchars的反函式為htmlspecialchars_decode()。使用該函式可以把轉義的引數再轉回來。
但這並沒有解決全部問題,因為不同版本的thinkphp的i函式是不一樣的,而且default_filter還可以設定別的值。
所以當我們確實需要獲取原始資料而非轉義資料時,還是使用最原始的 $_post("param");最靠譜。
但是這事還是沒完。因為php裡還有addslashes()函式他會過濾提交給php的引數。也就是用原始的$_post依然要面對過濾的問題。
我可以通過
get_magic_quotes_gpc()來判斷是否開啟了該過濾,並用stripslashes()反過濾。
不幸的是,不同版本裡的php對該函式的支援依然不同,php6裡該函式被取消了。
綜上,你不得不再每個專案裡去測試框架和php引數的過濾,以使專案按照您的意願執行。
另外如果您的php框架使用的是gbk的編碼的話,那麼還會出現字符集轉換的問題,但這並不代表使用utf-8字符集時不會有問題。
總之對於輸入引數的過濾轉義,和字符集的轉化都是非常麻煩而且特例特測的事情。
測試技巧。
不要僅直接用輸入和輸出的方式來測試,因為這個過程可能經歷了多個過濾。
使用在php檔案中定義變數然後輸出,測試輸出沒有問題,再測試$_post,再測試i函式。
如果要確保輸入的資料安全還是自己用正則表達是來過濾一般,這是最靠譜的啦。
其次i(函式)的安全性還是有的,一般情況盡量使用i(函式)
特別情況,盡量使用$_post來處理,一方面是效率更高而且**中區別對待可讀性好,還有就是不必關心default_filter引數的設定。
在php5中去反addslashes()的函式
//去掉在引號前面自動加的:單引號('),雙引號("),反斜槓(\),和null
function deal_quote($str)
}
i(函式)過濾器 htmlspecialchars() & (和號)" (雙引號) ' (單引號) < (小於) > (大於)
php中過濾器 addslashes() 單引號('),雙引號("),反斜槓(\),和null
參考內容
htmlspecialchars_decode()
htmlspecialchars_decode() 函式把一些預定義的 html 實體轉換為字元。
會被解碼的 html 實體是:
htmlspecialchars_decode() 函式是 htmlspecialchars() 函式的反函式。
htmlspecialchars_decode(
string,flags)
引數描述
string
必需。規定要解碼的字串。
flags
可選。規定如何處理引號以及使用哪種文件型別。 可用的引號型別:
規定使用的文件型別的附加 flags:
返回值:
返回已轉換的字串。
php 版本:
5.1.0+
更新日誌:
在 php 5.4 中,新增了用於規定使用的文件型別的附加 flags:ent_html401、ent_html5、ent_xml1 和 ent_xhtml。
addslashes()
addslashes() 函式返回在預定義的字元前新增反斜槓的字串。
預定義字元是:
注釋:預設情況下,php 指令 magic_quotes_gpc 為 on,對所有的 get、post 和 cookie 資料自動執行 addslashes()。不要對已經被 magic_quotes_gpc 轉義過的字串使用 addslashes(),因為這樣會導致雙層轉義。遇到這種情況時可以使用函式 get_magic_quotes_gpc() 進行檢測。
addslashes(
string)
引數描述
string
必需。規定要轉義的字串。
返回值:
返回已轉義的字串。
php 版本:4+
addslashes()版本變化
magic_quotes_gpc函式在php中的作用是判斷解析使用者提示的資料,如包括有:post、get、cookie過來的資料增加轉義字元「\」,以確保這些資料不會引起程式,特別是資料庫語句因為特殊字元引起的汙染而出現致命的錯誤
在magic_quotes_gpc=on的情況下,如果輸入的資料有
單引號(』)、雙引號(」)、反斜線()與 nul(null 字元)等字元都會被加上反斜線。這些轉義是必須的,如果這個選項為off,那麼我們就必須呼叫addslashes這個函式來為字串增加轉義。
正是因為這個選項必須為on,但是又讓使用者進行配置的矛盾,在php6中刪除了這個選項,一切的程式設計都需要在magic_quotes_gpc=off下進行了。在這樣的環境下如果不對使用者的資料進行轉義,後果不僅僅是程式錯誤而已了。同樣的會引起資料庫被注入攻擊的危險。所以從現在開始大家都不要再依賴這個設定為on了,以免有一天你的伺服器需要更新到php6而導致你的程式不能正常工作。
**如下
複製**
當magic_quotes_gpc=on的時候,函式get_magic_quotes_gpc()就會返回1
當magic_quotes_gpc=off的時候,函式get_magic_quotes_gpc()就會返回0
因此可以看出這個get_magic_quotes_gpc()函式的作用就是得到環境變數magic_quotes_gpc的值。既然在php6中刪除了magic_quotes_gpc這個選項,那麼在php6中這個函式我想也已經不復存在了。
php 判斷是否開啟get_magic_quotes_gpc功能了,以方便我們是否決定使用addslashes這個函式了。
**如下
複製**
function sqlstring($c, $t)
return $c;
}預防資料庫攻擊的正確做法
**如下
複製**
function check_input($value)
// 去除斜槓
if (get_magic_quotes_gpc())
$value = stripslashes($value);
// 如果不是數字則加引號
if (!is_numeric($value))
$value = 「『」 . mysql_real_escape_string($value) . 「『」;
return $value;
$con = mysql_connect(「localhost」, 「hello」, 「321″);
if (!$con)
die(『could not connect: 『 . mysql_error());
// 進行安全的 sql
$user = check_input($_post['user']);
$pwd = check_input($_post['pwd']);
$sql = 「select * from users where
user=$user and password=$pwd」;
mysql_query($sql);
mysql_close($con);
thinkphp 解決頁面重新整理表單重複提交的問題
控制器中 session start code mt rand 0,1000000 session code code this assign code code 注 該段 應在表單提交判斷的後面 往html中傳乙個session隨機數,並把該隨機數用隱藏input框的形式傳值 html頁面中 ty...
ASP 2 0 中跨頁面提交引數
a 設源頁面 source.aspx 目標頁面 target.aspx 如何提取源頁面的內容 方法一 源頁面設定公共屬性,屬性值為某個控制項的值 1.源頁面source.aspx的設定 在source.asp.cs 中 設定公共屬性 public string username 設定提交按鈕的pos...
Thinkphp事物提交的幾個測試
情況一 在兩個不同的方法中例項化model,在model1中開始事物,然後在乙個model中提交。情況二 在兩個不同的方法中例項化model,在model1中開始事物,然後在乙個model中回滾。情況三 在兩個不同的方法中例項化model,都開啟事物,然後在乙個model中提交。情況四 在兩個不同的...