官术网_书友最值得收藏!

  • 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為整型
主站蜘蛛池模板: 突泉县| 和平县| 深圳市| 大足县| 荥阳市| 龙口市| 长顺县| 大英县| 大渡口区| 罗田县| 唐山市| 阳山县| 抚顺市| 嘉祥县| 汉川市| 黄浦区| 澄城县| 屯门区| 阳原县| 精河县| 保靖县| 连江县| 集安市| 南漳县| 丽江市| 日土县| 绥阳县| 清新县| 池州市| 大城县| 宜城市| 射阳县| 方城县| 博客| 孝感市| 高碑店市| 新野县| 廉江市| 屯留县| 永泰县| 淅川县|