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

  • 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為整型
主站蜘蛛池模板: 普兰店市| 九龙坡区| 二连浩特市| 缙云县| 沽源县| 行唐县| 永康市| 上虞市| 句容市| 苏尼特左旗| 岱山县| 库伦旗| 海淀区| 抚顺市| 哈密市| 疏附县| 东源县| 芜湖县| 海原县| 天门市| 太康县| 江西省| 江源县| 临海市| 吴旗县| 枣阳市| 大埔区| 唐河县| 高陵县| 滕州市| 察隅县| 阿图什市| 烟台市| 云安县| 兴海县| 呈贡县| 噶尔县| 金秀| 铜陵市| 英山县| 彭山县|