PHP 的過濾器(Filter)

PHP 過濾器用于驗(yàn)證和過濾來自非安全來源的數(shù)據(jù),比如用戶的輸入需曾。

PHP 過濾器:

PHP過濾器用于驗(yàn)證和過濾來自非安全來源的數(shù)據(jù)糠雨。
驗(yàn)證和過濾用戶輸入或自定義數(shù)據(jù)是任何web應(yīng)用程序的重要組成部分。
設(shè)計PHP的過濾器擴(kuò)展的目的是使數(shù)據(jù)過濾更輕松快捷亮垫。

為何使用使用過濾器羔沙?

1)幾乎所有web應(yīng)用程序都依賴外部的輸入躺涝。這些數(shù)據(jù)通常來自用戶或其他應(yīng)用程序(比如web服務(wù))。通過使用過濾器扼雏,你可以確保應(yīng)有程序獲得正確的輸入類型坚嗜。

2)你應(yīng)該始終對外部數(shù)據(jù)進(jìn)行過濾!// 這個是規(guī)范

3)輸入過濾是最重要的應(yīng)用程序安全課題之一诗充。

什么是外部數(shù)據(jù)苍蔬?

  • 來自表單的輸入數(shù)據(jù)
  • cookies
  • 服務(wù)器變量
  • 數(shù)據(jù)庫查詢結(jié)果

函數(shù)和過濾器

過濾變量的方式, 可以任選下面的過濾器函數(shù)之一:

  • filter_var() 通過一個指定的過濾器來過濾單一的變量
  • filter_var_array() 通過相同的或者不同的過濾器來過濾多個變量
  • filter_input() 獲取一個輸入變量蝴蜓,并對它進(jìn)行過濾
  • filter_input_array 獲取多個輸入變量银室,并通過相同的或者不同的過濾器對它們進(jìn)行過濾

例子:我們使用filter_var()函數(shù)驗(yàn)證了一個整數(shù):

<?php
    $int = 123;
    if(!filter_var($int, FILTER_VALIDATE_INT)) {
        echo ("Integer is not valid");
    }else {
        echo ("Integer is valid");
    }
?>

上面的代碼使用了"FILTER_VALIDATE_INT"過濾器來過濾變量。
由于這個整數(shù)是合法的励翼,因此代碼的輸出是:"Integer is valid"


有2種過濾器:

Validating 和 Sanitizing

Validating 過濾器:

  • 用于驗(yàn)證用戶輸入
  • 嚴(yán)格的格式規(guī)則(比如URL 或 E-Mail 驗(yàn)證)
  • 如果成功則返回預(yù)期的類型,如果失敗則返回FALSE

Sanitizing 過濾器:

  • 用于允許或禁止字符串中指定的字符
  • 無數(shù)據(jù)格式規(guī)則
  • 始終返回字符串

選項(xiàng)和標(biāo)志

選項(xiàng)和標(biāo)志用于向指定的過濾器添加額外的過濾選項(xiàng)辜荠。
不同的過濾器有不同的選項(xiàng)和標(biāo)志汽抚。

eg:我們使用filter_var()min_range以及max_range選項(xiàng)驗(yàn)證一個整數(shù):

<?php
    $var = 300;
    $int_options = arrar(
       "min_range" => 0,
       "max_range" => 256
    );
?>

if (!filter_var($var, FILTER_VALIDATE_NT, $int_options)) {
    echo ("Integer is not valid");
}else {
    echo ("Integer is valid");
}


驗(yàn)證輸入

讓我們試著驗(yàn)證來自表單的輸入。
我們需要做的第一件事就是確認(rèn)是否存在我們正在查找的輸入數(shù)據(jù)伯病。
然后我們用filter_input() 函數(shù)過濾輸入的數(shù)據(jù)造烁。

輸入變量email被傳到php頁面:

<?php
    if(!filter_has_var(INPUT_GET, "email")){
        echo ("Input type does not exists");
    }else {
        if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)) {
            echo "E-Mail is not valid";
        }else {
         
        }
    }
?>

例子解釋:有一個通過“GET”方法傳送的輸入變量(email):
1)檢測是否存在GET類型的email輸入變量
2)如果存在輸入變量否过,檢測它是否有效的郵件地址


凈化輸入

試著清理一下表單傳來的URL。
首先惭蟋,我們要確認(rèn)是否存在我們正在查找的輸入數(shù)據(jù)苗桂。
然后,我們用filter_input()函數(shù)來凈化輸入數(shù)據(jù)告组。

<?php
if(!filter_has_var(INPUT_POST, "url"))
 {
 echo("Input type does not exist");
 }
else
 {
 $url = filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL);
 }
?>

sanitize: 使...無害

檢測是否存在POST類型的url輸入變量.
如果穿在此輸入變量煤伟,對其進(jìn)行凈化(刪除非法字符),并將其存儲在$url變量中

假如輸入變量類似這樣:"http://www.W3非o法ol.com.c字符n/"木缝,則凈化后的 $url 變量應(yīng)該是這樣的:

http://www.W3School.com.cn/

過濾多個輸入

表單通常由多個輸入字段組成便锨。為了避免對filter_var或者filter_input重復(fù)調(diào)用,我們可以使用filter_var_array或者thefilter_input_array函數(shù)我碟。

eg:使用filter_inpup_array()函數(shù)來過濾三個GET變量放案。接受到的GET變量是一個名字,一個年齡以及一個郵件地址矫俺。

<?php
    $filter=arrar(
        "name" => array(
            "filter"=>FILTER_SANITIZE_STRING
        ),
        "age"=> array(
            "filter"=>FILTER_VALIDATE_INT,
            "options"=>array(
                 "min_range"=>1,
                 "max_range"=>120
            )
        ),
       "email"=>FILTER_VALIDATE_EMAIL
    );
?>

$result = filter_input_array(INPUT_GET, $filters);

if (!$result["age"]) {
    echo("Age must be a number between 1 and 120.<br>");
}elseif(!$result["email"]){
    echo("E-mail is not valid");
}else {
    echo("User input is valid");
}


使用Filter Callback

通過使用FILTER_CALLBACK 過濾器吱殉,可以調(diào)用自定義的函數(shù),吧它作為一個過濾器來使用厘托。這樣我們就擁有了數(shù)據(jù)過濾器的完全控制權(quán)友雳。
可以自定義函數(shù),也可以使用已經(jīng)有的PHP函數(shù)催烘。
規(guī)定你準(zhǔn)備用到過濾器函數(shù)的方法沥阱,與規(guī)定選項(xiàng)的方法相同。

eg:使用一個自定義的函數(shù)吧所有的_轉(zhuǎn)換為空格:

<?php
    function convertUnderlineToSpace($string){
        return str_replace("_", " ", $string);
    }

    $string = "Peter_is_a_great_guy!";
    echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace"));
?>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伊群,一起剝皮案震驚了整個濱河市考杉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舰始,老刑警劉巖崇棠,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異丸卷,居然都是意外死亡枕稀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門谜嫉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萎坷,“玉大人,你說我怎么就攤上這事沐兰《叩担” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵住闯,是天一觀的道長瓜浸。 經(jīng)常有香客問我澳淑,道長,這世上最難降的妖魔是什么插佛? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任杠巡,我火速辦了婚禮,結(jié)果婚禮上雇寇,老公的妹妹穿的比我還像新娘氢拥。我一直安慰自己,他們只是感情好谢床,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布兄一。 她就那樣靜靜地躺著,像睡著了一般识腿。 火紅的嫁衣襯著肌膚如雪出革。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天渡讼,我揣著相機(jī)與錄音骂束,去河邊找鬼。 笑死成箫,一個胖子當(dāng)著我的面吹牛展箱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蹬昌,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼混驰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了皂贩?” 一聲冷哼從身側(cè)響起栖榨,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎明刷,沒想到半個月后婴栽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辈末,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年愚争,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挤聘。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡轰枝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出组去,到底是詐尸還是另有隱情狸膏,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布添怔,位于F島的核電站湾戳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏广料。R本人自食惡果不足惜砾脑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望艾杏。 院中可真熱鬧韧衣,春花似錦、人聲如沸购桑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勃蜘。三九已至硕噩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缭贡,已是汗流浹背炉擅。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阳惹,地道東北人谍失。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像莹汤,于是被迫代替她去往敵國和親快鱼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理纲岭,服務(wù)發(fā)現(xiàn)抹竹,斷路器,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 1荒勇、什么是 PHP 過濾器柒莉? PHP 過濾器 :用于驗(yàn)證和過濾來自非安全來源的數(shù)據(jù)。 驗(yàn)證和過濾 [用戶輸入信息]...
    忘惘的小風(fēng)扇閱讀 715評論 2 0
  • Welcome 目前網(wǎng)絡(luò)上充斥著大量的陳舊信息沽翔,讓PHP新手誤入歧途兢孝,傳播著錯誤的實(shí)踐和糟糕的代碼,這必須得到糾正...
    layjoy閱讀 21,672評論 7 118
  • 過濾器用來格式化需要展示給用戶的數(shù)據(jù)仅偎。AngularJS有很多實(shí)用的內(nèi)置過濾器跨蟹,同時也提供了方便的途徑可以自己創(chuàng)建...
    oWSQo閱讀 1,095評論 0 5
  • PHP常用函數(shù)大全 usleep() 函數(shù)延遲代碼執(zhí)行若干微秒。 unpack() 函數(shù)從二進(jìn)制字符串對數(shù)據(jù)進(jìn)行解...
    上街買菜丶迷倒老太閱讀 1,366評論 0 20