PSD-Tutorials.de
Forum für Design, Fotografie & Bildbearbeitung
Tutkit
Agentur
Hilfe
Kontakt
Start
Forum
Aktuelles
Besonderer Inhalt
Foren durchsuchen
Tutorials
News
Anmelden
Kostenlos registrieren
Aktuelles
Suche
Suche
Nur Titel durchsuchen
Von:
Menü
Anmelden
Kostenlos registrieren
App installieren
Installieren
JavaScript ist deaktiviert. Für eine bessere Darstellung aktiviere bitte JavaScript in deinem Browser, bevor du fortfährst.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen
alternativen Browser
verwenden.
Antworten auf deine Fragen:
Neues Thema erstellen
Start
Forum
Sonstiges
Webdesign, Webentwicklung & Programmierung
PHP, Javascript, jQuery, Ajax, nodeJS, MySQL...
sichere Datenbankabfragen - prepared Statements?
Beitrag
<blockquote data-quote="d3mueller" data-source="post: 2367627" data-attributes="member: 568927"><p>Hi, ich bin am überlegen, was die beste und unkomplizierteste Möglichkeit ist, die Queries für SQL sicher zu machen. Es muss nicht bis ins letzte durchdacht und unglaublich kompliziert und verstrickt sein^^.</p><p></p><p>Früher habe ich immer so was wie mysqli_real_escape_string benutzt. Aber jetzt bin ich auf "prepared statements" gestoßen. Das soll ja ziemlich sicher sein, zumindest habe ich das so gelesen.</p><p></p><p>Nur ist es so:</p><p></p><p>Bisher habe ich (für die "internen" Funktionen, auf dessen Werte die User keinen Einfluss haben) eine query()-Methode benutzt. Die geht einfach so, dass ich als ersten Parameter das SQL schicke und als 2. Parameter den Rückgabetyp, z.B. das Array mit den Inhalten aus der Datenbank.</p><p></p><p>Jetzt dann diese Prepared-Statements zu benutzen würde das ja komplett umstellen. Die query()-Methode könnte ich so ja gar nicht mehr benutzen.</p><p></p><p>Meine Fragen:</p><p></p><p>1. Ist es wirklich nötig, prepared statements zu verwenden? Oder ist das ein unnötiger Aufwand?Weil ich halt alles umbauen müsste und ich dann nicht mehr so "bequem" Queries ausführen könnte.</p><p></p><p>2. Bei mir funktioniert es nicht. Wenn ich schreibe:</p><p></p><p></p><p></p><p>Call to undefined method Database:<img src="/styles/default/xenforo/smilies/tongue.gif" class="smilie" loading="lazy" alt=":p" title="Stick Out Tongue :p" data-shortname=":p" />repare()</p><p></p><p>Ich weiß jetzt nicht, welche Stelle im Code dafür wichtig ist. Hier sind mal die beiden Datenbank-Klassen, die ich benutze. die erste, abstract, Klasse ist da, damit die ganzen "externen" Klassen Zugriff auf das Datenbank-Objekt haben. Also alle anderen Klassen werden damit erweitert</p><p></p><p>[PHP]</p><p>class Buildings extends DatabaseBased {...}</p><p>[/PHP]</p><p></p><p>[PHP]</p><p>abstract class DatabaseBased {</p><p> protected static $database;</p><p> </p><p> public static function setDatabase(Database $database)</p><p> {</p><p> self::$database = $database;</p><p> }</p><p>}</p><p></p><p></p><p>class Database</p><p>{</p><p> public $connection;</p><p> </p><p> </p><p> public function __construct($host, $user, $password, $database) {</p><p> $this->connection = mysqli_connect($host, $user, $password, $database);</p><p> if (mysqli_connect_errno()) {</p><p> throw new Exception(__METHOD__.'::'.mysqli_connect_error());</p><p> }</p><p> // Die jetzt erstellte Instanz wird in DatabaseBased gespeichert</p><p> DatabaseBased::setDatabase($this);</p><p> }</p><p> </p><p> public function close() {</p><p> if (!$this->connection) return false;</p><p> $this->connection->close();</p><p> }</p><p> </p><p> public function query($sql, $return='affected', $result_mode=MYSQLI_USE_RESULT) {</p><p> $data = array();</p><p> </p><p> if ($result = $this->connection->query($sql, $result_mode)) {</p><p> if ($return=='affected'){ $data = $this->connection->affected_rows; }</p><p> elseif ($return=='num'){ $data = mysqli_num_rows($result); }</p><p> elseif ($return=='id'){ $data = $this->connection->insert_id; }</p><p> elseif ($return=='assoc'){ while ($row = $result->fetch_assoc()) $data[] = $row; }</p><p> elseif ($return=='numeric'){ while ($row = $result->fetch_assoc()) $row = $result->fetch_array(MYSQLI_NUM); }</p><p> elseif ($return=='fields'){ while ($row = $result->fetch_fields()) $data[] = $row; }</p><p> elseif ($return== 'ressources') { while($row = $result->fetch_assoc()) $data[$row["ressourceId"]] = $row; }</p><p> else { while($row = $result->fetch_assoc()) $data[$row[$return]] = $row; }</p><p> if (is_object($result)) $result->close();</p><p> } else {</p><p> throw new Exception(__METHOD__.'::'.$this->connection->error.'::'.$sql);</p><p> }</p><p> return $data;</p><p> }</p><p> </p><p> public function startTransaction()</p><p> {</p><p> if (!$this->connection) return false;</p><p> $ok = $this->query("SET AUTOCOMMIT=0");</p><p> return ($ok && $this->query("START TRANSACTION"));</p><p> }</p><p> public function commit()</p><p> {</p><p> if (!$this->connection) return false;</p><p> if (!$this->query("COMMIT")) return false;</p><p> $this->query("SET AUTOCOMMIT=1");</p><p> return true;</p><p> }</p><p> public function rollback()</p><p> {</p><p> if (!$this->connection) return false;</p><p> if (!$this->query("ROLLBACK;")) return false;</p><p> $this->query("SET AUTOCOMMIT=1");</p><p> return true;</p><p> }</p><p> </p><p>}</p><p></p><p>[/PHP]</p><p></p><p>Ich glaube, die Fehlermeldung kommt, weil ich das Datenbank-Objekt an sich anspreche, und die die eigentliche Verbindung zur Datenbank. Aber ich schaff es nicht, das hinzubekommen. Habt ihr Ideen?</p><p>Irgendwie will es heute absolut nicht klappen. Ich hock schon ewigkeiten davor und schaff es nicht. Hab auch schon im Internet geschaut. Heute ist absolut nicht mein Tag^^</p><p></p><p>Ich hoffe ich habe jetzt keine Angaben vergessen, falls ja, dann sorry^^Dann werde ich es noch nachreichen</p><p></p><p>Vielen Dank schon mal</p><p></p><p>LG</p><p></p><p></p><p>EDIT:</p><p></p><p>Okay, das oben beschriebene Problem habe ich gelöst. War gestern irgendwie zu blöd. War ganz einfach.</p><p></p><p>Das Problem, welches ich jetzt habe, ist folgende Fehlermeldung:</p><p></p><p>Call to undefined method mysqli_stmt::get_result()</p><p></p><p>Wenn ich schreibe</p><p></p><p>[PHP]</p><p>$result = $stmt->get_result();</p><p>[/PHP]</p><p></p><p>Habe gelesen, dass man dafür erst einen Treiber auf dem Webspace installieren muss. Das kann ich (glaube ich) bei strato nicht. Also fallen prepared statements ja schon weg :/</p><p></p><p>Gibt es noch andere Möglichkeiten?</p></blockquote><p></p>
[QUOTE="d3mueller, post: 2367627, member: 568927"] Hi, ich bin am überlegen, was die beste und unkomplizierteste Möglichkeit ist, die Queries für SQL sicher zu machen. Es muss nicht bis ins letzte durchdacht und unglaublich kompliziert und verstrickt sein^^. Früher habe ich immer so was wie mysqli_real_escape_string benutzt. Aber jetzt bin ich auf "prepared statements" gestoßen. Das soll ja ziemlich sicher sein, zumindest habe ich das so gelesen. Nur ist es so: Bisher habe ich (für die "internen" Funktionen, auf dessen Werte die User keinen Einfluss haben) eine query()-Methode benutzt. Die geht einfach so, dass ich als ersten Parameter das SQL schicke und als 2. Parameter den Rückgabetyp, z.B. das Array mit den Inhalten aus der Datenbank. Jetzt dann diese Prepared-Statements zu benutzen würde das ja komplett umstellen. Die query()-Methode könnte ich so ja gar nicht mehr benutzen. Meine Fragen: 1. Ist es wirklich nötig, prepared statements zu verwenden? Oder ist das ein unnötiger Aufwand?Weil ich halt alles umbauen müsste und ich dann nicht mehr so "bequem" Queries ausführen könnte. 2. Bei mir funktioniert es nicht. Wenn ich schreibe: Call to undefined method Database::prepare() Ich weiß jetzt nicht, welche Stelle im Code dafür wichtig ist. Hier sind mal die beiden Datenbank-Klassen, die ich benutze. die erste, abstract, Klasse ist da, damit die ganzen "externen" Klassen Zugriff auf das Datenbank-Objekt haben. Also alle anderen Klassen werden damit erweitert [PHP] class Buildings extends DatabaseBased {...} [/PHP] [PHP] abstract class DatabaseBased { protected static $database; public static function setDatabase(Database $database) { self::$database = $database; } } class Database { public $connection; public function __construct($host, $user, $password, $database) { $this->connection = mysqli_connect($host, $user, $password, $database); if (mysqli_connect_errno()) { throw new Exception(__METHOD__.'::'.mysqli_connect_error()); } // Die jetzt erstellte Instanz wird in DatabaseBased gespeichert DatabaseBased::setDatabase($this); } public function close() { if (!$this->connection) return false; $this->connection->close(); } public function query($sql, $return='affected', $result_mode=MYSQLI_USE_RESULT) { $data = array(); if ($result = $this->connection->query($sql, $result_mode)) { if ($return=='affected'){ $data = $this->connection->affected_rows; } elseif ($return=='num'){ $data = mysqli_num_rows($result); } elseif ($return=='id'){ $data = $this->connection->insert_id; } elseif ($return=='assoc'){ while ($row = $result->fetch_assoc()) $data[] = $row; } elseif ($return=='numeric'){ while ($row = $result->fetch_assoc()) $row = $result->fetch_array(MYSQLI_NUM); } elseif ($return=='fields'){ while ($row = $result->fetch_fields()) $data[] = $row; } elseif ($return== 'ressources') { while($row = $result->fetch_assoc()) $data[$row["ressourceId"]] = $row; } else { while($row = $result->fetch_assoc()) $data[$row[$return]] = $row; } if (is_object($result)) $result->close(); } else { throw new Exception(__METHOD__.'::'.$this->connection->error.'::'.$sql); } return $data; } public function startTransaction() { if (!$this->connection) return false; $ok = $this->query("SET AUTOCOMMIT=0"); return ($ok && $this->query("START TRANSACTION")); } public function commit() { if (!$this->connection) return false; if (!$this->query("COMMIT")) return false; $this->query("SET AUTOCOMMIT=1"); return true; } public function rollback() { if (!$this->connection) return false; if (!$this->query("ROLLBACK;")) return false; $this->query("SET AUTOCOMMIT=1"); return true; } } [/PHP] Ich glaube, die Fehlermeldung kommt, weil ich das Datenbank-Objekt an sich anspreche, und die die eigentliche Verbindung zur Datenbank. Aber ich schaff es nicht, das hinzubekommen. Habt ihr Ideen? Irgendwie will es heute absolut nicht klappen. Ich hock schon ewigkeiten davor und schaff es nicht. Hab auch schon im Internet geschaut. Heute ist absolut nicht mein Tag^^ Ich hoffe ich habe jetzt keine Angaben vergessen, falls ja, dann sorry^^Dann werde ich es noch nachreichen Vielen Dank schon mal LG EDIT: Okay, das oben beschriebene Problem habe ich gelöst. War gestern irgendwie zu blöd. War ganz einfach. Das Problem, welches ich jetzt habe, ist folgende Fehlermeldung: Call to undefined method mysqli_stmt::get_result() Wenn ich schreibe [PHP] $result = $stmt->get_result(); [/PHP] Habe gelesen, dass man dafür erst einen Treiber auf dem Webspace installieren muss. Das kann ich (glaube ich) bei strato nicht. Also fallen prepared statements ja schon weg :/ Gibt es noch andere Möglichkeiten? [/QUOTE]
Bilder bitte
hier hochladen
und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Zitate einfügen…
Authentifizierung
Wenn ★ = 12, ◇ = 4 und die Hälfte von ★ zu ◇ addiert wird, was ist das Ergebnis?
Antworten
Start
Forum
Sonstiges
Webdesign, Webentwicklung & Programmierung
PHP, Javascript, jQuery, Ajax, nodeJS, MySQL...
sichere Datenbankabfragen - prepared Statements?
Oben