PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   Geschützte MySQL-Verbindung in Klasse?! (https://www.php-resource.de/forum/php-developer-forum/90917-geschuetzte-mysql-verbindung-in-klasse.html)

micronax 19-03-2008 21:05

Geschützte MySQL-Verbindung in Klasse?!
 
Hey Ho,
Mal wieder eine bescheidene Frage von mir^^ Und zwar habe ich eine Klasse für mein Accountsystem geschrieben. Diese stelle ich über den includepath für bestimmte vHosts zur verfügung..

In dieser Klasse gibt es eine Funktion namens connect(), die am Anfang eine Verbindung zur Account-Datenbank (MySQL) herstellt:

PHP-Code:

public function connect() {
        
$this->link mysql_connect("localhost""user""password"
true);
        
mysql_select_db("micronax_mymicronax"$this->link);
    } 

This->link ist wie folgt definiert
PHP-Code:

protected $link false

In der Klasse führe ich querys durch mit
PHP-Code:

$result mysql_query($sql$this->link) or die(mysql_error()); 

Meine Anfangsüberlegung war: Wenn ich den link nur in der Klasse definiere und auf protected setze, müsste man außerhalb der Klasse ja eigendlich nicht auf diese MySQL-Verbindung zugreifen können. Damit lag ich aber leidet falsch. Es ist möglich. Hab schon probiert, mittel __destruct die Verbindung wieder zu schließen.. bringt aber auch nichts..

Hat jemand eine Idee, wie ich es machen kann, das diese Verbindung mit diesen Zugangsdaten nur Klassenintern verfügbar ist?

Danke & Grüße,

Fabian
Micronax.de

$_Baker 19-03-2008 21:16

http://de3.php.net/manual/de/ref.pdo.php

Schau dir das mal an.

Kropff 19-03-2008 21:19

Zitat:

das diese Verbindung mit diesen Zugangsdaten nur Klassenintern verfügbar ist?
private?

gruß
peter

$_Baker 19-03-2008 21:22

Wenn keine Verbindungskennung bei den Mysql-Funktionen angegeben wird, wird automatisch die letzte genommen.
Ich denke dass darin das Problem besteht.

micronax 19-03-2008 21:31

Zitat:

Original geschrieben von $_Baker
Wenn keine Verbindungskennung bei den Mysql-Funktionen angegeben wird, wird automatisch die letzte genommen.
Ich denke dass darin das Problem besteht.

Genau. Aber wie kann man das unterbinden?

micronax 19-03-2008 21:36

Zitat:

Original geschrieben von Kropff
private?

gruß
peter

Müsste doch auch mit dem von mir verwendeten protected gehen, oder? und das tuts nich^^

$_Baker 19-03-2008 21:41

Die mysqlverbindung von den mysqlfunktionen ist offenbar global gültig.
Eine Option wäre es, PDO zu benutzen

micronax 19-03-2008 21:49

Wenn ich mir die Syntax und Benutzung von PDO anschaue.. *grml* Da bekomm ich gleich eine Abneigung dagegen^^

Gibt's denn keine andere Möglochkeit?

Kropff 19-03-2008 21:53

Zitat:

Die mysqlverbindung von den mysqlfunktionen ist offenbar global gültig.
also entwder reden wir aneinander vorbei oder ich verstehe nur bahnhof. also, ich setze eine variable für die resource:
PHP-Code:

class MySQL
{
  private 
$link;
  ...


dann baue ich die verbindung auf und die resourcen-kennung wird gesetzt:
PHP-Code:

$this->link mysql_connect (...) 

und dann lasse ich abfragen nur mit entsprechender kennung zu:
PHP-Code:

public function doQuery($query)
{
  if (
is_resource ($this -> link))
  {
    
$result mysql_query(...);
  } 

da die variable auf private gesetzt ist, kann die resourcen-kennung nur innerhalb der klasse gesetzt und genutzt werden.

gruß
peter

micronax 19-03-2008 21:56

Jopp, genauso sollte es sein. Man kann diese Resource auch nicht direkt außerhalb der Klasse nutzen. Das Problem ist: Wenn man außerhalb der Klasse ein Query durchführt aber keine spezifische Resource angibt.. wird die letzte verwendet.. und wenn diese eben die der Klasse ist.. kann man diese uneingeschränkt benutzen. -> schlecht..

Kropff 19-03-2008 22:05

und wenn man nach jeden query die verbindung trennt?
PHP-Code:

public function doQuery($query)
{
  if (
is_resource ($this -> link))
  {
    
$result mysql_query(...);
    
mysql_close (this -> link);
  }


Zitat:

Wenn man außerhalb der Klasse ein Query durchführt aber keine spezifische Resource angibt.. wird die letzte verwendet
ich verstehe ehrlich gesagt nicht ganz den sinn. offenbar willst du keine sql-abfragen innerhalb deiner anwendung zulassen, die nicht über deine klasse läuft. richtig?

gruß
peter

micronax 19-03-2008 22:10

Du meinst, die doQuery() soll beim Aufrufen verbinden, den query ausführen und dann wieder closen?

Zitat:

ich verstehe ehrlich gesagt nicht ganz den sinn. offenbar willst du keine sql-abfragen innerhalb deiner anwendung zulassen, die nicht über deine klasse läuft. richtig?
Das wird die Account-Klasse mit sämtlichen Benutzer- und Kundendaten. Nur die Klasse mit ihren Funktionen, die auf Sicherheitslücken getestet ist und nur bestimmte Vorgänge mit bestimmten Rechten ausführen kann, darf Zugriff zu diese Datenbank haben. Sprich es ist ohne das komplexe Password oder sonstige MySQL-Hacks nicht möglich, z.B. per Injection oder sonst was Userdaten auszuspähen oder zu ändern.. Und Sicherheit ist mir sehr wichtig.

lg

Fabian

$_Baker 19-03-2008 22:16

Und wenn du dir eine Klasse erstellst, die PDO "extended" ?//zwecks Übersichtlichkeit

Könnte mir vorstellen, das ein Neuverbinden bei jedem Query sehr... performancelastig ist

micronax 19-03-2008 22:40

Zitat:

Original geschrieben von $_Baker
Und wenn du dir eine Klasse erstellst, die PDO "extended" ?//zwecks Übersichtlichkeit

Könnte mir vorstellen, das ein Neuverbinden bei jedem Query sehr... performancelastig ist

Das könnte gut sein, ja.. Mh... wenn ich mittels PDO zu MySQL verbinde.. wirft mir das Ding vor, das die Treiber fehlen.. Ein Blick in die phpinfo sagt mir, das ich wirklich nur die für sqllite habe.. Also muss ich jetz ma rausfinden, wie ich die nachinstallieren kann..

asp2php 19-03-2008 23:08

Zitat:

Original geschrieben von micronax

Das wird die Account-Klasse mit sämtlichen Benutzer- und Kundendaten. Nur die Klasse mit ihren Funktionen, die auf Sicherheitslücken getestet ist und nur bestimmte Vorgänge mit bestimmten Rechten ausführen kann, darf Zugriff zu diese Datenbank haben. Sprich es ist ohne das komplexe Password oder sonstige MySQL-Hacks nicht möglich, z.B. per Injection oder sonst was Userdaten auszuspähen oder zu ändern.. Und Sicherheit ist mir sehr wichtig.

Hahaha ... ist ja ultra ulkig ... überlege doch mal ... wie kann man angreifen? Über inkomming datas, richtig? Und deine Anwendung behandelt auch inkomming datas, also wo soll denn was sicher sein, wenn du inkomming datas ungeprüft durch lässt ... du schraubst an der falschen Stellen! Das was du machen sollst, ist inkomming datas genau unter der Lupe nehmen bevor du irgendwas damit machst. Was nützt dir denn den Schrott mit der nicht zugreifbaren Verbindungsresource, wenn du doch dann selbst aufbaust, um selbst die User-Eingabe zu verarbeiten ... hahaha ist echt amüsant hier.


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:41 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG