News - Features - Downloads - Forum - Team - Support - Switch View: Screen
Login - Registrierung - Passwort vergessen
Umgang mit der Datenbank
Verfasst von hajo ClanSphere Team am 27.05.2007 um 04:41 Uhr 1

Dieses Tutorial nannte sich damals "Sicherheitsleitfaden" und ist eigentlich auch einer, da die mitunter meist ausgenutzte Schwachstelle derzeit in der Kommunikation zwischen Script und Datenbank geschieht indem Befehle an eben diese manipuliert werden. Um dies zu vermeiden sollte jeder Modul- und/oder Addon-ersteller das folgende Tutorial wie seine Sicherheitsbibel behandeln und im Zweifelsfall hier nachsehen.

Textstellen die farblich Fett oder Farbig hervorgehoben sind sollten dabei besonders beachtet werden, wobei speziell die rote Farbe eine Gefahrenstelle markiert. Dateinamen und Verzeichnisse sind an der cyan Farbe zu erkennen. Die Klammern [ und ] kennzeichnen Optional mögliche Zusätze und sind nicht notwendig, aber oftmals hilfreich.

Achtung: Bei roter Hervorhebung besteht die akute Gefahr der SQL-Injektion! Daten aus globalen Arrays wie z.B. $_GET, $_POST, $_REQUEST usw., sowie andere oder auch bereits gespeicherte Benutzer-Eingaben sind hier erst nach Filterung über die Funktion cs_sql_escape zu verwenden!




cs_sql_connect (array Verbindungsdaten)

Die Verbindungsdaten werden aus der setup.php ausgelesen. Im Regelfall wird hier das Array $cs_db übergeben und ausgewertet.

Diese Funktion wird beim Single-SQL-Server-Betrieb auf den ClanSphere normalerweise ausgelegt ist nur in der Start-Datei wie z.B. der index.php benötigt und dort aufgerufen um die Verbindung zur Datenbank zu initialisieren.

Beispiel:
$cs_db['con'] = cs_sql_connect($cs_db);


Dabei wird das Verbindungsobjekt in die Array-Variable 'con' von $cs_db gesichert.




cs_sql_count (var Datei, var SQL-Tabelle(n), [var Bedingungen, [var Eindeutig]])

Mit dieser Funktion werden Zahlen als Integer abgeholt, z.B. um eine Anzahl oder Existenz von Datensätzen festzustellen.

Als Datei wird im Regelfall nur __FILE__ übergeben, ein in PHP vordefinierter Wert der den Dateinamen weiterreicht um im Fehlerfall den Ursprung zu finden.

Die SQL-Tabelle ist ohne Prefix anzugeben, sofern weitere SQL-Tabellen per JOIN folgen sind die folgenden mit dem Prefix anzugeben und zudem für alle SQL-Tabellen Abkürzungen zu definieren, z.B. sqd für {pre}_squads

Bedingungen sind die Entsprechung für die WHERE-Klausel bei normalen SQL-Querys und sind ohne das WHERE anzugeben. Beachtet bei vorhandenen JOINS bei den SQL-Tabellen, hier die Spalten, der Identifikation wegen, mit ihrer Abkürzung anzusprechen, z.B. {pre}_squads.squads_id angeben als sqd.squads_id

Das mitgeben der Option Eindeutig legt fest welche Spalten bei der Abfrage jeweils nur einmal je aufgefundenem Wert berücksichtigt bzw. darüber zusammengefasst werden. Dies erfordert oft ausgibiges Testen um das Ziel zu erreichen.

Beispiel:
$number_of_squads = cs_sql_count(__FILE__, 'squads');


Liest die Anzahl der in der SQL-Tabelle {pre}_squads eingetragenen Squads aus und liefert das Resultat als Integer




cs_sql_delete (var Datei, var SQL-Tabelle(n), int ID, [var Feldname])

Als Datei wird im Regelfall nur __FILE__ übergeben, ein in PHP vordefinierter Wert der den Dateinamen weiterreicht um im Fehlerfall den Ursprung zu finden.

Die SQL-Tabelle ist ohne Prefix anzugeben, sofern weitere SQL-Tabellen per JOIN folgen sind die folgenden mit dem Prefix anzugeben und zudem für alle SQL-Tabellen Abkürzungen zu definieren, z.B. sqd für {pre}_squads

Die ID gibt an welcher Datensatz betroffen ist, wobei der Feldname sich aus der folgenden Option ergibt.

Der Feldname ist Standardmäßig die SQL-Tabelle ohne Prefix mit _id dahinter, also bei {pre}_squads würde dies squads_id entsprechen. Um einen anderen Feldnamen anzusprechen bzw. unter verwendung von JOINS bei den SQL-Tabellen ist es hier erforderlich eine Angabe zu machen.

Beispiel:
cs_sql_delete(__FILE__, 'squads', 5);


Dies würde die ID 5 aus der Tabelle {pre}_squads entfernen




cs_sql_escape (var Daten)

Die Daten werden gegen SQL-Injektion gesichert, indem gefährliche Zeichen durch, für die Datenbank gekennzeichnete, gleiche Zeichen ersetzt werden. Dies hat im Normalfall keine Auswirkungen auf die Daten an sich, falls doch kann es sein das die veralteten PHP-Optionen magic_quotes_gpc oder magic_quotes_runtime auf dem Webserver aktiviert sind, unbedingt abschalten (off)! Solltet ihr keinen Zugriff auf diese Optionen haben, dann bittet euren Provider um die Umstellung.

Hinweis: Mit PHP 6 fallen die magic_quotes Funktionen eh weg, falls der Provider sich also weigern sollte diese abzuschalten wird ihn spätestens dieses Argument überzeugen. Zudem ist es unprofessionelle Stützradprogrammierung sich auf diese zu verlassen!

Tipp: Achtet darauf das Daten nicht mehrfach abgesichert werden, dies hat ungewollte Nebenwirkungen (z.B. das sich diverse Zeichen öfter als ursprünglich wiederholen)!

Beispiel:
$secure_string = cs_sql_escape('this is a simple string');


Dies sichert die Daten die der Funktion übergeben werden ab um zu verhindern das diese folgende SQL-Anfragen beeinflussen.




cs_sql_insert (var Datei, var SQL-Tabelle, array Feldnamen, array Werte)

Als Datei wird im Regelfall nur __FILE__ übergeben, ein in PHP vordefinierter Wert der den Dateinamen weiterreicht um im Fehlerfall den Ursprung zu finden.

Die SQL-Tabelle ist ohne Prefix anzugeben.

Alle Feldnamen, wobei auch nur einer angegeben werden kann, sind als Array zu liefern. Dieser wird dann in der vorher festgelegten Sortierung abgearbeitet und muss die gleiche Anzahl Array-Elemente enthalten wie der Werte-Array.

Mit den Werten verhält es sich genau wie mit den Feldnamen, nur das hier die zu verwendenen Daten enthalten sind.

Beispiel:
cs_sql_insert(__FILE__, 'squads', array('squads_name'), array('example_squad'));


Dies würde den example_squad in die SQL-Tabelle {pre}_squads eintragen




cs_sql_insertid (var Datei)

Als Datei wird im Regelfall nur __FILE__ übergeben, ein in PHP vordefinierter Wert der den Dateinamen weiterreicht um im Fehlerfall den Ursprung zu finden.

Liefert die ID der letzten cs_sql_insert Ausführung und sollte möglichst direkt nach diesem Befehl verwendet werden. Diese Funktion wird z.B. verwendet um die Themen-ID des gerade erstellten Themas zu holen um den Benutzer direkt auf dieses Thema weiterzuleiten.

Beispiel:
$created_squad_id = cs_sql_insertid();


Holt die ID vom zuletzt gespeicherten Datensatz als Integer




cs_sql_option (var Datei, var Modul)

Als Datei wird im Regelfall nur __FILE__ übergeben, ein in PHP vordefinierter Wert der den Dateinamen weiterreicht um im Fehlerfall den Ursprung zu finden.

Das Modul entspricht meistens dem Verzeichnisnamen vom Modul, dessen Optionen als Array abgeholt werden sollen.

Tipp: Alle globalen Optionen vom Modul clansphere sind bereits im Array $cs_main verfügbar

Beispiel:
$squad_options = cs_sql_option(__FILE__, 'squads');


Damit wären alle Optionen vom Modul Squads im Array $squads_options vorhanden




cs_sql_query (var Datei, var Anfrage)

Als Datei wird im Regelfall nur __FILE__ übergeben, ein in PHP vordefinierter Wert der den Dateinamen weiterreicht um im Fehlerfall den Ursprung zu finden.

Die Anfrage ist ein vollständiges SQL-Query und sollte daher keine Befehle enthalten die vom SQL-Standard abweichen (SQL 2003 Core bzw. vorher SQL 99). Folgende SQL-Befehle sollten z.B. vermieden werden: ALTER TABLE CHANGE ... , ALTER TABLE ALTER ...

Um den Erfolg auszuwerten liefert die Funktion im Fehlerfall den Integer 0 und bei Erfolg einen Array mit dem Element affected_rows zurück in dem als Integer die Anzahl betroffener Datensätze enthalten ist.

Beispiel:
$query_result = cs_sql_query(__FILE__, 'UPDATE {pre}_squads SET squads_name = 'test' WHERE squads_id = 3');


Dies setzt den Squadnamen bei dem Squad mit der ID 3 auf den Wert test




cs_sql_select (var Datei, var SQL-Tabelle(n), var Feldnamen, [var Bedingungen, [var Sortierung, [int Anfang, [int Anzahl]]]])

Als Datei wird im Regelfall nur __FILE__ übergeben, ein in PHP vordefinierter Wert der den Dateinamen weiterreicht um im Fehlerfall den Ursprung zu finden.

Die SQL-Tabelle ist ohne Prefix anzugeben, sofern weitere SQL-Tabellen per JOIN folgen sind die folgenden mit dem Prefix anzugeben und zudem für alle SQL-Tabellen Abkürzungen zu definieren, z.B. sqd für {pre}_squads

Die Feldnamen entsprechen dem SELECT Abschnitt eines SQL-Querys und sind ohne das SELECT zu übergeben. Nur ein * zu übergeben um alle Feldnamen zu selektieren wird aus Geschwindigkeitsgründen nicht empfohlen, da die meisten SQL-Server dann mehr Zeit verbrauchen um die Meta-Tabelle abzufragen welche Feldnamen überhaupt verfügbar sind. Beachtet bei vorhandenen JOINS bei den SQL-Tabellen, hier die Spalten, der Identifikation wegen, mit ihrer Abkürzung anzusprechen, z.B. {pre}_squads.squads_id angeben als sqd.squads_id und zudem ein alias zu setzen um diese in der Ausgabe wie gewohnt benutzen zu können, z.B. sql.squads_id AS squads_id

Bedingungen sind die Entsprechung für die WHERE-Klausel bei normalen SQL-Querys und sind ohne das WHERE anzugeben. Beachtet bei vorhandenen JOINS bei den SQL-Tabellen, hier die Spalten, der Identifikation wegen, mit ihrer Abkürzung anzusprechen, z.B. {pre}_squads.squads_id angeben als sqd.squads_id

Die Sortierung entspricht dem ORDER BY Abschnitt eines SQL-Querys und ist ohne das ORDER BY zu übergeben. Standardmäßig wird vorwärts (ASC) sortiert, dies kann mit dem Anhängen von DESC hinter den Feldnamen umgedreht werden. Beachtet bei vorhandenen JOINS bei den SQL-Tabellen, hier die Spalten, der Identifikation wegen, mit ihrer Abkürzung anzusprechen, z.B. {pre}_squads.squads_id angeben als sqd.squads_id

Der Anfang legt die Treffernummer fest aber der für das Auslesen selektiert wird, wobei es mit 0 los geht und auch 0 der Standardwert ist wenn der Parameter unausgefüllt bleibt.

Die Anzahl legt fest wie viele Datensätze ab dem Anfang selektiert werden. Standard ist hier 1 und daher wird dann auch bei Erfolg nur ein eindimensionales Array zurückgeliefert. Bei 0 werden Alle und bei Zahlen über 1 die jeweilige Anzahl selektiert, was dann egal wie viele Treffer es am Ende tatsächlich werden zu einem zweidimensionalen Array ändert.

Achtung: Aufgrund der Anzahl und verwundbarkeit der Parameter ist vor allem bei dieser Funktion auf die Sicherheit zu achten!

Beispiel:
$squad_data = cs_sql_select(__FILE__, 'squads', 'squads_id, squads_name', 0, 'squads_name DESC', 0, 0);


Als Resultat wären alle Squads vorhanden mit ihrer ID und dem Namen, rückwärts nach ihrem Namen sortiert




cs_sql_update (var Datei, var SQL-Tabelle, array Feldnamen, array Werte, int ID, [var Bedingungen])

Als Datei wird im Regelfall nur __FILE__ übergeben, ein in PHP vordefinierter Wert der den Dateinamen weiterreicht um im Fehlerfall den Ursprung zu finden.

Die SQL-Tabelle ist ohne Prefix anzugeben.

Alle Feldnamen, wobei auch nur einer angegeben werden kann, sind als Array zu liefern. Dieser wird dann in der vorher festgelegten Sortierung abgearbeitet und muss die gleiche Anzahl Array-Elemente enthalten wie der Werte-Array.

Mit den Werten verhält es sich genau wie mit den Feldnamen, nur das hier die zu verwendenen Daten enthalten sind.

Die ID gibt an welcher Datensatz betroffen ist, wobei der Feldname sich aus der folgenden Option ergibt.

Der Feldname ist Standardmäßig die SQL-Tabelle ohne Prefix mit _id dahinter, also bei {pre}_squads würde dies squads_id entsprechen. Um einen anderen Feldnamen anzusprechen muss als ID 0 und zudem eine Bedingung übergeben werden. Bedingungen sind die Entsprechung für die WHERE-Klausel bei normalen SQL-Querys und sind ohne das WHERE anzugeben.

Beispiel:
cs_sql_update(__FILE__, 'squads', array('squads_name'), array('alpha_squad'),4);


Setzt bei Squad ID 4 den Squadnamen auf alpha_squad




cs_sql_version (var Datei)

Als Datei wird im Regelfall nur __FILE__ übergeben, ein in PHP vordefinierter Wert der den Dateinamen weiterreicht um im Fehlerfall den Ursprung zu finden.

Liefert einen Array mit folgenden Daten zurück: type, host, client, server

Bei MySQL-Erweiterungen werden auch folgende Elemente genutzt: data_size, index_size, tables

Hinweis: Diese Informationen oft bzw. sogar auf jeder Unterseite abzufragen kann bei MySQL-Erweiterungen zu Geschwindigkeitsverlusten führen. Daher sind diese Informationen für Administratoren zentral unter System -> Software gelistet.

Beispiel:
$sql_infos = cs_sql_version(__FILE__);


Liest als Array alle zur Datenbank verfügbaren Details aus




Liste bisher unterstützer Datenbank-Erweiterungen und eine ungefähre Einschätzung von deren Geschwindigkeit bei größerer Besucherlast auf dem Webserver:

mssql - 100%

mysql - 100%

mysqli - 95%

pgsql - 100%

pdo_mysql - 85%

pdo_pgsql - 85%

pdo_sqlite - 20%

sqlite - 25%

Verteilte Datenbanksysteme wie z.B. Oracle werden von ClanSphere aufgrund ihrer speziellen Eigenheiten nicht unterstützt

Seiten: -

Kommentare: 3
Seite [1]
duRiel ClanSphere Team

25.10.2015

Ort: Cambridge
Beiträge: 7806
# 1 - 01.10.2006 um 02:34 Uhr

alle schön beachten
Mr.AndersoN

31.08.2009

Ort: Dresden
Beiträge: 557
# 2 - 01.10.2006 um 12:56 Uhr

Korrekt...dann klappts nämlich auch mit den Nachbarn
evilhack^^

14.10.2009

Ort: -
Beiträge: 3
# 3 - 28.05.2007 um 21:14 Uhr

ich find das so toll dass das neue clansphere so schön entwicklerfreundlich ist, was ja bei bxcp 2 noch nicht unbedingt der fall war ;D

Bitte Login benutzen, um Kommentare zu schreiben.


ClanSphere Project - Mailus - Imprint - Disclaimer - Scriptinfo