0

如何防止應用程序針對每個SQL查詢使用預準備語句進行SQL注入。如何在PHP MVC門面模式中準備查詢?

我有一些「經理」類來處理查詢,並調用爲數據庫連接和查詢運行而設計的特定類的靜態方法。這個爲每個查詢創建一個連接,並有一些通用的公共靜態方法getAll(),getOne(),exec()來處理各種查詢。

我在哪裏可以做db-> prepare,BindParam和execute語句?經理類方面,沒有連接初始化,所以db-> prepare是不可能的。 數據庫類方面,該方法是通用的,所以參數是可變的,取決於調用靜態方法的方法。

有一個什麼樣我想在這裏說明一個清晰的概念,你可以看到我的代碼在這裏:https://github.com/code-climber/car_rental/tree/master/src/car_rental/model/dao

您可以檢查我寫CarManager.class.php的方式和我的SQL查詢方式他們在DBOperation.class.php中處理。

我希望這個問題能夠在OOP PHP編程中清楚我腦海中的重要概念。

回答

0

您可以在一個參數中傳遞查詢,然後在第二個參數中傳遞值。因此,例如在您的DBOperation類中將function getAll($sQuery)更改爲function ($sQuery,$sQData){}.

其中$sQData是一個包含要綁定到查詢中的所有值的數組。然後只需綁定您的查詢和參數並執行您的功能。

所以,你可以定義$sQData喜歡:

array("key1"=>"value1","key2"=>"value2","key3"=>"value3"); 

然後通過你的數組一樣遍歷:

foreach($sQData as $key=>$value){} 
+0

好吧,這是接近工作,只是我不明白的一件事。當我遍歷查詢參數數組時,我寫$ stmt-> bindParam($ key,$ value),但存儲在數據庫表中的是關鍵。例如,我得到:在我的表中登錄,而不是得到我的真實登錄名。 –

+0

我可以看看你的循環碼嗎? –

0

好吧,我終於通過混合不同的答案解決了這個問題。

查詢以及它傳遞給負責執行的類的方式如下所示。像我這樣的初學者,不要把引號VALUES參數:

$sQuery = 'INSERT INTO Clients (first_name, last_name, email, login, passwd) '; 
$sQuery .= "VALUES (:firstName,:lastName,:email,:login,:saltedPasswd)"; 
$aQueryParams = array(':firstName' => $sFirstName,':lastName' => $sLastName,':email' => $sEmail,':login' => $sLogin,':saltedPasswd'=>$sPasswordSalted); 
$bSuccess = DBOperation::exec($sQuery,$aQueryParams); 

而現在exec()方法的內容在DBOperation類。

public static function exec($sQuery,$aQueryParams){ 
     self::init(); 
     try { 
      $stmt = self::$oDataBase->prepare($sQuery); 
      $iAffectedRows = $stmt->execute($aQueryParams) or die(print_r(self::$oDataBase->errorInfo())); 
     } catch (PDOException $oPdoException) { 
      echo 'PDO Exception : ' . $oPdoException->getMessage(); 
     } 
     return false !== $iAffectedRows; 
    } 

我不使用foreach()循環,因爲我讀,我可以使用的參數數組直接​​,如果我本來是要處理,我應該使用bindParam()這樣的一個參考:

foreach($aQueryParams as $key=>&$value){ 
    $stmt->bindParam($key, $value); 
}