- ThinkPHP實戰
- 夏磊
- 699字
- 2020-11-28 18:26:55
4.10 讀取輸入
在實際開發過程中,存在一條黃金守則“永遠不要相信用戶的輸入”,需要經常讀取系統變量或者用戶提交的數據,這些數據是不受信任的,很容易引起安全隱患,如果利用好ThinkPHP提供的變量輸入功能,就可以避免這種問題了。
傳統的變量讀取方式:
$id = $_GET['id']; $username = $_POST['username']; $uid = $_SESSION['user_id']; $cookie = $_COOKIE['cookie']; $host = $_SERVER['HTTP_HOST'];
ThinkPHP框架中使用“I”函數進行變量的獲取和過濾,函數定義如下:
I(’變量來源.變量名/修飾符’, [’默認值’], [’過濾方法’], [’額外數據源’])
變量來源指變量的來源數組,如來源于$_GET、$_POST,完整來源定義如表4-2所示。
表4-2

變量來源不區分大小寫,變量名區分大小寫。
以POST為例,說明I函數的使用:
echo I('post.username'); //等效于echo $_POST['username'];
1.默認值
echo I('post.username', 'admin'); //如果$_POST['username']為空,則輸出“admin”
2.過濾方法
echo I('post.username', '', 'htmlspecialchars'); //等效于echo htmlspecialchars(empty($_POST['username'])? '': $_POST['username'])
I函數支持獲取整個變量數組,如:I(‘post.')等效于$_POST。
如果在調用I函數時沒有指定過濾方法,系統會采用配置“DEFAULT_FILTER”的值(默認為htmlspecialchars)作為函數進行過濾,該參數支持多個過濾函數,例如:
“DEFAULT_FILTER”=>'strip_tags, htmlspecialchars'
I(‘post.username')等效于htmlspecialchars(strip_tags($_POST[‘username'])),請注意函數調用順序。
I函數的第三個參數如果傳入的是函數名,則使用該函數對變量進行操作并返回操作結果(如果變量是數組,則使用array_map進行處理),否則調用PHP內置的filter_var方法進行處理,例如:I(‘post.email', '', FILTER_VALIDATE_EMAIL)等效于filter_var($_POST[‘email'], FILTER_VALIDATE_EMAIL)。
3.正則過濾
I('post.username', '', '/^[A-Za-z0-9]+$/');
如果正則匹配失敗,返回默認值。
4.不進行任何過濾
某些情況下,不希望開啟過濾功能,比如CMS系統中的文章內容,該內容由富文本編輯器生成,帶有HTML標記,如果不做任何處理,該值會被ThinkPHP進行htmlspecialchars處理。使用I('post.content', ", false)來關閉過濾方法處理。
5.變量修飾符
在需要指定變量值的格式時,可以使用變量修飾符,可用修飾符如表4-3所示。
表4-3

使用方法如下:
I('post.username/s'); //強制轉換username為字符串 I('post.uid/d'); //強制轉換uid為整型