13.
資料檢查
一、 不要相信使用者
- 程式開發者永遠把使用者當壞人。
- 請試著輸入各種亂七八糟的資料到您的表單中,例如「'測試'」、「\測試\」、「<font color=red>測試</font>」、「"測試"」
二、 整理資料
- trim($str,[$charlist]):從空白處開始去除資料中的空白、換行、tab...等特殊符號。第二個參數可自訂要刪除哪些字元。
- ltrim($str,[$charlist]):僅清除左邊,rtrim($str,[$charlist]): 僅清除右邊。
- htmlspecialchars($str):將網頁標籤展為特殊字符(即關閉HTML功能)
- (1) 「'引號' 設為<b>粗體</b>」會變成「'引號' 設為<b>粗體</b>」
- (2) htmlspecialchars($str,ENT_QUOTES):連同單引號、雙引號也要轉換
- intval():將資料轉換成數字型態(32位元系統範圍:-2147483648 to 2147483647 ,64位元系統範圍:9223372036854775807)
echo intval(42); // 42
echo intval(4.2); // 4
echo intval('42'); // 42
echo intval('+42'); // 42
echo intval('-42'); // -42
echo intval(042); // 34
echo intval('042'); // 42
echo intval(1e10); // 1410065408
echo intval('1e10'); // 1
echo intval(42000000); // 42000000
echo intval(420000000000000000000); // 0
echo intval('420000000000000000000'); // 2147483647
三、 魔術引號Magic Quotes
- 當php.ini中的magic_quotes_gpc=On時,自動對所有的 GET、POST、COOKIE 資料中,針對 '(單引號),"(雙引號),\(反斜線)和 NULL 字符都會被自動加上一個反斜線進行轉義。這和 addslashes() 作用完全相同。
- 魔術引號在 PHP 中用來減少隱碼攻擊風險。(隱碼攻擊:SQL injection,在輸入的字串之中夾帶SQL指令,在設計不良的程式當中忽略了檢查,那麼這些夾帶進去的指令就會被資料庫伺服器誤認為是正常的SQL指令而執行,因此遭到破壞。)
- 為什麼PHP6不用魔術引號
- (1) 可移植性:因為每台機器設定都不同,容易影響移植性。建議自己用 get_magic_quotes_gpc() 來檢查是否打開,並據此來寫相關處理動作。
- (2) 性能:由於並不是每一段被轉義的資料都要插入到資料庫的,如果所有資料都被轉義的話,那麼會對程序的執行效率產生一定的影響。
- (3) 不便:由於不是所有數據都需要轉義,在不需要轉義的地方看到轉義的資料就很煩。比如說通過表單發送郵件,結果看到一大堆的 \'。
- get_magic_quotes_gpc ():用來取得目前魔術引號的設定狀況
- addslashes():針對 '(單引號),"(雙引號),\(反斜線)和 NULL 字符都會被自動加上一個反斜線進行轉義。
- stripslashes():去除反斜線用。
- 資料新增到資料庫前可以這樣用:$content = (! get_magic_quotes_gpc ()) ? addslashes ($content) : $content;
您可以用「';<script>alert('aaa');</script>」來測試看看。