Beiträge von Afrael

    Hab mit Firebug debuggt und danach das HTML validiert (man merkt, ich hab nix zu tun :roll:)


    Dein Hauptfehler war, dass du ein Minus im Attribut verwendet hast und dass du die Klammern bei toUpperCase vergessen hattest. Und höchstwahrscheinlich ist die Lösung von synaptic besser, hab sie mir nicht ausführlich angeguckt.

    Habs im Anhang nochmal hochgeladen. Weiß allerdings nicht, welche PHP-Version bei dir läuft, evtl hast du schon PHP 5 und brauchst die andere.

    Erstelle mal eine Datei obscure_info.php, gib da folgendes ein
    <?php phpinfo(); ?>
    lad sie auf deinem Webspace hoch und guck sie dir im Browser an. Da steht dann deine PHP-Version.

    1. @ vor einer Funktion zu schreiben unterdrückt Fehlermeldungen, die von der Funktion selber ausgeworfen werden.

    2. Das ist richtig. Diese Zeichen können benutzt werden, um eine SQL-Injektion durchzuführen.
    [Einschub: Würde die Query einfach 'SELECT `username`, `email` FROM `table` WHERE `id` = $id' ohne einfache Anführungsstriche um $id lauten, kämen wir als Angreifer sogar ohne diese Zeichen aus.]

    Da wir die $_GET['id'] bereits nach Integer, also in eine Ganzzahl, konvertiert haben, ist mysql_real_escape_string an dieser Stelle sogar überflüssig. Allerdings sollte es für $username bzw $email verwendet werden.

    verstehs net, gib doch der spalte anzahl einfach den standart wert 0, dann hat die spalte auch immer 0 wenn es keine besucher gibt


    mfg

    Das ist für die Zukunft sinvoll, hilft ihm aber rückwirkend nicht.

    Ich verstehe ehrlich gesagt nicht, warum die Leute Datetime benutzen. Mit unix-timestamps lässt es sich doch viel einfacher rechnen, oder nicht? In diesem Fall könnte man dann in der Ausgabeschleife prüfen, ob zwei aufeinanderfolgende Einträge z.B. mehr als 25 Stunden auseinanderliegen. Dann wüsste man, wo Tage fehlen.

    ja dann halt nicht ich gebe doch net 500 € aus


    Gern geschehen.

    Es ist nicht absolut ausgeschlossen, dass du einen Anfänger findest, der das für lau macht, um später Referenzen vorweisen zu können, aber entsprechend wird die Qualität ausfallen. Mit sehr viel Glück findest du einen Nicht-Anfänger, der es für gratis macht.

    Sorry, ich kenn zwar die Preise kaum, aber ich bin mir ziemlich sicher, dass du mit 100 € für alles, was du brauchst, nicht auskommst. Außerdem vermute ich stark, dass du gar keine richtige Backend-Programmierung hast, und die ist wichtiger als der HTML/CSS-Kram. Ich hab für dich aber mal deine Beschreibung Korrektur gelesen, viel Erfolg noch.

    Zitat

    Eines Tages im Königreich Neaplis verschwand der König Amirus urplötzlich. Kein Mensch wusste, wohin er verschwunden war, und ob er noch lebte. Luzius, der nächste in der Thronfolge von Neaplis, übernahm den Platz von Amirus. Er hatte den Gedanken verworfen, dass dieser jemals wieder zurückkehren konnte. Luzius riss die komplette Macht an sich und machte es sich zu seiner Aufgabe, das damals schöne und friedsame Neaplis zu verändern. In wenigen Monaten bestand das gesamte Königreich aus einer Sklavenkammer, in der Folter und Vollstreckung an der Tagesordnung war. Nur das Wort des Königs zählte. Es war das absolute Gesetz! Wer sich nicht daran hielt, wurde bestraft.


    Ab hier würde ich Präsens nehmen, um den Leser miteinzubeziehen, ihm den Eindruck zu geben, ins Geschehen eingreifen zu können.

    Zitat

    Nun ist schon fast eine halbes Jahrhundert vergangen, und die dunkle Herrschaft Luzius nimmt kein Ende. Es regieren Leid, Trauer und Elend. Das Volk hofft auf Rettung. Nördlich im Lande des Königreiches werden Aufstände zerschlagen. Aber im Osten des Königreiches gibt es eine Legende. Ein Held soll geboren werden - um das Urteil des bösen zu richten, und um das Unheil zu bekämpfen, sodass das Königreich Neaplis einst wieder erblühen kann, so wie es einmal war, als alle noch in Frieden und ohne Leid lebten.
    Und so lautet die Legende im Osten des Königreiches. Ein kleines Dorf ganz unscheinbar, es heißt Ortuna. Dort wird eines Tages ein Abenteurer geboren...
    Viele Abenteurer haben ihr Glück gesucht. Nicht wenigen wird ihr Mut zum Verhängnis werden.

    @TehU: Der Threadersteller scheint den Alert für eine Art Validierung zu benutzen. Ich meinte, er soll sich nicht darauf verlassen, dass der Benutzer Javascript an hat, sondern auch noch irgendwie anders (PHP?) validieren.
    Und Standardwert von display ist display, das weiß ich zufällig :)

    Danke für eure Antworten ;)

    EDIT:
    Achso, wie bekomm ich das hin dass die Tabelle in einer zufälligen Reihenfolge ausgelesen wird?
    Finde keinen Befehl dafür...

    Gruss, Donkey

    SELECT banner, site FROM rotator ORDER BY RAND()
    Es ist evtl sinnvoll, nur eine bestimmte Anzahl von Bannern auf einmal auszugeben. Das erreichst du mit LIMIT maximale_anzahl. Beispiel:

    SQL
    SELECT banner, site FROM rotator ORDER BY RAND() LIMIT 5


    wählt fünf zufällige Einträge.

    Obwohl auf meinen Thread keine Antwort kam, denke ich, dass doch trotzdem (vor allem bei Anfängern) Bedarf besteht. Aus diesem Grund hab ich diesen Beitrag vorbereitet.

    Wenn es um die Sicherung von Webseiten geht, sollte man grundsätzlich von einer Annahme ausgehen:

    Der Benutzer ist böse. Wo er Daten eingeben kann, wird er versuchen, eine Lücke zu entdecken.

    Man sollte sich niemals darauf verlassen, dass der Benutzer nicht weiß, wie man Sicherheitslücken ausnutzt, deswegen lässt man diese am besten gar nicht entstehen. Hier will ich ein paar der häufigsten Probleme beleuchten.

    Inhaltsverzeichnis

    • register_globals/import_request_variables()
    • XSS/CSRF
    • SQL Injection
    • Remote/Local File Inclusion
    • eval(), Systembefehle, SSI (Server Side Includes)
    • Ungehashte Passwörter
    • Allgemeines


    1. register_globals/import_request_variables()
    Die Server-Einstellung register_globals erlaubt es, in Formularen oder per URL übergebene Werte direkt im Script zu verwenden. Ein Wert, der z.B. in der URL http://example.com/index.php?id=4 id heißt, wäre im Script direkt als $id verfügbar.
    Was passiert nun aber, wenn wir folgendes Script admin.php haben?

    und ein Angreifer die URL http://example.com/admin.php?admin=1 aufruft? Dann wird der Wert von admin in $admin reingeschrieben und der Benutzer hat freien Zugriff auf die Adminoberfläche. Man sollte deswegen register_globals auf dem Server deaktivieren. Die Zeile

    PHP
    <?php ini_set("register_globals", "0"); ?>


    sollte in jedes Script ganz oben eingesetzt werden, wenn register_globals an ist. Dies kann mit phpinfo() überprüft werden.

    Ein ähnliches Verhalten wie register_globals ermöglicht die Funktion import_request_variables(). Aus den gleichen Gründen wie register_globals sollte man sie nicht verwenden.

    2. XSS/CSRF
    Die Idee beim Cross-Site Scripting (XSS) ist, den Benutzer bösartigen Javascript-Code ausführen zu lassen, der im schlimmsten Fall seine Cookies klaut. Ich weiß nicht, inwiefern ich hier das genaue Vorgehen erklären darf, deshalb lass ich es lieber.
    Der Angreifer will ein <script> Tag einbringen, das auf Userseite ausgeführt wird. Das trivialste Beispiel wäre folgendes Fehlerscript error.php:

    PHP
    <?php
    $message = $_GET['message'];
    echo "Es gab einen Fehler! Der Fehler war: ". $message;
    ?>


    Der Programmierer hat ein anderes Script erstellt,
    das im Fehlerfalle auf error.php?message=Fehlende%20Rechte umleitet. error.php gibt erwartungsgemäß

    Zitat

    Fehlende Rechte


    aus. Was ist nun, wenn ein Angreifer einen Link zu
    error.php?message=<script>alert('xss')</script> vorbereitet und an seine Opfer verschickt? Dann ist die Ausgabe

    Zitat

    <script>alert('xss')</script>


    Das Javascript wird auf der Seite des Users ausgeführt.
    CSRF (Cross-Site Request Forgery) kann unter Umständen mit XSS kombiniert sein. Das Ziel ist zum Beispiel, einen Admin eine bestimmte Aktion ausführen zu lassen, indem dieser einen Link anklickt.

    3. SQL Injection

    The User hat in seinem Lexikon-Eintrag schon ziemlich alles, was man als Entwickler wissen sollte, aufgeführt.
    Es wäre noch zu erwähnen, dass eine SQL-Injektion auch möglich ist, wenn man vom Benutzer eine Eingabe für ORDER BY erwartet, wie in diesem Beispiel:

    PHP
    //topliste ausgeben
    $sql="SELECT username, level, ruhm, gold FROM usertable ORDER BY $order DESC LIMIT 50"


    Man sollte deshalb prüfen, ob $order in der Liste der auszuwählenden Felder ist.

    Zusätzliche Informationen würden nur darüber gehen, wie man SQL Injections ausführt, und das gehört hier nicht hin ;)

    4. Remote/Local File Inclusion
    Die Kurzfassung ist: Man sollte keine Dateien inkludieren oder ihre Inhalte ausgeben, wenn der Benutzer einen Teil des Pfads selber übergeben kann. So wäre es einem Angreifer zum Beispiel möglich, Dateien, die auf seinem Webspace liegen, einzubinden, oder Inhalte von Dateien, die auf dem Server liegen (.htaccess und ähnliches) auszulesen.

    5. Man sollte fast absolut nie Benutzereingaben in solche Befehle wie eval(), system() oder sonstige einfügen, da dies immer ein Sicherheitsrisiko darstellt. Auch Server Side Includes, wenn man denn welche verwendet, sollten keine Benutzereingaben direkt verwenden.

    6. Siehe: Hashing.

    7. Allgemeines
    Zu beachten ist, dass diese möglichen Sicherheitslücken untereinander kombiniert werden könnten. So könnte zum Beispiel ein Angreifer in mySQL zuerst einen Fehler erzeugen und wenn ihm dann seine fehlerhafte Query ausgegeben wird, XSS einschmuggeln.
    Außerdem gelten die Hinweise hier sowohl für Daten, die über GET, also über die URL übergeben werden, als auch über POST. Ein Angriff über letzteres ist zwar meist kompliziert, aber definitiv nicht unmöglich.
    Manche neueren Webseiten verwenden URLs wie http://example.com/users/Afrael. Intern wird dabei das Script http://example.com/user.php?username=Afrael aufgerufen. Auch hier könnte man die beschriebenen Methoden anwenden, die URLs stellen also keine Sicherheitsmaßnahme, sondern allenfalls eine Bequemlichkeit für den User dar.
    Zuletzt ist noch von der Ausgabe von $_SERVER['PHP_SELF'] im Script abzuraten. Wird die URL nämlich manipuliert, ist XSS möglich.

    Anmerkungen, Ergänzungen usw bitte hier rein.

    Edit 1: Eine weitere Möglichkeit der Validierung, die ich vergessen habe zu erwähnen, sind Reguläre Ausdrücke. Wer sich darüber informieren will, kann im Internet nach RegExp oder regular expressions suchen. Zu beachten ist jedoch, dass diese meistens relativ langsam ausgeführt werden.

    Code
    document.getElementById('id_deines_divs').style.display='none';

    setzt das div auf unsichtbar.

    Hast du dich denn auch für den Fall abgesichert, dass der Benutzer Javascript aus hat?