2017-04-20 7 views
0

Wenn wir php mysqli oder PDO Wrapperklasse verwenden, verhindern sie SQL Injection Risiken?Hilft php mysqli oder pdo wrapper klasse sql injektion zu verhindern?

z.

https://github.com/ezSQL/ezSQL

oder

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

Immer verwenden vorbereitete Anweisungen und parametrisierte Abfragen von allen Experten empfohlen.

Wrapper-Klasse ist nützlich für weniger Codierung in schneller Zeit und hilft auch, wiederholte Codierung zu reduzieren.

Wie können wir dann verwenden Wrapper-Klasse zusammen mit vorbereiteten Anweisungen und parametrisierte Abfragen gleichzeitig?

Ich bin davon verwirrt?

z.B.

Beispiel aus - How can I prevent SQL injection in PHP?

Verwenden vorbereitete Anweisungen und parametrisierte Abfragen

$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 
} 

Und mit Wrapper-Klasse, z.B. wir verwenden es als

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

Dann, wo Wrapper zu verwenden und wo vorbereitete Anweisungen zu benutzen?

wie beide gleichzeitig verwenden?

Wie erreicht man die Vermeidung von SQL-Injektionen bei der Verwendung der Wrapper-Klasse?

+1

Sein die vorbereiteten und parametrisierte Abfragen, die die SQL-Injection-Schutz bieten. Nicht rein mit 'mysqli_' oder' PDO' – RiggsFolly

+0

* "Ich bin verwirrt davon?" * - Also nicht benutzen. Verwenden Sie, was bereits vorhanden ist auf php.net –

+1

Ich denke, was @ Fred-Ii sagt, es ist der Wrapper ist in keiner Weise notwendig, und die Verwendung von es nicht automatisch Schutz vor SQL-Injection – RiggsFolly

Antwort

0

Kombination Parametrierung mit einer Wrapper-Klasse würde wie, wenn Sie Ihre Wrapper des get_results() Methode nimmt ein optionales Array von params machen:

get_results($sql, array $params = null) 

Dann wird der Code für diese Funktion bind_param() mit dem Array verwenden würde. Aber es ist ein Schmerz in Mysqli, weil bind_param() varargs nimmt. Es ist hässlich. Sie müssen das Array zu einem Array von Referenzen machen und dann call_user_func_array() verwenden, um das Array als varargs an bind_param() von mysqli zu übergeben.

Ich habe hier eine Lösung: https://stackoverflow.com/a/7383439/20860

Aber ich fordere Sie PDO stattdessen zu verwenden. Es ist viel einfacher für diese Aufgabe, weil Sie Ihr Array von Parametern einfach an PDOStatement::execute() übergeben können.

Etwas wie folgt aus:

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

es ist besser, eine Aussage zurückzugeben. viel flexibler und auch fehlersicher –

0

Die Antwort ist einfach: ein guter Wrapper-Klasse immer können Sie vorbereitete Anweisungen verwenden. Ansonsten benutze es einfach nicht.

Dann wo Wrapper zu verwenden und wo vorbereitete Anweisungen zu verwenden?

Immer.

wie Sie beide gleichzeitig verwenden?

Verwenden Sie sie einfach.

Wie erreicht man die Vermeidung von SQL-Injektionen während der Verwendung der Wrapper-Klasse?

Mit vorbereiteten Anweisungen von einer Wrapper-Klasse angeboten.

Es bedeutet, dass beide veralteten Wrapper, die Sie bisher gefunden haben, niemals verwendet werden sollten. Es gibt andere Wrapper, die Ihnen Einfachheit und Sicherheit bieten.

Zum Beispiel habe ich eine very simple PDO wrapper. Es sind nur wenige Zeilen, da PDO bereits ein Wrapper ist, und bietet Ihnen eine Vielzahl von Automatisierungsfunktionen.

Es macht Ihren Code noch einfacher als mit den gescheiterten Wrapper Sie erwähnt:

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