Einiges zum Anmelden und Einloggen

Bjondor
Also für jede Art von Internetseite muss man sich anmelden: BG, Shop, Forum...


Ich suche seit Längerem ein Tutorial für eine richtige usertabelle und ein Loginsscript.

Ich will nicht ienfach ein Loginscript geschickt bekommen, sondern erklärt haben^^

Ein Anmeldeformular hab ich bereits, doch komischerweise weden die Daten nicht in die Tabelle gespeichert, doch dieses Problem wird mir Chris sicherlich noch beheben, da er schon von allem Bescheid weiss...


Also dann, postet doch mal eure Seiten oder ICQ-Nummmern!^^


Meine momentnaen Fragen zu dem Script sind, wie überprüft die Tabelle mit etwa 500 eingetragen Usern, Passwörter und Emails genau den richtigen Namen, also ich weiss zwar durch die ID wird dem User das richtige Passwort zugewiesen, doch wie unterscheidet die Tabelle, bei Logineingabe von Namen Benno, dass sie dann diese Eingabe nicht mit nem anderen Eintrag vergleicht... das versteh ich noch nicht

Wie kann man auch nen Sicherheitscode einbauen?

Wie definiere ich die Sessionlänge?

Wie werden dem Login die richtigen Daten zugewiesen, also wie mach ich das, das dann de User Luca auch wirklich die Daten von Luca ausgegeben werden?

Wie erstelle ich die richtige Usertabelle dafür?

Kann man pro Script den Befehl mysql_querry zweimal senden?





Und nun noch andere Fragen:


Wie gestalte ich ein perfektes Layout?

Wo bekomme ich Bilder her? (Ich will ein BG erstellen, und da jedes BG ein eigenes Standbild und auch andere Bilder, wie Karten, Ressisdarstellungen und solches hat, woher sind die?)




Ich glaube das wärs fürs erste, nun bin ich gespannt!^^

PS: Beispiele sind stets willkommen!
Kai
Das "perfekte Layout" ist Ansichtsache.
Mir gefallen bspw. weiße Seiten mir reinen schwaren Text (Schriftgröße -4, Verdana, Arial, Helvetica, sans-serif), aber damit stehe ich wohl alleine da.
Bilder kannst du zeichnen oder klauen, aber achte auf eventuelle Copyrights.

Nun zum Loginscript:
Du schaust einfach ob ein Eintrag mit dem Namen Benno und den Passwort was eingetipp wurde existiert.
Ich versuche es dir mal zu erklären. Es wird davon ausgegangen das die Tabelle script_user Mit den Inhalt ID (Integer, auto_inc, Primär), Name (Varchar, 20), Passwort (Varchar, 32), Session (Varchar, 255) und IP, (Varchar, 15) existiert.
In Namen steht Benno, in Passwort das Passwort als md5-Chechsum (z. B. e798a07fb0f47a16df0c16c823085210 für PlanetCoding, darüber unten mehr, CaseSensitiv), ID wird sowieso automatisch vergeben und Session/IP kann leer bleiben, der Inhalt wird wärend dem Login abgeändert.

Zuerst brauchen wir natürlich ein Formular:
code:
1:
2:
3:
4:
5:
<form method="post">
<input type="text" name="Name"><br>
<input type="password" name="Pass"><br>
<input type="submit" name="Submit">
</form>


Das ist wohl klar, der Browser zeichnet 2 Textboxen und einen Submit.
Der Form-Tag fasst die 3 Objekte zusammen, und legt die Methode (post) und die Zielseite fest. Da das Attribut "action=""" nicht gesetzt ist, wird die momentane Seite
genommen. Das bedeutet, dass wenn der Submit gedrückt wird der Browser sich selbst zur Zielseite weiterleitet und die Daten per POST sendet.
POST bedeutet, dass die Daten versteckt gesendet werden, anderst als bei GET, wo sowas wie "?threadid=2534" in der Addressleiste steht. Dafür ist POST nicht so einfach verwendbar, sollte aber bei Login plicht sein, da man ja sonst das Passwort in der Addressleiste hat. ^^
Allerdings hat GET eine Begrenzung von 255 Zeichen - (Protokoll+Websiteurl+Variablenamenlänge+Anzahl Variablen * 2)
Mit einem Wort: Die Adressleiste kann nur 255 Zeichen (= 1 Byte) enthalten, damit es gültig bleibt. Ist wohl ein Schutz vor Buffer Overflow oder so.

Gut, weiter gehts. Nun kommt PHP ins Spiel.
Wir müssen jetzt natürlich prüfen, ob der Submit gedrückt wurde. Der Submit enthält zwar kein Value, wird aber trotzdem gesendet. Zusammen mit der Funktion "isset" machen wir uns das zu nutze:

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
if(!isset($HTTP_POST_VARS['Submit']))
{
    ?>
    <form method="post">
    <input type="text" name="Name"><br>
    <input type="password" name="Pass"><br>
    <input type="submit" name="Submit">
    </form>
    <?
}
else
{

}


Isset gibt einen Booleanischen Wert zurück, je nachdem ob die Variable gesetzt wurde.
Das IF überprüft das. Normalerweiße würde die Form nur angezeigt werden wenn die Variable gesetzt wurde. Das Rufzeichnen nach der IF dreht das ganze aber um. d. H. wenn du noch nicht gedrückt hast wird sie angezeigt.
Wenn du es jetzt so ausführst wird vermutlich einfach die Form "verschwinden", da er beim 2. mal die leere else ababreitet, da isset ja true ist.
Statt $HTTP_POST_VARS kannst du auch $_POST verwenden. Ich habe mir es aber so angewöhnt, du kannst es ja machen wie du willst.

Jetzt müssen wir aber natürlich die restlichen POST-Variablen die im Nirvana rumfliegen einfangen und in PHP-Variablen stopfen. Ist zwar nicht nötig, aber ich finde es so gemütlicher einen kurzen Variablennamen als das ganze POST-Ding zu schreiben.

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
if(!isset($HTTP_POST_VARS['Submit']))
{
    ?>
    <form method="post">
    <input type="text" name="Name"><br>
    <input type="password" name="Pass"><br>
    <input type="submit" name="Submit">
    </form>
    <?
}
else
{
    $name $HTTP_POST_VARS['Name'];
    $pass $HTTP_POST_VARS['Pass'];
}


Soda, das ist alles. Damit steht der Inhalt jeweils in seiner Variable. Du könntest darunter z. B. echo $name; schreiben, und könntest so die Variablen wieder ausgeben. (echo $HTTP_POST_VARS['Name']; würde auch gehen, aber wie gesagt...)

Jetzt müssen wir natürlich prüfen ob der User auch tatsächlich die richtigen Daten angegeben hat:

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
if(!isset($HTTP_POST_VARS['Submit']))
{
    ?>
    <form method="post">
    <input type="text" name="Name"><br>
    <input type="password" name="Pass"><br>
    <input type="submit" name="Submit">
    </form>
    <?
}
else
{
    $name $HTTP_POST_VARS['Name'];
    $pass $HTTP_POST_VARS['Pass'];
    $pass md5($pass);

    $sql mysql_query("SELECT ID FROM script_user WHERE Name = '$name' AND Passwort ='$pass' LIMIT 1");
    if(mysql_num_rows($sql) == 1)
    {
        //Hier wird später weiter ausgebaut
    }
    else
    {
        echo "<div align=\"center\">Benutzername/Passwortkombination leider falsch. ._.\"</div>";
    }
}


Also, zuerst wird nun das Passwort per md5() zu einer md5-Checksum gemacht. Bedeutet im klarren das es praktisch "unleserlich" gemacht wird. Die Checksums haben ein Hexadezimales Charset und immer 32 Zeichen. Damit sind sie zwar natürlich niemals einzigartig da es ja beliebig viele Plain-Kombos geben kann, aber Koolisationen sind ziemlich selten.
Dann speichert er die mysql_query in eine Variable SELECT bedeutet das ein Datensatz ausgelesen wird, FROM aus welcher Tabelle. WHERE legt die Bedingungen fest, eben die Daten die drinnenstehen. LIMIT 1 bedeutet das er max. einen Datensatz nimmt. Mehr mit den selben Namen dürfen ja auch nicht auftrehten.
mysql_num_rows schaut wie viele Datensätze er gefunden hat, ist es einer geht es beim Kommentar weiter, sonst wird das echo ausgegeben.
<div ist dabei ein HTML-Tag, align legt die Ausrichtung fest und center sagt ihm das zentriert wird.

Wenn nun tatsächlich Daten stimmen, muss eingeloggt werden. Ich mache immer das jedem User eine 1 Byte-lange ID zugewiesen wird, und zudem noch die IP als vergleich gespeichert wird.

Also:
php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
if(!isset($HTTP_POST_VARS['Submit']))
{
    ?>
    <form method="post">
    <input type="text" name="Name"><br>
    <input type="password" name="Pass"><br>
    <input type="submit" name="Submit">
    </form>
    <?
}
else
{
    $name $HTTP_POST_VARS['Name'];
    $pass $HTTP_POST_VARS['Pass'];
    $pass md5($pass);

    $sql mysql_query("SELECT ID FROM script_user WHERE Name = '$name' AND Passwort ='$pass' LIMIT 1");
    if(mysql_num_rows($sql) == 1)
    {
        for($i 0;$i<255;$i++)
        {
            mt_srand();
            $zufall mt_rand(6590);
            $session.=chr($zufall);
        }
        $ip $_SERVER['REMOTE_ADDR'];
        mysql_query("UPDATE script_user SET Session = '$session' LIMIT 1");
        mysql_query("UPDATE script_user SET IP = '$ip' LIMIT 1");
        setcookie("TheScr1pt"$sessiondate("U") + 3600);
        echo "<div align=\"center\">Erfolgreich eingeloggt.<br><a href=\"index.php\">Hier gehts weiter</a></div>";
    }
    else
    {
        echo "<div align=\"center\">Benutzername/Passwortkombination leider falsch. ._.\"</div>";
    }
}


So, weiter gehts: Zuerst wird wenn jetzt eingeloggt wird eine for gestartet. Das ist eine Simple Schleife mit 3 Parameter: Startanweisung ($i = 0): Wird bei beginn ausgeführt, Durchlaufbedingung ($i<255): Solange es true ist wird die Schleife ausgeführt, und zu guter letzt Durchlaufanweißung ($i++): Was passiert wenn durchgelaufen wird. Erster und letzterer Parameter sind optimal.
Danach wird jedes mal mt_srand(); ausgeführt. Bekanntlich gibt es keine Zufälle, also muss es Daten geben wo die Zufallszahlen heraus generiert werden. z. B. dem TimeStamp. Das übernimmt die Funktion.
Danach kommt mt_rand(65, 90);. Das generiert eine Zufallszahl zwischen 64 und 91 und speichert sie am Ende in die Variable. Dann noch chr($zufall); Das wandelt den ANSI-Code in das dazugehöriges ANSI-Zeichen um und fügt es am Ende der Variable $session dazu. (.=) Das macht er jetzt so lange bis $i größer oder gleich 255 ist.
Danach fragt er die Servervariable REMOTE_ADDR ab und speichert sie in die Variable $ip. Diese enthält logischerweiße immer die IP mit der der Zugriff erfolgt ist.
Diese Daten werden dann mit den alten in der DB ersetzt. Sollte wenn du dir die SELECT oben anschaust selbsterklärent sein.
Dann wird ein Cookie gesetzt. Der erste Parameter legt den Namen fest, der 2. den Inhalt. Der 3. ist optimal und legt die Lifetime fest. Ist er nicht angegeben lebt das Cookielein bis der Browser geschlossen wird, dann mampft ers.
Hier nehme ich den Timestamp (date("U")) und addiere 3600 Sekunden, was ganz grob geschätzt einer Stunde entspricht.
Wichtig hierbei ist das der Cookie-Befehl nur im Header an den Browser gesendet werden kann. Der Header ist das erste was gesendet wird, und deshalb darf keine Textausgabe vor dem Befehl erfolgen.
Als letztes wird ein Link zur Startseite geschrieben und der User ist nach allen Regeln der Kunst eingeloggt.

Als letztes noch eine Seite die prüft ob du eingeloggt bist:

php:
1:
2:
3:
<?php $session $_COOKIE['TheScr1pt'];
if(mysql_num_rows(mysql_query("SELECT ID FROM script_user WHERE Session = '$session' AND IP = '$ip'")) == 0) { die(); }
echo "Eingeloggt"?>


Das sollte mit deinem jetzigen Wissen kein Problem darstellen.
Ich hoffe ich habe das jetzt möglichst Bugfrei und klar hinbekommen. Viel Glück noch.

€: Ups, sorry, daran habe ich jetzt nicht gedacht. Bin mal mitn Tabulator durchgegangen.
Chris Hunter
Danke für deinen Beitrag, aber bitte verwende entweder den code oder php tag für die bessere lesbarkeit. dein /*///*/ habe ich mal nicht rauseditiert, kannst du ja nachholen wenn du magst :-D
Bjondor
also das mit dem cookie versteh ich noch nicht ganz, der rest ist mir eigentlich ziemlich klar, da mir chris auch bereits etwa 5 seiten gecoded hat, nun wird mir schon vieles klar, nur das mit dem cookie... ich dachte, die session soll nach 1 stunde ablaufen und nicht der cookie...



zu den Bildern, wie meinst du zeichnen, lol, ich finde nirgends geeignete Bilder...

Und zu dem Layout, ich meine womit soll ich arbeiten, mit frames, tabellen, oder womit, wie kann ich es am praktischen erstellen, nicht am schönsten, sondern wie kann ich eigentlich alles machen, was man so machen kann, mit frames und tabellen geht es nicht so gut, obwohl ich ei super-beispiel mit frames von nem andere game gesehen habe, vorschläge wären toll!^^
Kai
Wenn der Cookie nach 1 Stunde abläuft ist er ja automatisch ausgeloggt. Du könntest eine neue Spalte festlegen die beim einloggen den Timestamp (date("U");) abspeichert, und bei jeder Seitenaktualisierung oder jeden Login bevor Datenbankänderungen den Timestamp wieder ausließt, (
$sql = mysql_query("SELECT Timestamp FROM script_user");
while($row = mysql_fetch_object(sql))
{
$timestamp = $row->Timestamp;
//Hier den Rest
}
)
und dann date("U") - $timestamp > 3600 prüft. Ist es true löscht er den Inhalt von Timestamp und eventuell IP (welches davon ist ja eigendlich egal.) Allerdings muss er dann natürlich jedes mal bei jeden User durchchecken damit es funst, was langsam werden kann. Ich glaube nicht das es bei einer 255 Zeichen langen Session wichtig wäre automatisch auszuloggen. Und dann kommt ja noch der IP-Schutz dazu.
Bjondor
nunja, bei praktisch jedem game muss man nach einer gewissen zeit (session abgelaufen) den sicherheitscode wieder eingeben oder sich neu einloggen, soll ich das eher nicht einbauen, ich denke eher schon, sonst hätten dies nicht soviele games...


ich verstehe es immernoch nicht, was hat die session mit nem cookie zu tun?

tut mir leid, wenn ich so klinge, als wäre ich vom mond!^^
Chris Hunter
SELECT ID FROM script_user WHERE Name = '$name' AND Passwort ='$pass' LIMIT 1
^^ das istr meiner meinung nach nicht ganz so toll da hier gleich zwei volltext suchen laufen. ich würde nur nach usernamen suchen und das passwort aus dem result heraus vergleichen.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
user nach name selecten
wenn user gefunden
{
  wenn userpw=eingamepw
  {
     einloggen
  }
  else
  {
    passwort falsch
  }
}
else
{
  user falsch
}



Ein weiterer Grund zur bemängelung:
php:
1:
2:
<?php $name $HTTP_POST_VARS['Name'];
$pass $HTTP_POST_VARS['Pass']; ?>


Die userdaten werden im o.g. Beispiel nicht escaped, das sollte unbedingt gemacht werden:
php:
1:
2:
<?php $name mysql_escape_string($HTTP_POST_VARS['Name']);
$pass mysql_escape_string($HTTP_POST_VARS['Pass']); ?>



zudem würde ich echte sessions verwenden mit
session_start
$_SESSION
session_destroy();

Das Timeout kann man über die usertabelle regeln indem man den zeitpunkt des logins festhält und wenn gewünscht noch den letzten zeitpunkt der aktivität. so kann man bei jedem seitenaufruf entweder den inhalt anzeigen oder die session terminieren...
Chris Hunter
Zitat:
Original von Bjondor
Wie kann man auch nen Sicherheitscode einbauen?


Meinst du soetwas?
http://de.wikipedia.org/wiki/Captcha



Zitat:
Original von Bjondor
Kann man pro Script den Befehl mysql_querry zweimal senden?


So oft du willst :-D

Zitat:
Original von Bjondor
Wo bekomme ich Bilder her? (Ich will ein BG erstellen, und da jedes BG ein eigenes Standbild und auch andere Bilder, wie Karten, Ressisdarstellungen und solches hat, woher sind die?)

http://www.renderosity.com
http://de.fotolia.com/
http://visipix.com/
http://www.istockphoto.com/index.php
http://www.sxc.hu/
http://www.photocase.de/
http://www.imageafter.com/
http://www.gimp-savvy.com/PHOTO-ARCHIVE/index.html

Die o.g. Links bieten die gfx z.T. kostenpflichtig an. Zumeist findest du in foto commuities und gfx communities immer jemanden der seine gfx umsonst zur verfügung stellt...
Bjondor
okay, doch nun immernoch wegen dem Layout, womit soll ich arbeiten, um das layout zu gestalten wie man will, also womit kann ich so ziemlich alles machen?
Kai
Ich habe immer in einen WYSIWYG (What you see is what you get)-Editor eine Tabelle gebastelt und dann dort die Bilder plaziert. Mittlerweile kann und mache ich es auch so in Notepad++, kann mir schon in etwa vorstellen wie es am Ende aussieht.
Das ist aber schlecht. Mir ist es egal da ich nur zum Spaß am localhost PHP-Skripte schreibe, das ist auch der Grund warum ich nicht daran gedacht habe mysql_escape_real_string einzusetzen, habe Apache auf einen anderen Port rennen, forwarde ihm nicht usw., die Chance für eine SQL Injection liegt gleich 0.
Man sollte zum Designen divs verwenden. Damit kenne ich mich aber wie gesagt nicht aus, irgendjemand hier hat einen Link zu einen Tutorial in seiner Sig, wollte es mir mal ansehen aber habe dann vergessen wer es ist. Hab schnell mal durch das PHP-Forum geschaut aber auch nichts gefunden.

Wenn ich Bilder mache benutze ich Paint und GimP um Bilder transparent zu machen, habe Probleme die Maus genau zu fahren, deshalb reicht mir Paint, schlechter können meine Bilder eh nicht mehr werden.
Bjondor
also nen grafiker hab ich bereits, der mir gesagt hat, erstmal kostenlos, wenn der aufwand nich allzu gross wird, er wird mir bilder machen, doch noch immer das layout, chris, du sagtest mir, du könntest mir mal ien beispiel schicken, die war aber von ein paar wochen, wenn das angebot noch gilt...



wenn nicht, werde ich wahrscheinlich mit frames arbeiten, die in Tabelle unterteil sind, wenn ihr nicht wisst, schaut hie rmal nach:


www.piratenschlacht.de

dort sind es frames, und jeder link, den man aktiviert aktualisiert nicht die ganze seite, sondern nur den hauptframe in der mitte, ich finde das recht gut, allerdings bitte noch immer bei mir melden bei vorschlägen und anderem!
Kai
Sowas sollte man meines Wissen überhaupt nicht machen, hab mal gehört dass das noch schlimmer als mit Tabellen ist. Ist mir selbst auch zu unübersichtlich.
Du könntest sowas aber mit Ajax realisieren. Ist ganz einfach, wenn du willst kann ich dir ein Beispiel senden. Dabei musst du dann nur max 2 Zeilen ändern, wenn du keine GET/Post-Variablen verwendest nur eine, und das ist logischer weiße die Zieladdresse. Du erstellst damit ein XML-HTTP-Objekt und lässt eine PHP-Datei am Server parsern, empfängst den Inhalt und lässt ihm in einen Tag der Hauptseite schreiben, ohne das die ganze Seite aktualisiert werden muss.
Ein Nachteil ist, dass es nur funktioniert wenn JavaScript aktiviert ist, aber da man heutzutage eh wieder relativ oft auf Seiten die es benötigen trifft, sollte das kein gröberes Problem dastellen.
Bjondor
nunja ehrlich gesagt bin ich davon nicht so überzeugt, da es mir nicht darum geht, wenig zu aktualisieren, sondern, wie ich praktisch anzeigefelder erstelle und genau dahin platzieren kann, wo ich will, also z.b. rechts oben ein anmeldeformular, gleich links etwas kleiner ein bild, darunter gross geschrieben: ich bin schön und links dann noch 3 felder und so weiter, einfach das ich meinen wünschen nachgehen kann und nicht von etwas behindert werde...



schick mal ein beispiel, dann wird mir sicherlich mehr klar!^^
Kai
Hier:

http://lol4me.lima-city.de/bjondor/index.php
Läuft leider ein wenig langsam weil der Space ein bischen lahm ist.
Setzt aber natürlich auf Tabellen da ich ja nichts anderes richtig kann. Ich denke aber sowieso das es für Anfänger am einfachsten ist.

Der Source:

http://lol4me.lima-city.de/bjondor/index.txt
http://lol4me.lima-city.de/bjondor/seite1.txt
http://lol4me.lima-city.de/bjondor/seite2.txt

Liegt alles im selben Directory.
Bjondor
komisch, bei mir kommt immer fehlermeldung, also als ob es diese seite nicht gibt, komisch, kann ich wirklich darauf zugreifen?
Chris Hunter
Zitat:
Original von Kai
Sowas sollte man meines Wissen überhaupt nicht machen, hab mal gehört dass das noch schlimmer als mit Tabellen ist. Ist mir selbst auch zu unübersichtlich.
Du könntest sowas aber mit Ajax realisieren. Ist ganz einfach, wenn du willst kann ich dir ein Beispiel senden. Dabei musst du dann nur max 2 Zeilen ändern, wenn du keine GET/Post-Variablen verwendest nur eine, und das ist logischer weiße die Zieladdresse. Du erstellst damit ein XML-HTTP-Objekt und lässt eine PHP-Datei am Server parsern, empfängst den Inhalt und lässt ihm in einen Tag der Hauptseite schreiben, ohne das die ganze Seite aktualisiert werden muss.
Ein Nachteil ist, dass es nur funktioniert wenn JavaScript aktiviert ist, aber da man heutzutage eh wieder relativ oft auf Seiten die es benötigen trifft, sollte das kein gröberes Problem dastellen.


das is6 richtig. viel zu viel stress sich darum zu kümmern alle frameinhalte zu aktualisieren. du könntest es so machen wenn alle anderen seiten außer dem hauptframe statisch sind. aber das wird wohl kaum der fall sein...
AJAX ist eine lösung aber brfingt nur unnötige querys. Bei einem Browsergame erfolgen viele Seitenaufrufe. Warum den SQL-Server unnötig mit querys belasten?!?

Ich empfehle entweder ein Design basierend auf DIVs oder halt mit Tabellen. Ich bin halt n echter fan von Tabellen :-D
Bjondor
nunja, dann werde ich versuchen, es mit Tabellen hinzukriegen!^^
aber noch ne frage, in einiges games wird, um platz zu sparen oft nur ein link: Hafen stehen, und wenn du dann mit dem cursor drüberfährst erscheinen alle unteseiten davon und kann die so besuchen, mit wenig platz, wie krieg ich das hin?

ich glaub, ich verwende es eher nicht, interessiert mich aber trotzdem!^^
Kai
Das ist ein Drop-Down-Menü.
http://www.javarea.de/index.php3?opencat...vigation&id=113
Denke daran das wenn man auf "Hafen" klickt man zu einer Seite kommt die auf die anderen Seiten im Menü verweist, falls User JS deaktiviert haben.
Chris Hunter
javascript kannste zum spielen eines browsergames sowieso nicht deaktivieren.

schau dir doch mal an wie wir bei HTW das menu "verborgene elemente" umgesetzt haben, das sollte von nutzen sein.