簡體   English   中英

分析不安全代碼片段代碼的好工具是什么?

[英]What is a good tool to analyse code for unsafe code fragments?

我正在尋找一些可以對PHP腳本進行基本測試的工具。

這次我對復雜的測試解決方案不感興趣,需要為每一段代碼編寫測試。 我對功能測試既不感興趣。

我期望這個工具做的是指出可能導致無效使用的代碼片段:

  1. 變量;
  2. 函數參數;
  3. 函數返回值。

例如,無效的使用將使用NULL作為對象或數組,或者將布爾值作為需要作為數組或對象(或NULL)的arguent傳遞。

此外,它還可能檢查是否使用了“良好做法”,即, if ( $condition ) $doSomething; ,它可能會警告使用它是不安全的if ( $condition ) $doSomething; ,如果它找到類似的東西。


為了說明該工具應該檢測為“不安全”的代碼片段,這里有幾個例子。

在這種情況下, $filter可能為NULL ,但它用作數組:

<?php
    function getList(array $filter = null) { 
        $sql = '...';
        // ...
        foreach ( $filter as $field => $value ) {
            // ...
        }
        // ...
    }

在這種情況下, $res可能為false ,但它被用作resource

<?php
    $res = mysql_query('...');
    while ( $row = mysql_fetch_assoc($res) ) {
        // ...
    }
    mysql_free_result($res);

這里是相應的“安全”代碼片段:

// $filter is used only if it's non-empty; as list of arguments describes, it may be only NULL or array
function getList(array $filter = null) { 
    $sql = '...';
    // ...
    if ( $filter ) {
        foreach ( $filter as $field => $value ) {
            // ...
        }
    }
    // ...
}

...

// $filter is forced to be an array
function getList(array $filter = null) { 
    $filter = (array)$filter;
    $sql = '...';
    // ...
    foreach ( $filter as $field => $value ) {
        // ...
    }
    // ...
}

...

// if $res is false, mysql_fetch_assoc() and mysql_free_result() never executes
$res = mysql_query('...');
if ( $res === false ) {
    trigger_error('...');
    return;
}
while ( $row = mysql_fetch_assoc($res) ) {
    // ...
}
mysql_free_result($res);

...

// if $res is false, mysql_fetch_assoc() and mysql_free_result() are skipped
$res = mysql_query('...');
if ( $res !== false ) {
    while ( $row = mysql_fetch_assoc($res) ) {
        // ...
    }
    mysql_free_result($res);
}

這不是基本測試,但需要對令牌流進行非平凡的分析。

你可以使用

phpmd

掃描PHP源代碼並查找潛在的問題,例如可能的錯誤,死代碼,次優代碼和過於復雜的表達式

phpcs

phpcs標記PHP,JavaScript和CSS文件,並檢測違反一組定義的編碼標准。 它是一種必不可少的開發工具,可確保您的代碼保持清潔和一致。 它還可以幫助防止開發人員產生的一些常見語義錯誤。

或 - 如果這還不夠 - 請查看字節碼級別

bytekit-CLI

bytekit-cli提供了一個命令行工具,它利用Bytekit擴展在PHP字節碼級別上執行公共代碼分析任務。

你必須為此寫自己的嗅覺。

更多工具和資源:

一個好的IDE應該指出基本錯誤作為開發過程的一部分。

例如,我使用Netbeans,它突出顯示常見的代碼錯誤,例如已定義但未使用的變量,或在if()條件中錯誤使用賦值運算符,其中等於運算符更正常(即寫入if($x = $y)而不是if($x == $y) )。

這樣的基本內容顯示在Netbeans中,行號為黃色警告三角形。 其他IDE將具有類似的功能。

我認為它沒有找到你描述的特定錯誤條件,但它肯定會收到相當多的錯誤,即使對於你所談到的錯誤,我也希望這些東西被標記出來,而不是在一個單獨的工具。

您想要的是傳統上稱為靜態分析工具。 這些工具經常做的是確定代碼中的每個點,它知道變量的事實類型(在X = NULL之后,工具知道X為NULL),然后沿着各種控制流路徑傳播它所知道的內容。查看變量的狀態是否與操作不一致(例如,在發現X為null之后,找到必須執行的代碼,嘗試將X作為數組訪問)。

要做到這一點,你需要一個完整的PHP解析器,生成AST,符號表至少告訴你PHP變量的范圍,一些確定控制和數據流的方法,以及一組檢測各種信息的集合模式編碼錯誤。

PHP的一個這樣的工具是PHPSat 它似乎做了一些,你可以下載一個運行它(我沒有具體經驗)。 構建它的技術Stratego至少適合於這項任務; Stratego可以生成AST並可以從中收集各種地方的事實,盡管我認為它並不擅長控制和數據流。 這與只能訪問PHP令牌的工具形成對比,例如在另一個答案中提到的PHPCS; 來自令牌的計算控制和數據流是一場噩夢,實際上它根本無法完成。

正確的機制似乎隱藏在Paul Biggar的論文中 我似乎無法找到任何人提到它並將其用作靜態分析儀的基礎的任何提示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM