2011-10-10 35 views
0

請考慮以下代碼片段。從安全的角度來看,這段代碼可以接受嗎? 假設$ action和$ data變量被設計爲從用戶接受,並且啓用了register_globals 。從安全角度可接受的PHP代碼?

<?php 

if(common::IsUserAdmin($userID)) 
{ 
$isAdmin = true; 
} 
    $data = common::Validate_And_Return_Input($data) 
    Switch($action) 
    { 
    case 「add」: 
    common::addSomething($data); 
    break; 

    case 「delete」: 
    if($isAdmin) 
    { 
    common::deleteSomething($data); 
     } 
    break; 
    case 「edit」: 
    if($isAdmin) 
    { 
    common::editSomething($data); 
    } 
    break; 
    default: 
    echo 「Bad action.」; 
    } 
?> 
+9

如果啓用了register_globals,那麼就安全性而言任何內容都是不可接受的。 – BoltClock

+0

常見的做法是什麼? '$ action'從哪裏來?你的格式在哪裏(乾淨易讀的代碼是安全性的第一步,因爲它會更容易審覈)...... – ircmaxell

+4

如果register_globals已啓用,我可以只在查詢字符串上傳遞'?isAdmin = 1',並繞過一些授權檢查...? –

回答

0

由於您沒有顯示任何代碼:從安全的角度來看,沒有什麼可以保護的。所以只需將它壓縮成一個文件並存儲起來,讓它腐爛10年,直到你刪除它。

如果你實際上甚至打算在連接到互聯網的服務器上運行它,那麼你應該遵循PHP手冊中建議的安全主題的最低限度,包括禁用註冊全局變量。

如果你最終管理的是(有更多的主題),你甚至可以實際發佈代碼示例顯示你的一些數據處理,而不是隱藏在不說的函數名稱後面。驗證什麼?回到哪裏?

所以實際上,這裏沒有太多關於你的代碼的說法,因爲沒有太多的代碼。

希望這有幫助。

1

顯然register_globals最好是關閉(安全明智)。如果可以,請禁用它。但是,如果這不是一個選項(遺留系統等),這裏有一些反饋。

更改爲$ isAdmin檢查:

// This prevents register_globals from overwriting $isAdmin 
$isAdmin = common::IsUserAdmin($userID); 
$data = common::Validate_And_Return_Input($data) 

// The rest of the code 
// .... 

開關處於$action過濾掉不需要的數據的好方法。沒關係。

此外,如果你正在期待從用戶選擇一組號碼,檢查它們對錶,以確保它們是安全的:

$allowed = array('a', 'b', 'c', 'd'); 
if (in_array($user_input, $allowed)) 
{ 
    // Do your stuff. $user_input is safe 
} 

最後拿的類型轉換變量的優點是,你知道(或期望是)整數/浮點數以確保您獲得期望的結果:

$sanitized_input_int = (int)$user_input_int; 
$sanitized_input_float = (float)$user_input_float; 
+0

非常感謝你!這很棒! – user949852