php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 26.11.2008, 00:26  
Neuer Benutzer
 
Registriert seit: 25.11.2008
Beiträge: 12
Quantor befindet sich auf einem aufstrebenden Ast
Standard Welche Art der DB-Connection

Hallo zusammen,

ich suche ein bisschen allgemeines Feedback zum Thema Sicherheit bei der Programmierung mit PHP und MySQLi.

Mein Problem beginnt schon bei der Qual der Wahl der Art und Weise wie PHP eine MySQL-Datenbank ansprechen kann/soll... Welche ist die beste? Welche Kriterien sind ausschlaggebend für die Wahl? Wiederverwendbarkeit, Sicherheit, Abstraktion...?

Ich denke MySQLi ist MySQL vorzuziehen, wobei ich mir dessen eben gar nicht so sicher bin... Dann die Frage nach prozeduralem oder objektorientiertem Stil... usw.

Ich weiß, dass es genau die Antworten auf diese Fragen sind, die einen guten Programmierer (u.a.) ausmachen. Daher meine Bitte um ein wenig Einblick in eure Künste :-)

Danke!
Chris


Und hier noch eine konkretere Frage:

Kann mysqli_real_escape_string() direkt auf eine $mysqli_resource (in diesem Fall $link) angewendet werden? Die geworfene Warnung kann ja mit einem @ unterdrückt werden... Oder ist auch das wieder schlechter Stil? ;-)


Code:
$link = @mysqli_connect('localhost', 'user', 'pwd', 'db');

mysqli_set_charset($link, 'utf8');
mysqli_real_escape_string($link);

mysqli_close($link);
Quantor ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 26.11.2008, 01:10  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Das wichtigste an der Wahl ist imho die Abschätzung der Grenzen und die Spielregeln innerhalb dieser Grenzen zu kennen.
Schauen wir uns das anhand Deines Beispiels an:
mysqli_real_escape_string() erwartet eine Zeichenkette als Eingabe. Wird keine Zeichenkette übergeben, nimmt PHP eine implizite Umwandlung vor. Die bearbeitete Zeichenkette wird zurückgegeben.
Bei mysqli_real_escape_string($link); passiert also folgendes:
implizite Umwandlung resource->string, Ergebnis "resource #X" (X=irgendeine Zahl), das bringt Dir also schon mal garnichts.
Außerdem "benutzt" Du die Rückgabe nicht, d.h. die ganze Operation ist auch noch umsonst (von einer kleinen Erwärmung der CPU abgesehen).
Vor solchen Fehlern schützen Dich auch Objekte, Abstraktionen oder sonstwas nicht. Du musst Dich immer mit den Spielregeln auseinander setzen. Wofür ist etwas gut? Was bewirkt es? Wie wirken die Bausteine zusammen? usw.

Ich würde mich vermutlich für PDO entscheiden, wenn ich keine Abstraktion suche. Allerdings scheint das nicht weit verbreitet zu sein. Warum das so ist und welche möglichen Stolpersteine da verborgen sind (es muss ja irgendeinen Grund für die Nicht-Verwendung geben), kann ich Dir allerdings nicht sagen.
David ist offline   Mit Zitat antworten
Alt 26.11.2008, 01:31  
Neuer Benutzer
 
Registriert seit: 25.11.2008
Beiträge: 12
Quantor befindet sich auf einem aufstrebenden Ast
Standard

Danke David :-)

Du hast natürlich recht, dass das Beispiel ziemlich sinnlos war...
habe es eben bei einigen Tests auch bemerkt.

Diese Data Objects sehen wirklich vielversprechend aus! Ich kannte bereits Prepared Statements und Stored Procedures, wusste aber nicht, dass sie Teil von PDO sind. Muss allerdings gestehen, dass ich mich erst an diese Art der Programmierung gewöhnen muss. Wobei diese Abstraktion von der Datenbank natürlich sehr sinnvoll ist!

Sehe auch grade dass Prepared Statements nicht nur viele Zugriffe beschleunigen können, sondern auch die Maskierung übernimmt.
(PHP: Prepared Statements und Stored Procedures - Manual)

Sollte man in dem Zusammenhang trotzdem mysqli_real_escape_string() verwenden? Was denkst du?
Quantor ist offline   Mit Zitat antworten
Alt 26.11.2008, 01:57  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Nein, soll man nicht.
Die escape-Funktionen benutzt Du nur, um Nutzdaten sicher in umliegenden Code einzubetten. Bei gebundenen Parametern hast Du keinen umliegenden Code, Du überträgst den Code und die Nutzdaten getrennt voneinander.
David ist offline   Mit Zitat antworten
Alt 26.11.2008, 02:26  
Neuer Benutzer
 
Registriert seit: 25.11.2008
Beiträge: 12
Quantor befindet sich auf einem aufstrebenden Ast
Standard

Genial! Danke dir nochmals David. Ich werde auf PDO setzen
Quantor ist offline   Mit Zitat antworten
Alt 27.11.2008, 12:39  
Neuer Benutzer
 
Registriert seit: 25.11.2008
Beiträge: 12
Quantor befindet sich auf einem aufstrebenden Ast
Standard

Hallo nochmal,

ich habe jetzt in etwa folgenden Code:

PHP-Code:
<?php

// Insert row into DB
function insertRow($id$xml_title$xml_text){

    try {
        
$dbh = new PDO('mysql:host=localhost;dbname=tellme'"user""pwd", array(PDO::ATTR_PERSISTENT => true));
        
$dbh->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);    
        
        
//$dbh->beginTransaction();
        
            
$writeXML $dbh->prepare("INSERT INTO tellme.data (id, xml_title, xml_text) VALUES (:id, :xml_title, :xml_text)");
            
$writeXML->bindParam(':id'$id);
            
$writeXML->bindParam(':xml_title'$xml_title);
            
$writeXML->bindParam(':xml_text'$xml_text);
            
$writeXML->execute();

        
//$dbh->commit();
        
$dbh null;
    } 
    catch (
Exception $e) {
        
//$dbh->rollBack();
        
print $e->getMessage() . "<br/>";
        die();
    }
}

?>
wie man sieht habe ich einige Befehle auskommentiert (commit, rollBack...). Sehe ich es richtig, dass diese nur im Zusammenhang mit einer Transaktion (also beginTransaction) sinnvoll sind? und wäre das obige Bsp. dann ok?

Ausserdem frage ich mich, ob ATTR_PERSISTENT sinnvoll ist... Wann persistent und wann nicht?

Thanks :-)
Quantor ist offline   Mit Zitat antworten
Alt 27.11.2008, 14:37  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Zitat:
Zitat von Quantor Beitrag anzeigen
wie man sieht habe ich einige Befehle auskommentiert (commit, rollBack...). Sehe ich es richtig, dass diese nur im Zusammenhang mit einer Transaktion (also beginTransaction) sinnvoll sind?
Genau.

Zitat:
Zitat von Quantor Beitrag anzeigen
und wäre das obige Bsp. dann ok?
Sieht gut aus. Wenn das prepared statement nur für eine Abfrage benutzt wird, würde ich allerdings die Parameter als Feld an execute() übergeben statt bind_param() zu verwenden. Einfach nur, weil es kompakter wirkt.


Zitat:
Zitat von Quantor Beitrag anzeigen
Ausserdem frage ich mich, ob ATTR_PERSISTENT sinnvoll ist... Wann persistent und wann nicht?
siehe PHP: Persistent Database Connections - Manual
David ist offline   Mit Zitat antworten
Alt 27.11.2008, 17:12  
Erfahrener Benutzer
 
Registriert seit: 25.04.2005
Beiträge: 1.356
HStev zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Zitat:
Zitat von David;382546Ich würde mich vermutlich für [man
PDO[/man] entscheiden, wenn ich keine Abstraktion suche. Allerdings scheint das nicht weit verbreitet zu sein. Warum das so ist und welche möglichen Stolpersteine da verborgen sind (es muss ja irgendeinen Grund für die Nicht-Verwendung geben), kann ich Dir allerdings nicht sagen.
Ich verstehs auch nicht wirklich PDO ist wirklich genial aber das bedeutet ja für einige umlernen...d.h. ein wenig Zeit sich da einzuarbeiten muss man schon aufbringen aber dafür lohnt es sich wenn man DB unabhängige Scripte möchte.
__________________
Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.
HStev ist offline   Mit Zitat antworten
Alt 27.11.2008, 18:38  
Neuer Benutzer
 
Registriert seit: 25.11.2008
Beiträge: 12
Quantor befindet sich auf einem aufstrebenden Ast
Standard

Danke für euer Feedback :-)
Auch ich muss sagen, PDO ist DIE Lösung, nach der ich gesucht hatte!
Das prepared statement soll in der Tat nur für eine Abfrage benutzt werden, dies aber immer wieder mit verschiedenen Parameter-Werten. Wie müsste das dann korrekt(er) aussehen?... Und sollten alle prepared statements zusammen in einer file definiert werden? Geht nicht mit der Verwendung von execute() und dem Verzicht auf bindParam() viel Funktionalität verloren?

Und noch eine Frage: Ich bin mir nicht sicher, ob ich mein "DB-Connection-Skript" als Klasse organisieren soll... Dann könnte z.B. in __construct() der Datenbankaufbau geschehen, und in __destruct() der -abbau. Wäre das keine
für euch saubere Lösung?


Danke :-)
Chris
Quantor ist offline   Mit Zitat antworten
Alt 27.11.2008, 20:34  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Zitat:
Zitat von Quantor Beitrag anzeigen
Das prepared statement soll in der Tat nur für eine Abfrage benutzt werden, dies aber immer wieder mit verschiedenen Parameter-Werten.
Also doch nicht nur einmal. Das ist genau der Unterschied zwischen "einmal" und "mehrmals"
Du lässt das Statement nur einmal vorbereiten mit den Platzhaltern und führst es dann mehrmals mit unterschiedlichen Parametern für die Platzhalter aus.
Code:
$stmt = prepare('INSERT INTO ... VALUES(:x,:y,:z)')
bind_param(':x', $x)
bind_param(':y', $y)
bind_param(':z', $z)

while(<weiterer Datensatz>) {
  $x = <aktueller x-Wert>
  $y = <aktueller y-Wert>
  $z = <aktueller z-Wert>
  $stmt->execute()
}
David ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Keine DB Connection Kein Genie PHP Tipps 2008 14 09.09.2008 11:33
java -> Connection reset by peer: socket write error brian johnson Off-Topic Diskussionen 8 12.02.2008 09:33
mysql_connect() [function.mysql-connect]: Lost connection to Timo Trallala PHP Tipps 2007 3 05.07.2007 18:32
Connection Probleme PHP-MSSQL DaOnkel PHP Tipps 2006 4 11.04.2006 07:39
[Erledigt] MySQL - Connection refused ? Datenbanken 3 02.01.2006 18:12
Lost connection to MySQL server during query in ... ? Alpha Centauri Datenbanken 0 24.10.2005 11:09
Lost connection... Datenbanken 0 08.09.2005 16:40
mysql connection daten verschl�sseln PHP Tipps 2005-2 7 03.09.2005 18:00
Lost connection to MySQL server during query bicpi PHP-Fortgeschrittene 17 02.08.2005 11:42
DB Connection nur bei zweifachem Klick PHP-Fortgeschrittene 7 29.07.2005 16:40
[Erledigt] Localhost only with connection... Server, Hosting und Workstations 2 20.09.2004 20:35
frage zu db connection und mysql_select_db aircrash Datenbanken 2 23.07.2004 16:49
Connection Problem bei phpMyAdmin PHP Tipps 2004 1 14.07.2004 15:29
mysql connection testen?? PHP Tipps 2004 2 25.06.2004 16:46
ftp connection PHP Tipps 2004 1 03.06.2004 21:23

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
dbconnection, pdo escape string, dbconnection konnte nicht, pdo execute mehrmals, connect to mssql with pdo, connect.php sinnvoll, php website\nur für eine abfrage\ aufrufen, db connection php, php pdo transaction sinnvoll, db connection übergeben php, pdo persistent connection, db connection, pdo sinnvoll db, pdo sinnvoll, db connection innerhalb einer funktion php, php pdo dbconnect, php datenbank connection sicher, pdo execute connection problem, php saubere connection, php pdo persistent transaction

Alle Zeitangaben in WEZ +2. Es ist jetzt 03:40 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum