2017-04-20 85 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 
}