MySQL-Connect in jeder Datei, oder nur wenn gebraucht?
Hendrik
- php
Hey!
Ich habe am Anfang jeder Datei immer ein paar include-Anweisungen stehen. Nun dachte ich mir, könnte ich ja auch einfach immer mein mysql.inc includen.
Ich wäre dann zwar immer mit meinem MySQL-Server verbunden, aber hätte in Dateien, in denen ich es brauche, Vorteile davon.
Nun wollte ich euch fragen, ob das Sicherheitslücken sind, wenn ich in jeder Datei mit dem MySQL-Server verbunden bin?!
Andere Frage:
Wo soll ich eigentlich meine mysql.inc (Datei mit Passwort und Usernamen der MySQL-Benutzerdaten, also zum connecten) hinpacken? Ich habe mal gehört, nicht ins Wurzelverzeichnis des Servers, aber wieso nicht. Ich dachte, man kann keinen PHP-Code auslesen, oder? Wäre nämlich total schlimm, wenn jeder Mensch Zugriff auf meine Datenbank hätte!
Hendrik
hi,
Nun wollte ich euch fragen, ob das Sicherheitslücken sind, wenn ich in jeder Datei mit dem MySQL-Server verbunden bin?!
Das ist erst mal eine Performance-Frage ...
Die Verbindung aufzubauen, "kostet" - wozu das also tun, wenn sie gar nicht gebraucht wird?
Außerdem lässt der MySQL-Server nur eine bestimmte Anzahl an gleichzeitigen Verbindungen zu - und wenn die erreicht ist, gibt's für weitere Anfragen Fehler.
Und gerade, wenn du keinen eigenen Server hast, sondern dir einen mit anderen Nutzern teilst, schadest du damit also u.U. auch noch anderen.
Vergiss dieses Vorhaben, es ist vollkommen unsinnig.
gruß,
wahsaga
echo $begrüßung;
Ich habe am Anfang jeder Datei immer ein paar include-Anweisungen stehen. Nun dachte ich mir, könnte ich ja auch einfach immer mein mysql.inc includen.
Ich wäre dann zwar immer mit meinem MySQL-Server verbunden, aber hätte in Dateien, in denen ich es brauche, Vorteile davon.
Dieses Problem lässt sich mit dem Singleton-Pattern lösen. Das Singleton-Pattern gibt immer die selbe und nur diese eine Instanz zurück und initialisiert diese vorher bei Bedarf. Wenn man keine Klasse dafür verwenden möchte (was aber auch eine gute Idee wäre, Datenbankaufrufe zu zentralisieren) und/oder nur PHP4 zur Verfügung hat, kann man eine statische Variable in einer Funktion verwenden, die Verbindung zu speichern.
function dbConnection() {
static $conn = null;
// bei erstmaligem Aufruf der Funktion die Verbindung öffnen
if ($conn === null) {
$conn = initialisierung;
// fehlerbehandlung
}
return $conn;
}
Wo soll ich eigentlich meine mysql.inc (Datei mit Passwort und Usernamen der MySQL-Benutzerdaten, also zum connecten) hinpacken?
Am besten außerhalb des DocumentRoot. Einige Provider lassen es zu, dass man das DocumentRoot seiner Domains auf Unterverzeichnisse zeigen lassen kann. Somit kann man Dateien oberhalb davon anlegen. PHP kann darauf zugreifen, und man braucht keine Zugriffsbeschränkungen mit .htaccess oder ähnlich einzurichten, die im Fehlerfall (.htaccess aus Versehen gelöscht und nicht bemerkt) nicht mehr wirken.
Ich dachte, man kann keinen PHP-Code auslesen, oder?
Solange der Webserver so konfiguriert ist, dass er die fragliche Datei vor dem Ausliefern zuerst PHP vorlegt - was bei .inc möglicherweise nicht der Fall ist - und PHP wie gewünscht arbeitet, bekommt der Anfordernde keinen PHP-Code zu Gesicht.
echo "$verabschiedung $name";
Hey!
Ich dachte, man kann keinen PHP-Code auslesen, oder?
Solange der Webserver so konfiguriert ist, dass er die fragliche Datei vor dem Ausliefern zuerst PHP vorlegt - was bei .inc möglicherweise nicht der Fall ist - und PHP wie gewünscht arbeitet, bekommt der Anfordernde keinen PHP-Code zu Gesicht.
Moment mal! Du meinst also damit, dass ich diese Datei in mysql.php umbenennen sollte? Das wäre ziemlich viel Aufwand...
Oh, man! Ich habe gerade mal mysql.inc direkt aufgerufen, und sehe voller Schrecken mitten im Browser meine Benutzerdaten für MySQL! Das geht ja wohl nicht. Also den Aufwand mit dem Umbenennen mache ich mir dann auf jeden Fall.
Nur: Ist es nicht möglich, das trotzdem irgendwie im Browser zu sehen? Könnte sich nicht teoretisch jemand einen eigenen Browser schreiben, der keinen PHP-Interpreter hat? Oder geht das nicht?
Und außerdem: Was könnte jemand mit meinen Benutzerdaten anfangen? Er müsste doch auch bei meinem Webhoster sein, um überhaupt auf diese Datenbank zugreifen zu können, oder? Man kann doch nicht einfach auf eine fremde MySQL-Datenbank zugreifen, oder?
Und überhaupt: Ich ich habe jede meiner Seiten aus mehreren include-Anweisungen erstellt. Diese Dateien muss ich dann praktischer Weise nur einmal ändern, um in allen Dateien die Änderung anzeigen zu lassen. Bei meinem links gefloateten Navigations-Bereich ist das zum Beispiel so. Nun kann aber jeder ihn ja auch einfach mit navigation.inc aufrufen, um dann den Quellcode von der Navigationsleiste zu sehen. Das ist eigentlich überhaupt nicht schlimm, da man sich ja auch einfach den Quellcode der Seite ansehen könnte, in der ich diese Navigation verwende. Aber....
Was meint ihr dazu? Soll ich alle diese Dateien eher in *.php umändern? Das hätte dann zur Folge, dass man auf dieser extra Seite diese Navigation sieht! Ist ja auch eigentlich egal...
Man, so viele Fragen. Hoffentlich weiß jemand eine Antwort auf sie!
Hendrik
echo $begrüßung;
Nur: Ist es nicht möglich, das trotzdem irgendwie im Browser zu sehen? Könnte sich nicht teoretisch jemand einen eigenen Browser schreiben, der keinen PHP-Interpreter hat? Oder geht das nicht?
Du solltest dich über den Unterschied zwischen serverseitigen und clientseitigen Scripts informieren und zu welcher Kategorie PHP gehört.
Und außerdem: Was könnte jemand mit meinen Benutzerdaten anfangen? Er müsste doch auch bei meinem Webhoster sein, um überhaupt auf diese Datenbank zugreifen zu können, oder?
Ja, aber das sollte das kleinste Problem darstellen.
Man kann doch nicht einfach auf eine fremde MySQL-Datenbank zugreifen, oder?
Auch das ist möglich. "fremd" ist hier nicht das richtige Attribut. Es kommt darauf an, wie das Netzwerk des Webhosters aussieht, und ob er Zugriffe von außerhalb auf seine(n) Datenbankserver unterbunden hat oder auch nicht.
Was meint ihr dazu? Soll ich alle diese Dateien eher in *.php umändern?
Eine Notlösung wäre noch, den Zugriff auf die .inc-Dateien per Webserverkonfiguration (.htaccess) zu verbieten.
echo "$verabschiedung $name";
Hey!
Du solltest dich über den Unterschied zwischen serverseitigen und clientseitigen Scripts informieren und zu welcher Kategorie PHP gehört.
Ja, du hast ja Recht. Ich hätte besser nachdenken sollen, bevor ich frage. Als Nutzer kann man ja gar nicht beeinflussen, was der Webserver schickt! Dumm von mir.
Eine Notlösung wäre noch, den Zugriff auf die .inc-Dateien per Webserverkonfiguration (.htaccess) zu verbieten.
Ich kann sie dann trotzdem noch einbinden? Was heißt Notlösung? Stimmst du mir jetzt zu, meine Dateien in *.php umzubenennen, oder nicht?
Vielen Dank für deine Antwort!
Hendrik
echo $begrüßung;
Eine Notlösung wäre noch, den Zugriff auf die .inc-Dateien per Webserverkonfiguration (.htaccess) zu verbieten.
Ich kann sie dann trotzdem noch einbinden? Was heißt Notlösung? Stimmst du mir jetzt zu, meine Dateien in *.php umzubenennen, oder nicht?
Ich gebe die keine Empfehlung für eine bestimmte Vorgehensweise, ich bin bemüht, dir nur die Eigenschaften selbiger anzuführen, damit du selbst entscheiden kannst, ob sie dir hier nützen oder nicht.
Wenn du Dateien, die der Webserver nicht ausliefern soll, außerhalb des DocumentRoot ablegst, sind sie schon mal generell von der direkten Auslieferung durch den Webserver ausgenommen. Selbst wenn durch eine aus Versehen gelöschte .htaccess, das darin enthaltene Auslieferungsverbot nicht mehr gilt, wird der Webserver sie nicht ausliefern. PHP kann aber weiterhin darauf zugreifen, weil es nicht an die Restriktionen der Webserver-Konfiguration gebunden ist.
Wie ich bereits schrieb, kann man versuchen, sein DocumentRoot auf ein Unterverzeichnis seines zugewiesenen Verzeichnisbereichs zu legen. Dann hat man einen Platz um solche nicht auszuliefernden Dateien abzulegen.
Gegeben seien die Verzeichnisse:
/kunden/Hendrik/
/hunden/Hendrik/documentroot/
und drei Dateien:
/kunden/Hendrik/irgendwas.inc
/kunden/Hendrik/documentroot/index.html
/kunden/Hendrik/documentroot/script.php
http://www.hendrik.example/ greift gemäß Webserverkonfiguration auf die index.html im documentroot-Verzeichnis zu. http://www.hendrik.example/../irgendwas.inc funktioniert nicht, weil solche Aufrufe generell vom Webserver unterbunden werden.
Das setzt natürlich voraus, dass der Webhoster mitspielt. Gerade bei solchen, die mehrere Domainnamen pro Kunde anbieten, sollte sich auch die "erste" Domain und nicht nur die "weiteren" auf ein solches Unterverzeichnis legen lassen.
echo "$verabschiedung $name";
Hey!
Gegeben seien die Verzeichnisse:
/kunden/Hendrik/
/hunden/Hendrik/documentroot/und drei Dateien:
/kunden/Hendrik/irgendwas.inc
/kunden/Hendrik/documentroot/index.html
/kunden/Hendrik/documentroot/script.phphttp://www.hendrik.example/ greift gemäß Webserverkonfiguration auf die index.html im documentroot-Verzeichnis zu. http://www.hendrik.example/../irgendwas.inc funktioniert nicht, weil solche Aufrufe generell vom Webserver unterbunden werden.
Das setzt natürlich voraus, dass der Webhoster mitspielt. Gerade bei solchen, die mehrere Domainnamen pro Kunde anbieten, sollte sich auch die "erste" Domain und nicht nur die "weiteren" auf ein solches Unterverzeichnis legen lassen.
Tja, leider bin ich bei einem kostenlosen Anbieter und ich denke nicht, dass ich dort diese benötigten Rechte bekomme, meine Dateien außerhalb meines Documentroots hochzuladen!
Dann bleibt mir wohl nichts anderes, als die Datei mysql.inc in so etwas wie mysql8128123jugD.php umzubenennen. Das verschafft mir den Vorteil, dass niemand wissen kan, wie die eingebundene Datei heißt, da bei mir Verzeichnisbrowsing ausgeschaltet ist. Selbst wenn er durch irgendeinen Zufall den Dateinamen rausbekäme, würde er beim direkten Aufruf der Datei nur eine weiße Seite sehen!
Was haltet ihr von dieser Idee?
Hendrik