首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP intval() 函數特性深度解析:從源碼看字符串轉換邏輯與潛在安全風險

     編輯:PHP 相關知識

    函數特性

    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() 或正則確保純數字。
    • 資料庫操作採用預處理語句(Prepared Statements),杜絕拼接 SQL。
    • 安全邏輯勿依賴類型轉換函數的副作用,顯式判斷類型與範圍。
    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved