2012-10-22 43 views
0

我對PHP還有很多新的PDO,所以我不完全知道在從SQL注入以外訪問數據庫時應該避免(並且包括)什麼。 (僅供參考,在「用戶」表下面的示例中也包含密碼),但是使用下面的函數訪問數據庫以獲取安全信息?是否容易受到攻擊?使用函數訪問數據庫值是否安全?

,如果你不明白爲什麼我這樣做是因爲我發現它更快,鏈接表:)

<?php 
    require("access/common.php"); 
    function getval($username, $column, $table, $datab){ 
    $query = " 
    SELECT 
    id, 
    username, 
    email 
    FROM ".$table." 
    WHERE 
    username = :username 
    "; 
    $query_params = array( 
    ':username' => $username, 
    ); 
    try 
    { 
     $stmt = $datab->prepare($query); 
     $result = $stmt->execute($query_params); 
    } 
    catch(PDOException $ex) 
    { 
     die(); 
    } 
    $row = $stmt->fetch(); 
    if($row) 
    { 
     return $row[$column]; 
    } 
    } 
    echo getval("USERNAME", "email", "users", $db); 
?> 
+0

看起來你正在編寫某種數據庫訪問層。你有沒有考慮過使用一個[已經寫好](http://stackoverflow.com/questions/108699/good-php-orm-library)? – tadman

回答

1

你問的問題是非常開放的。用戶輸入(用戶可以通過$ _GET或$ _POST變量嚮應用程序/網站提交的任何內容),您的最大攻擊向量始終是您用做的事情。當然,PHP語言結構沒有安全威脅,例如。功能。

在你的例子中,我可以看到你綁定了「:username」參數,而不是「:table」參數,如果你接受unsanitized用戶輸入並將它用作「$ table」值。

一定要小心你如何使用$ _GET和$ _POST值......當這變得單調乏味時,尋找一個框架來自動完成一些工作。

+0

'$ table'不能用佔位符轉義,否則會以文字字符串結尾,因此會導致查詢無效。在一般的實踐中,你應該確定'$ table'不能包含敵對值,例如,如果它是由用戶提供的,或者通過確保它只在內部提供,則通過將其與可接受值的已知白名單進行審覈,而不是從' $ _GET','$ _POST'或'$ _SESSION'。 – tadman

+0

是真的。感謝您的更正。 – stephenfrank

0

函數是沒有安全或小於安全時,它會更容易代碼之外的函數。如果這是你將要使用超過一次或兩次,肯定把它放在一個函數。只要你正確使用PDO,你就會好起來的。也就是說,您可能希望將所有數據庫函數放在一個類中,然後實例化該類的$ db對象,然後可以從中調用所需的任何數據庫函數。有很多方法可以組織代碼,使事情更容易處理。

+0

thankyou :)我只是想到了這一點,但如果這個陳述會被重複執行,它會不會也有點廣泛? –

+1

廣泛的如何?函數意味着被多次調用。但是,如果您要一遍又一遍地運行某些查詢,則可能需要查看MySQL中的存儲過程。 – sgroves

相關問題