php中使用is_numberic函數注意事項

來源:互聯網
上載者:User

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注進攻打的發生

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.