:::

4-3-2 讀出資料的過濾

一、過濾顯示變數

  1. 讀出的資料,要考量是否允許使用HTML
  2. 若是允許使用HTML,那可能要用專業的工具來做,如:http://htmlpurifier.org/
  3. 若是不允許使用HTML,可以直接使用內建的 htmlspecialchars($string) 來過濾
  4. 但內建的 htmlspecialchars($string) 預設只轉化雙引號,不對單引號做轉義,所以,這樣用htmlspecialchars($string,ENT_QUOTES) 更好:
    $title = htmlspecialchars($news['title'], ENT_QUOTES);

    另一個和 htmlspecialchars 很像的 htmlentities 函數並不適用中文,因為會連同中文字一起轉義。

  5. 用PHP的 filter_var 過濾器亦有同樣效果(還更彈性一些):
    $title = filter_var($news['title'], FILTER_SANITIZE_SPECIAL_CHARS);

     

二、 PHP的 filter_var 過濾器

  1. 可利用PHP內建的 filter_var() 函數來過濾變數。
  2. 幾種常用過濾方法,完整過濾器可由此查看
    名稱 功用
    FILTER_CALLBACK option可以讓開發者用自訂的function處理
    FILTER_SANITIZE_STRING 去除標籤或特殊字元(html標籤會直接被消除)
    FILTER_SANITIZE_ENCODED 與urlencode()相同,過濾特殊字串
    FILTER_SANITIZE_MAGIC_QUOTES 過濾針對SQL injection做過濾(例如單、雙引號)
    FILTER_SANITIZE_SPECIAL_CHARS 針對HTML做encoding,例如<會轉成&lt;
    FILTER_SANITIZE_EMAIL 過濾e-mail,刪除e-mail格式不該出現的字元(除了$-_.+!*'{}|^~[]`#%/?@&=和數字),例如a(b)@gmail.com會被過濾成ab@gmail.com
    FILTER_SANITIZE_URL 過濾URL,刪除URL格式不該出現的字元
    FILTER_SANITIZE_NUMBER_INT 刪除所有字元,只留下數字與+-符號
    FILTER_SANITIZE_NUMBER_FLOAT 刪除所有字元,只留下數字和+-.,eE
    FILTER_VALIDATE_INT 判斷數字是否有在範圍內
    FILTER_VALIDATE_BOOLEAN 判斷布林值,1、true、on、yes都會判斷成true,反之為false,若是這些以外的值會回傳NULL
    FILTER_VALIDATE_FLOAT 判斷是否為浮點數
    FILTER_VALIDATE_REGEXP 利用regexp做驗證
    FILTER_VALIDATE_URL URL驗證
    FILTER_VALIDATE_EMAIL e-mail驗證
    FILTER_VALIDATE_IP IP驗證

三、過濾數字

  1. 一般過濾數字用 (int) $xxxintval($xxx)即可,會強制把輸入的內容變成數字。
  2. 亦可用 filter_var($num, FILTER_SANITIZE_NUMBER_INT) 來過濾,但和 intval 不太一樣,例如:
    $num = "123其他文字456";
    echo filter_var($num, FILTER_SANITIZE_NUMBER_INT) . "<br>";
    echo (int) $num . "<br>";
    echo intval($num) . "<br>";
    

     

  3. (int) $xxxintval($xxx)會得到 123,但用filter_var() 會得到 123456

四、將欲呈現變數過濾

  1. 例如:
    while ($news = $sth->fetch(PDO::FETCH_ASSOC)) {
        echo (int) $news['id'] . "<br>";
        echo filter_var($news['title'], FILTER_SANITIZE_SPECIAL_CHARS) . "<br>";
        echo filter_var($news['info'], FILTER_SANITIZE_SPECIAL_CHARS) . "<br>";
        echo filter_var($news['date'], FILTER_SANITIZE_SPECIAL_CHARS) . "<br>";
        echo (int) $news['counter'] . "<br>";
        echo filter_var($news['content'], FILTER_SANITIZE_SPECIAL_CHARS) . "<br>";
        echo (int) $news['cate_id'] . "<br>";
    }
    

    如此,就可以看到一些 XSS 攻擊被擋掉了,只出現語法:

     


:::

書籍目錄

展開 | 闔起

https%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbsn%3D52%26tbdsn%3D1826

計數器

今天: 4231423142314231
昨天: 5069506950695069
總計: 5134679513467951346795134679513467951346795134679