intval() 處理字符串時遵循:「跳過前導空白 → 遇數字或正負號開始轉換 → 遇非數字或字符串結束(\0)停止轉換」。
// PHP_FUNCTION(intval) 簡化流程
convert_to_long_base(return_value, base);
// Zend/zend_operators.c
case IS_STRING:
strval = Z_STRVAL_P(op);
Z_LVAL_P(op) = strtol(strval, NULL, base); // 關鍵調用
break;
strtol() 正是實現上述「遇數字始、遇非數止」行為的 C 庫函數。
<?php
$var = "20070601";
if (intval($var)) echo "it's safe"; // 正常
$var1 = "1 union select 1,1,1 from admin";
if (intval($var1)) echo "it's safe too"; // 同樣進入分支!
echo '$var1='.$var1; // 輸出原始惡意字符串
?>
intval("1 union...") 返回 1(真),導致安全判斷失效,攻擊者可繞過驗證注入 SQL。
WordPress ≤ 2.0.6 wp-trackback.php 利用 intval() 特性繞過檢查,導致 SQL 注入漏洞。
ctype_digit()、filter_var() 或正則確保純數字。