0×00 簡介
國內一部分CMS程式裡面有用到過is_numberic函數,我們先看看這個函數的結構
bool is_numeric ( mixed $var )
is_numeric會判斷一個字串是否是數字類型,這很重要. 比如-1, 1.5 這類的數字在is_numberic中是返回true, 因為是一個數字類型
0×01 函數是否安全
接下來我們來看個例子,說明這個函數是否安全。
代碼如下 |
複製代碼 |
$s = is_numeric($_GET['s'])?$_GET['s']:0; $sql="insert into test(type)values($s);"; //是 values($s) 不是values('$s') mysql_query($sql); |
上面這個片段程式是判斷參數s是否為數字,是則返回數字,不是則返回0,然後帶入資料庫查詢。(這樣就構造不了sql語句)
我們把‘1 or 1’ 轉換為16進位 0x31206f722031 為s參數的值
程式運行後,我們查詢資料庫看看,如下圖:
如果再重新查詢這個表的欄位出來,不做過濾帶入另一個SQL語句,將會造成2次注入.
0×02 總結
盡量不要使用這函數,如果要使用這個函數,建議使用規範的sql語句,條件加入單引號,這樣16進位0x31206f722031就會在資料庫裡顯示出來。而不會出現1 or 1。
如果我們要判斷是否是數字我們可以通過 intval()函數來代替is_numeric函數這樣上面的方法全部無效了,下面看個例子
代碼如下 |
複製代碼 |
$id = intval($_GET['id']); 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(0x1A); // 26 echo intval(42000000); // 42000000 echo intval(420000000000000000000); // 0 echo intval('420000000000000000000'); // 2147483647 echo intval(42, 8); // 42 echo intval('42', 8); // 34 ?> |
intval最常用的是正在程式中功濾入進資料庫的變質,將其轉換為整型,避免SQL注進攻打的發生