PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MySQL db per WWW erstellen?



Stormsam
31-10-2002, 14:35
Hi @ all!

ich hab da so ein kleines Problem:
Ich möchte, das man eine Datenbank + User und den nötigen Rechte über den Browser erstellen kann, ohne, das man ein Passwort benötigt.

Dies stell ich mir so vor:
Man geht auf http://meineip/mysql.php und gibt Usernamen und Passwort ein, dannach erstellt er eine Datenbank mit dem Usernamen und einen User mit dem usernamen mit dem jeweiligen Passwort.

Wie würde das in shell + php aussehen?
Könnte mir vielleicht jemand damit helfen ;)

MfG
Stormsam

Berufspenner
04-11-2002, 20:00
Hi

Ich weis ja nicht aber wäre da phpMyAdmin nicht das richtige?
http://www.phpwizard.net/projects/phpMyAdmin/

Cu

Stormsam
04-11-2002, 20:05
Hi!

Bei phpMyAdmin mußte ich jedem User root Rechte geben, damit jeder über den browser Datenbänke, User und Rechte angeben kann.
Dann könnte ja jeder selber bestimmen, was er sich für Rechte gibt etc...

Ich habe mir einen php + shell script vorgestellt, der nur nach Username und Passwort fragt und der erstellt dann mit dem usernamen eine datenbank und einen User. Die rechte gibt er ebenfalls automatisch, die müßte man dann irgendwie mit einbauen.

Weiß einer, wie soetwas aussehen würde ?!?

MfG
Stormsam

Gaert
04-11-2002, 22:32
Was willst du da mit nem Shell Skript???

Warum machst du nicht alles mit PHP???

Du connectest mit mysql_connect() mit einem User, der Zugriff auf die Datenbank "mysql" hat und erstellst einfach den neuen User in der Tabelle "user"... wo is das Problem?

Im übrigen is das das falsche Forum... wäre der Thread im PHP Forum gewesen hätt ich ihn schon lange gesehn! ;)

Das PHP Skript sieht so, oder so ähnlich aus:



$server_id=mysql_connect("localhost", "rootuser", "passwort");
mysql_select_db("mysql",$server_id);
$recid=mysql_query("INSERT INTO user SET host='localhost', user='neueruser' password=PASSWORD('neuespasswort')");


Natürlich musst du in dem INSERT Query noch die richtigen berechtigungen setzen...
schau einfach mal in die "user" tabelle, damit du siehst was möglich ist...
In diesem Zustand hat der User dann noch die möglichkeit auf alle Datenbanken zu connecten...
Das solltest du auch noch mit nem Query einschränken!

MfG

Gaert

PS: Falls du noch nicht so die erfahrung mit PHP hast, erstmal ein bissl in die Manual gucken und dir die mysql Funktionen reinziehen http://php.net/mysql

elrond
05-11-2002, 06:48
die einträge werden übrigens erst nach einem flush PRIVILEGES in der db wirksam -> s. DB-Forum

Gaert
05-11-2002, 07:57
Stimmt... aber das kann man ja z.B. mit einem Cron Job erledigen!
So kommt man dann auch um die Elende "Befehlsaufruferei mit PHP" rum...

elrond
05-11-2002, 08:55
geht das nicht einfach mit mysql_query("flush ...") ??

ich hab's noch nicht gebraucht, aber ich glaube der MyPHPAdmin arbeitet einfach so...

Gaert
05-11-2002, 13:15
Stimmt!

Schätze wenn du der User reload_priv auf 'Y' hat, dann darf er das wohl!

Stormsam
05-11-2002, 15:24
Hi!

ok, ich bin nicht so der php experte, deswegen wäre ich froh, wenn ihr mir damit ein wenig helft :D

Also die Rechte auf der jeweiligen Datenbank sollten sein, also nur auf der Datenbank des Users (nicht den mysql.user):
SELECT,INSERT, DELETE,UPDATE,CREATE,ALTER, DROP

sieht das dann so aus? :


$server_id=mysql_connect("localhost", "rootuser", "passwort");
mysql_select_db("mysql",$server_id);
$recid=mysql_query("INSERT INTO user SELECT,INSERT, DELETE,UPDATE,CREATE,ALTER, DROP SET host='localhost', user='neueruser' password=PASSWORD('neuespasswort')");


Dann muss man ja noch die Daten auf der php seite angeben können, wie sieht das aus?
<form action="<?=$PHP_SELF?>">
<input type="hidden" name="send" value="1">
<input type="hidden" name="uid">
Username: <input type="text" name="neueruser" value="<?=$neueuser?>"> (nur Buchstaben)<br>
PWD1 <input type="password" name="pwd1" value="<?=$password?>"><br>

EMAIL <input type="text" name="email" value="<?=$email?>"><br>
<br>
<input type="submit" value="Senden"><br>

</form>

Wie würde das zusammen aussehen?
Und was muss ich noch zusätzlich dafür einstellen? (mysql_query("flush ...") ; reload_priv auf 'Y' ; flush PRIVILEGES ) ???

Würde mich über eine antwort freuen ;)

MfG
Stormsam

Gaert
05-11-2002, 22:35
AUA!!!


$recid=mysql_query("INSERT INTO user SELECT,INSERT, DELETE,UPDATE,CREATE,ALTER, DROP SET host='localhost', user='neueruser' password=PASSWORD('neuespasswort')");

Das sieht ja höllisch aus!

OK... basteln wir erstmal das Statement richtig:



$recid=mysql_query("INSERT INTO user SET
host='localhost',
user='neueruser',
password=PASSWORD('neuespasswort'),
select_priv='Y',
insert_priv='Y',
delete_priv='Y',
update_priv='Y',
create_priv='Y',
alter_priv='Y',
drop_priv='Y' ");


Dein Skript sollte dann so aussehen (quick hack - ungetestet) ;) :



<?php
if ($_POST['send'])
{
$server_id=mysql_connect("localhost", "rootuser", "passwort");
mysql_select_db("mysql",$server_id);

$recid=mysql_query("INSERT INTO user SET
host='localhost',
user='$_POST[neueruser]',
password=PASSWORD('$_POST[pwd1]'),
select_priv='Y',
insert_priv='Y',
delete_priv='Y',
update_priv='Y',
create_priv='Y',
alter_priv='Y',
drop_priv='Y' ");

$recid=mysql_query("FLUSH PRIVILEGES");
die("User wurde angelegt!");
}
?>
<form action="<?php $_SERVER['PHP_SELF']?>">
<input type="hidden" name="send" value="1">
<input type="hidden" name="uid">
Username:
<input type="text" name="neueruser" value=""> (nur Buchstaben)<br>
PWD1
<input type="password" name="pwd1" value=""><br>
<input type="submit" value="Senden">
</form>


Der User hat dann Zugriff auf alle Datenbanken und darf dort
SELECT,INSERT, DELETE,UPDATE,CREATE,ALTER, DROP ausführen.

Du kannst bei MySQL die Rechte des Users vielfach einschränken... zu erläutern wie würde den Rahmen sprengen, aber du solltest dir auf jeden Fall das hier durchlesen:

http://www.mysql.com/documentation/mysql/bychapter/manual_MySQL_Database_Administration.html#User_Acc ount_Management

Von wem hast du denn eigentlich den <? =$variable ?> mist?

Stormsam
06-11-2002, 15:43
hallo Gaert,

ich weiß schon wie man mit phpMyAdmin oder die Konsole die rechte einschränkt!
Doch bei diesem Code weiß ich paar Einzelheiten nicht!
Ich hab jetzt die Rechte auf alle Datenbanken auf "N" gesetzt, also:

$recid=mysql_query("INSERT INTO user SET
host='localhost',
user='neueruser',
password=PASSWORD('neuespasswort'),
select_priv='N',
insert_priv='N',
delete_priv='N',
update_priv='N',
create_priv='N',
alter_priv='N',
drop_priv='N' ");

So ist das jetzt richtig!
Doch nun haben die User KEINE Rechte! Um die Rechte auf ihre Datenbank einzustellen, muss man ja erstmal in die mysql.db wechseln! Dort können die User dann alle Rechte haben!
Also wenn ich das mit phpMyAdmin mache in der db-tabelle, sieht der code so aus:

$sql = 'INSERT INTO `db` (`Host`, `Db`, `User`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`, `Drop_priv`, `Grant_priv`, `References_priv`, `Index_priv`, `Alter_priv`) VALUES (\'localhost\', \'username\', \'datenbank\', \'Y\', \'Y\', \'Y\', \'Y\', \'Y\', \'Y\', \'Y\', \'Y\', \'Y\', \'Y\');';

Diese gibt phpMyAdmin bei Erstellung eines Users mit dem Namen "username" und der datenbank "datenbank" !
Doch wie binde ich diesen php-code jetzt in meinen ein?
Weil bei phpMyAdmin bin ich ja schon in der "db"-tabelle drin, bei meinem script müsst ich da nicht erst sagen, dass ich da rein will?
Ich bräuchte wie gesagt noch eine kleine Hilfe!
Wäre dir sehr dankbar!

MfG

Stormsam

Gaert
06-11-2002, 19:55
OK es waren ein paar kleinere Fehler im Skript (wie bei nem quick hack üblich)
Hier jetzt die korrigierte Version:



<?php
if ($_POST['send'])
{
$server_id=mysql_connect("localhost", "rootuser", "rootpassword");
mysql_select_db("mysql",$server_id);

$recid=mysql_query("CREATE DATABASE $_POST[neueruser]") or die(mysql_error($server_id));


$recid=mysql_query("INSERT INTO user SET
host='localhost',
user='$_POST[neueruser]',
password=PASSWORD('$_POST[pwd1]')") or die(mysql_error($server_id));

$recid=mysql_query("INSERT INTO db SET
host='localhost',
db='solutsys',
user='$_POST[neueruser]',
select_priv='Y',
insert_priv='Y',
delete_priv='Y',
update_priv='Y',
create_priv='Y',
alter_priv='Y',
drop_priv='Y' ") or die(mysql_error($server_id));

$recid=mysql_query("FLUSH PRIVILEGES") or die(mysql_error($server_id));
die("User wurde angelegt!");
}
?>
<form name="formular" action="<?php echo $_SERVER['PHP_SELF']?> method="post">
<input type="hidden" name="send" value="1">
Username:
<input type="text" name="neueruser" value=""><br>
Passwort:
<input type="password" name="pwd1" value=""><br>
<input type="submit" value="Senden">
</form>

Stormsam
06-11-2002, 20:06
Hi,
danke für den Script .. allerdings funktioniert er bei mir irgendwie nicht so richtig...
Es passiert einfach nichts, wenn man über diesen Script einen User anlegen möchte.

Ich hoffe du entdeckst den Fehler :D
MfG
Stormsam

Gaert
06-11-2002, 23:03
Ich habe das Skript oben nochmal kurz überarbeitet... es funktioniert definitiv!

Wenn überhaupt nichts passiert, dann schau bitte mal nach was in der erzeugten Seite als action im <form> Tag steht... wenn da nichts ist, dann solltest du deine PHP Version updaten weil du warscheinlich eine Version < 4.10 benutzt!
Ansonsten wäre es gut wenn du sagen könntest was nicht funktioniert...
Diese Version des Skripts gibt zu jeder SQL Aktion eine Fehlermeldung aus, wenn was schiefläuft!

Stormsam
07-11-2002, 07:16
Hi!
Das Problem ist ja ... es passiert gar nichts ;)
Man gibt daten an, klickt auf senden und er löscht die daten wieder, ohne das sich irgendetwas ändert (Z.b. die URL) es kommen auch keine Fehlermeldungen.

Ich wei jetzt gar nicht meine aktuelle Version von php ... habe erst neulich das mod_php4 von der SuSE Linux 7.3 CD aus installiert. Ich schätzte es ist nicht die aktuellste.

Ich werde heute abend mal schauen, ob es an meinem PHP liegt, wenn ja versuche ich es zu updaten ;)

MfG
Stormsam

Gaert
07-11-2002, 08:11
Dann ist es tatsächlich die PHP Version (ich schätze du hast 4.06)!

Alle PHP Versionen < 4.10 unterstützen die Superglobalen Arrays wie $_SERVER oder $_POST nicht!

In den alten Versionen musst du anstatt $_SERVER['PHP_SELF'] nur $PHP_SELF schreiben, und anstatt z.B. $_POST['variablenname'] nur $variablenname.

Aber du solltest generell die PHP Version updaten, da es in den alten Versionen große Sicherheitslücken gibt!!!

PS: um deine PHP Version herauszufinden erstelle ein skript mit dem Inhalt

<?php phpinfo(); ?>

Stormsam
07-11-2002, 14:07
Hi!
Ich habe jetzt geschaut, was für eine Version ich habe, ich habe wirklich 4.0.6.
Ich habe php noch nicht geupdatet, habe ersteinmal versucht es auf dieser Version laufen zu lassen. Ich habe alles so umgestellt, wie du es gesagt hattest und das script noch einmal gestartet.
Ich habe Versucht einen User anzulegen und dann kommen folgende mysql fehler:



Warning: Access denied for user: 'rootuser@localhost' (Using password: YES) in /usr/local/httpd/htdocs/admin/mysql3.php on line 4

Warning: MySQL Connection Failed: Access denied for user: 'rootuser@localhost' (Using password: YES) in /usr/local/httpd/htdocs/admin/mysql3.php on line 4

Warning: Supplied argument is not a valid MySQL-Link resource in /usr/local/httpd/htdocs/admin/mysql3.php on line 5

Warning: Supplied argument is not a valid MySQL-Link resource in /usr/local/httpd/htdocs/admin/mysql3.php on line 11

Warning: Supplied argument is not a valid MySQL-Link resource in /usr/local/httpd/htdocs/admin/mysql3.php on line 13

Warning: Supplied argument is not a valid MySQL-Link resource in /usr/local/httpd/htdocs/admin/mysql3.php on line 24

Warning: Supplied argument is not a valid MySQL-Link resource in /usr/local/httpd/htdocs/admin/mysql3.php on line 25
User wurde angelegt!


Muss ich jetzt updaten, oder liegt das an etwas anderem?
MfG
Stormsam

Stormsam
07-11-2002, 15:33
ups .. hab den fehler entdeckt :D
Jetzt funktioniert es.
DANKE für den Script!
Beim installieren von php4.2.3 kommt immer ein Fehler. Irgendwie kann ich das nicht installieren.
Es kommt immer irgendwie:
lex output error

nachdem ich ./configure eingebe
Aber das gehört ja eigentlich nicht mehr ins mrunix forum ;)

MfG
Stormsam

jwebworks
14-11-2002, 07:49
Hi, ppl,

unter phpMyAdmin kann man Benutzer erstellen, die
wenig Rechte haben. Man kann ich sogar als dieser Benutzer
anmelden und stellt fest: "Ah, da sind ja nur die Tabellen, Spalten und Zeilen (!!), auf die ich rechte habe."

Ein Benutzer, der nur Benutzer erstellen kann, hat einfach das GRANT Recht.

Dann:

Die Benutzer über ein Insert-Statement direkt in den MySQL-Datenbanken anzulegen ist veraltet und kann sich von Version zu Version ändern.

Richtig wäre es, den GRANT-Sql-Befehl zu nutzen:
http://www.mysql.com/doc/en/GRANT.html
diese Befehl ist glaube ich auch im SQL-Standard vorgeschrieben. Der Vorteil: Datenbanken lassen sich schneller auf andere (falls man es braucht) umschreiben.

cu, stop.h

Gaert
14-11-2002, 12:57
Wenn du dir alles durchlesen würdest, dann hättest du bestimmt schon entdeckt, daß PHPMyAdmin in diesem Thread ausgeschlossen werden muss, da es sich um eine "Automatische User Anlege" Geschichte handelt!

Nichtsdestotrotz stimmt das mit dem GRANT befehl natürlich... allerdings ist eine Portierung auf andere DBMS in diesem Fall denke ich ausgeschlossen und die User per Insert anzulegen hat bei MySQL immer funktioniert und funktioniert meines wissens in der 4.X Version auch noch.