2017-04-20 89 views
0

如果我們使用php mysqli或PDO包裝類,它們是否可以防止SQL注入風險?php mysqli或pdo包裝類有助於防止sql注入嗎?

E.g.

https://github.com/ezSQL/ezSQL

https://github.com/bennettstone/simple-mysqli

始終使用預處理語句和參數化查詢被所有的專家建議。

包裝類對於快速編寫較少的代碼很有用,也有助於減少重複編碼。

那麼我們如何才能使用包裝類連同準備報表和參數化查詢

我對此感到困惑嗎?

例如

例如,從 - How can I prevent SQL injection in PHP?

使用預處理語句和參數化查詢

$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?'); 
$stmt->bind_param('s', $name); 

$stmt->execute(); 

$result = $stmt->get_result(); 
while ($row = $result->fetch_assoc()) { 
// do something with $row 
} 

並與包裝類,例如我們用它作爲

$name = $database->filter($_POST['name']); 
$query = $database->get_results("select* from employee where name='$name'"); 
foreach ($query as $row){ 
// do something with $row 
} 

又在哪裏使用包裝以及在何處使用準備好的發言?

如何同時使用兩者?

如何在使用包裝類時實現SQL注入預防?

+1

其提供的SQL注入防護的準備和參數化查詢。不是純粹使用'mysqli_''或'PDO' – RiggsFolly

+0

*「我很困惑這個?」 - 所以不要使用它。使用php.net中的已有內容 –

+1

我認爲@Fred-ii-說的是封裝是沒有必要的,它的使用不一定會自動提供SQL注入的保護 – RiggsFolly

回答

0

與包裝類參數相結合會是如果你讓你的包裝的get_results()方法取則params的一個可選的陣列,如:

get_results($sql, array $params = null) 

然後該功能的代碼將使用bind_param()與陣列。但這是Mysqli的痛苦,因爲bind_param()需要可變參數。它很醜。您必須將數組創建爲一個引用數組,然後使用call_user_func_array()將該數組作爲可變參數傳遞給mysqli的bind_param()

我這裏有一個解決方案:https://stackoverflow.com/a/7383439/20860

但我強烈建議你使用PDO來代替。這個任務更容易,因爲你可以將你的params數組傳遞給PDOStatement::execute()

事情是這樣的:

class MyDatabaseWrapper { 

    protected $pdo; 

    ... 

    public function get_results($sql, array $params=null) { 
     $stmt = $this->pdo->prepare($sql); 
     $stmt->execute($params); 
     return $stmt->fetchAll(PDO::FETCH_ASSOC); 
    } 

} 
+0

最好是返回一個聲明。更靈活和防錯 –

0

答案很簡單:一個很好的包裝類總是讓你使用準備好的語句。否則,請不要使用它。

那麼在哪裏使用包裝和在哪裏使用準備好的語句?

總是。

如何同時使用兩者?

只要使用它們。

如何在使用包裝類時實現SQL注入預防?

通過使用由包裝類提供的預處理語句。

這意味着您迄今爲止設法找到的兩種過時包裝都不應使用。還有其他包裝可以爲您提供簡單和安全。

例如,我有一個very simple PDO wrapper。由於PDO已經成爲一個包裝,這只是少數幾條線,爲您提供了大量的自動化功能。

它使你的代碼,甚至比你提到的那些失敗的包裝簡單:

$query = $database->run("select* from employee where name=?", [$_POST['name']]); 
foreach ($query as $row){ 
// do something with $row 
}