php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2009

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 29.05.2009, 15:54  
Neuer Benutzer
 
Registriert seit: 23.04.2009
Beiträge: 19
beneblack befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] MySQL-Datenbank connect sicherer machen (OOP?)

Hi liebe PHP-Gemeinschaft,

ich habe erst vor zwei Tagen angefangen mich ein kleines bisschen an OOP heranzutasten. Mir fehlen da sicher noch die eine oder andere Grundlage und so 100% weiß ich auch noch nicht, was man da alles darf und was nicht.
Ziel ist es eine Art kleine Datenbank-Klasse zu haben, die sich aus einer externen PHP-Datei (z.B.: datenbank_configuration.php) die Logindaten zieht. So bräuchte ich auf allen Servern nur diese eine Datei zu ändern und brauche die Klassen und andere Dateien nicht anzupassen. Das Script funktioniert, doch ich bin unsicher:
  • Worauf muss ich achten?
    Ist das sicher, oder muss ich übergebene Variablen noch irgendwie prüfen?
    Muss ich mit bestimmte Dateirechte setzen, um zu verhindern, dass jemand meine datenbank_configuration.php auslesen kann (da steht ja das mysql-root-pw drin)?
    Kann ich das irgendwie besser lösen?

Hier der Code, wie ich es (laienhaft) gelöst habe:
datenbank_configuration.php:
PHP-Code:
<?php
    
class datenbank_configuration
    
{
        public 
$dbhost 'hostname';
        public 
$dbuser 'root';
        public 
$dbpw 'password';
        public 
$dbname    'datenbankname';
    }
?>
Die Datenbankklasse:
database.php:
PHP-Code:
<?php
class database
{    
    public 
$mysql;
    
    function 
__construct()
    {    
        require 
'datenbank_configuration.php';
        
$db_conf = new datenbank_configuration();
        
$this -> mysql = new mysqli($db_conf->dbhost$db_conf->dbuser$db_conf->dbpw$db_conf->dbname) or die ('Es ist ein Fehler aufgetreten! Keine Verbindung zur Datenbank');        
    }
...
Edith hat noch gelesen, dass es besser wäre "Interfaces" zu benutzen, um möglichst wenig globale Variablen verwenden. Habe ich das richtig verstanden und ist da was dran?

Geändert von beneblack (29.05.2009 um 15:59 Uhr). Grund: Was sind Interfaces?
beneblack ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 29.05.2009, 17:47  
Erfahrener Benutzer
 
Benutzerbild von drsoong
 
Registriert seit: 05.08.2008
Beiträge: 1.127
drsoong wird schon bald berühmt werden
Standard

Hierzu könnte man jetzt wohl ne Menge sagen. Soviel nur von mir. Ob OOP oder nicht ist bei Deiner Fragestellung m. E. zweitrangig. Sieh lieber zu, dass Zugangsdaten nur verschlüsselt vorliegen und die Datei möglichst über dem Wurzelverzeichnis des Webservers liegt oder, wenn das nicht geht, weil Du keine entsprechenden Rechte hast, dann packe die Datei wenigstens in ein geschütztes Verzeichnis. Wenn Du frei im DBMS schalten und walten kannst, solltest Du Dir auch verschiedene Datenbankuser mit unterschiedlichen Rechten anlegen, also quasi "darf viel", "darf weniger", "darf kaum was"
drsoong ist offline  
Alt 29.05.2009, 18:22  
erc
Erfahrener Benutzer
 
Registriert seit: 02.01.2009
Beiträge: 730
PHP-Kenntnisse:
Fortgeschritten
erc wird schon bald berühmt werden
Standard

Was machst du wenn du dich mit einem zweiten Server oder zusätzlich als andere User verbinden willst? Das ganze ist zu unflexibel... übergeb die Verbindungsdaten leiber.

PHP-Code:
class ... {
function 
__construct(datenbank_configuration $db_conf)
    {    
        
$this -> mysql = new mysqli($db_conf->dbhost$db_conf->dbuser$db_conf->dbpw$db_conf->dbname) or die ('Es ist ein Fehler aufgetreten! Keine Verbindung zur Datenbank');        
    }

Zitat:
Muss ich mit bestimmte Dateirechte setzen, um zu verhindern, dass jemand meine datenbank_configuration.php auslesen kann.
Grundsätzlich eigentlich nicht. Praktisch ist es aber eine zusätzliches Plus an Sicherheit wenn die Datei nicht über HTTP erreichtbar ist. Es kann vorkommen das der Webserver falsch konfiguriert ist und PHP Datein im Klartext ausliefert.

Zitat:
da steht ja das mysql-root-pw drin
Das sollte man definitiv nicht machen. Der Mysql Root User hat erstens zuviele Rechte und zweitens ist für ihn immer eine Verbindung frei. Wenn deine Anwendung mit diesem User läuft und durch irgendeinen Umstand das Verbindungslimit erreicht wird, hast du keine Chance auf die Datenbank zuzugreifen. (da hilft dann nur noch ein neustart der Datenbank) Leg also lieber ein extra User an der nur die benötigten Rechte hat.
erc ist offline  
Alt 29.05.2009, 18:56  
Neuer Benutzer
 
Registriert seit: 23.04.2009
Beiträge: 19
beneblack befindet sich auf einem aufstrebenden Ast
Standard

Danke! Das alles hilft mir schon einmal etwas weiter. Ich kann in diesem Server leider nur mit diesem einem Benutzer arbeiten, der mir zur Verfügung steht. Und auch über das Wurzelverzeichnis des Webservers werde ich wohl nicht rankommen. Aber interessant sind solche Sicherheitstipps allemal.

Wenn ich die Datei in ein geschütztes Verzeichnis lege, welche Berechtigungen muss ich setzen, um zu verhindern, dass es ausgespäht werden kann. Und wie gewährleiste ich, dass meine Seite (index.html/index.php) problemlos auf diese Daten zugreifen kann? Naja vielleicht probiere ich das auch einfach mal aus...

Es weicht vielleicht etwas vom Thema ab, ist aber in diesem Zusammenhang trotzdem für mich wichtig zu wissen: Angenommen ich erschaffe einen Pfad auf meinem Server (meineseite.de/geheim/sehrgeheim/index.html) und teile niemanden diesen Pfad mit und verlinke sie auch nicht und sperre die Berechtigung (403) des Ordners geheim und kann die index.html aber normal im browser aufrufen: Gibt es irgendeine Möglichkeit für andere, auf diese Seite zuzugreifen(bots etc.?).

beneblack

Geändert von beneblack (29.05.2009 um 19:04 Uhr).
beneblack ist offline  
Alt 29.05.2009, 19:29  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.268
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Hallo,

speicher die Datei nicht als *.inc ab, wie viele es gern machen, sondern als das was sie dann ist: *.php. Dann wird sie geparset und keiner sollte den Quelltext zu sehen bekommen, selbst wenn er es schafft über den Webserver an sie ranzukommen.

Um letzteres zu verhinden legst du sie zusätzlich in einen Ordner ausserhalb des public_html/htdocs/wwwroot oder wie auch immer der Document-Root bei dir heißt, sprich etwa hier:
public_html/index.php -- deine Startseite
private/database_config.php

So wird selbst beim Ausfall des PHP-Parsers niemand über den Webserver an deine Datenbank-Konfiguration herankommen. Zumindest nicht direkt. Falls das nicht möglich ist musst du einen Ordner im public_html anlegen, den du mit .htaccess schützt. PHP greift ja nicht über den Webserver sondern über das Dateisystem direkt darauf zu. Wenn die .htaccess richtig konfiguriert ist (Deny from all auf Ordner und Dateien) kommt keiner über den Webserver ran, falls die .htaccess falsch konfiguriert ist, kann man die Konfig-Datei zwar öffnen, sie wird ja aber von PHP geparset und da sie nur Konstanten definiert, aber nichts ausgibt, ist das auch hier nicht problematisch (wenn auch unschön).

Zu deiner letzteren Frage:
Unwahrscheinlich, aber nicht unmöglich. Gute Bots lassen aber davon ab, wenn du es ihnen mitteilst: Siehe robots.txt.
Zitat:
sperre die Berechtigung (403) des Ordners geheim
Was meinst du damit?
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline  
Alt 29.05.2009, 23:40  
Neuer Benutzer
 
Registriert seit: 23.04.2009
Beiträge: 19
beneblack befindet sich auf einem aufstrebenden Ast
Standard

Ich gehe von einem mutwilligen Angriff aus. Mit dem man versucht Verzeichnisse zu erraten/erlangen, die normalerweise unbekannt sind. Mit 403 meine ich die Berechtigung zum Ordner so einzuschränken, dass man, wenn man auf meineseite.de/geheim/ geht eine Fehlermeldung "403 Forbidden - You don't have permission to access /geheim/ on this server" erhält. Wenn man aber auf meineseite.de/geheim/sehrgeheim/index.html geht (oder auch ohne index.html, weil die ja alleine aufgeht), dann kann man diese Webseite normal benutzen.
Es wäre gar nicht gut, wenn es einen Weg gibt an diese index.html ranzukommen ohne den Link von jemanden mitgeteilt zu bekommen.

Danke schon mal für die vielen hilfreichen Antworten.

beneblack
beneblack ist offline  
Alt 30.05.2009, 01:51  
Erfahrener Benutzer
 
Benutzerbild von Celli
 
Registriert seit: 24.05.2009
Beiträge: 158
Celli befindet sich auf einem aufstrebenden Ast
Standard

Eine einfache Methode wäre eine Alias für das Verzeichnis wo Deine Konfigurationsdatei (PHP Datei) liegt, anzulegen. Dafür braucht man aber Zugriff auf die Webserver Konfiguration.
PHP kann natürlich weiterhin auf die Datei zugreifen.

Beispiel:
Alias /config/ /var/www/htdocs/leeres_verzeichnis

Aufruf:
http://deine-domain.de/config/databa...figuration.php

Wird Redirected auf:
/var/www/htdocs/leeres_verzeichnis/database_configuration.php

..und da das Verzeichnis leer ist wird ein 404 zurückgegeben.

Zu Deiner Interface Frage:
Ein Interface definiert nur die Methoden die eine Klasse mit der Implementation des Interfaces besitzen muss und ihre Deklaration. Es hat somit keine Eigenschaften oder sonstige Deklarationen.
Interfaces werden benutzt um Schnittstellen klar zu definieren. Sie werden auch häufig als Typ in der Parameter Liste einer Funktion / Methode benutzt für das Sicherstellen des zu erwartenden Objekttyps.

Beispiel:
PHP-Code:
<?php 

interface Person
{
    public function 
getName();
    
    public function 
setName($name 'Tim');
}



// Fehler, weil die Methode setName fehlt
class User implements Person
{
    public function 
getName()
    {
        
// return name
    
}
}

// Fehler, weil die Methode setName nicht genau die des Interfaces entspricht ($name = 'Tim')
class User implements Person
{
    public function 
getName()
    {
        
// return name
    
}
    
    public function 
setName($name)
    {
        
// set name
    
}
}

// Fehler, weil der Deklarator private und nicht public ist
class User implements Person
{
    public function 
getName()
    {
        
// return name
    
}
    
    private function 
setName($name 'Tim')
    {
        
// set name
    
}
}

?>
__________________
Eine Antwort oder Lösung habe ich nicht immer, aber zu 99,9% eine Idee. (200 Posts Limit)

Geändert von Celli (30.05.2009 um 02:25 Uhr).
Celli ist offline  
Alt 30.05.2009, 11:42  
Neuer Benutzer
 
Registriert seit: 23.04.2009
Beiträge: 19
beneblack befindet sich auf einem aufstrebenden Ast
Standard

Danke Celli,

das mit dem Interface und den konstanten Variablen konnte ich erfolgreich umsetzen. Für mich ist das kein Unterschied, aber wenn es besser ist, dann mach ich das auch gleich so.
Die Dateiberechtigung auf dem Server konnte ich erfolgreich einschränken (und wie ihr wusstet und sagtet) hat php damit ja kein Problem.

Allerdings zielte meine Frage mit dem "geheim/streng geheim/"-Pfad noch auf etwas anderes ab. Auf einer mir bekannten Seite (die wohl schon so seit Jahren online ist), gibt es genau so einen Pfad, bei dem /geheim nicht zugreifbar ist, aber auf /geheim/sehr geheim/index.html zugegriffen werden kann. Den Pfad kennen aber nur wenige "Auserwählte". Auf dieser index.html befinden sich mehrere textarea-Bereiche, über die direkt eine bestimmte Seite der Homepage verändert werden kann. Auf Grund schlechter Programmierung (ich hab da noch keine Berechtigungen ) werden die Formular-Felder nicht geprüft und es lässt sich jeder html-code implementieren (von Fett-Druck über Bilder von anderen Webseiten bis hin zu sofortiger Weiterleitung auf eine andere Webseite (
Code:
<meta http-equiv="refresh" content="0; URL=http://www.neue-url.de">
)).
Sollte es unmöglich sein, diese Seite ausfindig zu machen, dann finde ich es zwar schlampig, aber mir egal. Sollte jemand mit schlechten Absichten aber an diese Seite gelangen können, ohne, dass er sie mitgeteilt bekommen hat, dann sollte da etwas unternommen werden.

beneblack

Edith weiß, dass bis auf die letzte Frage (und die ist OffTopic), das Thema eigentlich erledigt ist.
Soll ich ein neues Thema aufmachen und das auf erledigt setzen, oder auf Antwort warten und dann zu machen?
beneblack ist offline  
Alt 31.05.2009, 12:58  
Neuer Benutzer
 
Registriert seit: 23.04.2009
Beiträge: 19
beneblack befindet sich auf einem aufstrebenden Ast
Standard

Da das Thema erledigt ist, geht es hier für das off-Topic weiter:

http://www.php.de/php-einsteiger/556...te-sicher.html
beneblack ist offline  
 


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
mysql datenbank auf shared host? Necronomicon Datenbanken 2 18.01.2009 19:29
Umlaute in Datenbank MYSQL schreiben sebastian1986 Datenbanken 3 09.09.2008 16:01
Backup einer MySql Datenbank dh1sbg Beitragsarchiv 1 13.04.2008 20:45
[Erledigt] MySQL - ERROR 1044 bei erstellen einer Datenbank _youngenterpriser_ Datenbanken 2 05.02.2008 17:56
Mit php dynamisch Namen von Bildnamen sowie Pfad in mysql Datenbank speichern mallmis PHP Tipps 2008 1 19.11.2007 23:04
Adresse zur MySQL Datenbank Marian Datenbanken 4 10.08.2005 09:47
[Erledigt] MySQL &amp;amp;quot;Can't connect...&amp;amp;quot; Fehler. Datenbanken 1 08.08.2005 14:25
mysql datenbank anlegen...aber WIE??? Datenbanken 0 05.08.2005 19:33
[Erledigt] mysql datenbank anlegen...aber WIE??? PHP Tipps 2005-2 0 05.08.2005 19:33
[Erledigt] mysql datenbank anlegen...aber WIE??? Datenbanken 0 05.08.2005 19:32
mysql datenbank anlegen...aber WIE??? Datenbanken 0 05.08.2005 19:32
mysql datenbank anlegen...aber WIE??? Datenbanken 0 05.08.2005 19:31
[Erledigt] mysql datenbank anlegen...aber WIE??? Datenbanken 0 05.08.2005 19:31
[Erledigt] mysql datenbank anlegen...aber WIE??? Datenbanken 0 05.08.2005 19:29
[Erledigt] Datenbank HP im PHP Kit + MySQL Datenbanken 1 20.04.2005 12:32

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php sichere datenbankverbindung, http://www.php.de/php-einsteiger/55589-erledigt-mysql-datenbank-connect-sicherer-machen-oop.html, sichere datenbankverbindung php, mysql sicher machen, sicherer mysql connect, mysql connect sicherheit, php mysql connect sicher, datenbank connect und auslesen, forbidden you don\'t have permission to access /dbconnect.php on this server, mysql connect externe datei, sichere mysql verbindung php, php datenbankconnect, mysql connect datenbank sicherheit wo datei speichern, connect.php sicher, oop php mysql connection, sichere datenbankverbindung mysql, php mysql connect sicher machen, php mysql datenbank connect class, html seite sicher machen, sichere datenbankverbindung

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:10 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