kostenloser Webspace werbefrei: lima-city


Soziales Netzwerk kein Profilbild vorhanden

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    theherobone

    theherobone hat kostenlosen Webspace.

    Hi!
    Ich bin gerade dabei mein eigenes Soziales Netzwerk zu bauen.
    Jedoch bin ich auf ein Problem gestoßen, nämlich wenn ein Benutzer kein Profilbild hochgeladen hat, wird dort der leere Rahmen angezeigt. Könnte mir jmd helfen wie ich erweitern könnte dass wenn kein PB da ist das Ersatz-Bild angezeigt wird?

    Hier der code:
    <?php
    include_once 'includes/db_connect.php';
    include_once 'includes/functions.php';
    
    sec_session_start();
    ?>

    ...
    <?php
                if ($mysqli->connect_error) {
                    die("Connection failed: " . $mysqli->connect_error);
                }
                $me = htmlentities($_SESSION['username']);
                $sql = "SELECT username, email, info, status FROM members WHERE username = '$me'";
                $result = $mysqli->query($sql);
                $row = $result->fetch_assoc();
     ?>

    ...
    <img src="user_media/<?php echo $me; ?>.png" class="w3-circle" style="height:106px;width:106px" alt="Avatar">


    Falls ihr Ideen habt oder was wissen müsst einfach antworten!
    Denke
    LG Herobone
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. g****e

    Du könntest, statt das $me direkt einzusetzen, es vorher prüfen. Dafür bietet sich der Tenäre Operator und die empty Funktion an:
    empty($me) ? 'default.jpg' : $me;


    Wäre eine Möglichkeit

    Liebe Grüße
  4. So wie Du das aktuell aufgebaut hast, könntest Du z.B. mit der PHP Funktion file_exists überprüfen, ob die Datei $me.png überhaupt existiert und ansonsten ein Standardbild anzeigen.
    Generell musst Du natürlich aufpassen, dass $me keine "bösen" Zeichen enthält, z.B. wenn da sowas wie "../../" drinnen stehen darf, könnte ein Angreifer so evtl. herausfinden ob bestimmte Dateien existieren.

    Eine andere Option wäre den Pfad zum Profilbild mit in der Datenbank zu speichern und da einen Standardwert zu vergeben, sodass ein bestimmtes Bild angezeigt wird, bis der Nutzer ein eigenes hochlädt und dann natürlich der Pfad geändert wird.

    P.S.:
    Bei dem Code:
    $me = htmlentities($_SESSION['username']);
    $sql = "SELECT username, email, info, status FROM members WHERE username = '$me'";

    Das htmlentities schützt dich nicht vor SQL Injection, siehe http://php.net/manual/de/function.htmlentities.php. Per default werden einfache Anführungszeichen nämlich nicht ersetzt. Kann natürlich sein, dass der Benutzername bei Dir sowieso solche Zeichen nicht enthalten kann, weil Du das vorher schon überprüfst, generell würde ich Dir aber zu Prepared Statements raten ;)



    @ggamee: so wie ich das sehe enthält $me sowieso immer den Benutzernamen und ist somit auch nicht leer, selbst wenn kein Profilbild gesetzt ist.

    Beitrag zuletzt geändert: 30.4.2017 15:16:25 von davidlw
  5. Autor dieses Themas

    theherobone

    theherobone hat kostenlosen Webspace.

    Danke für den Hinweis mit der SQL Injektion.
    Normalerweise sollte das JS bei der regestrierung einen Benutzernamen mit solchen Zeichen ausfiltern. Außerdem wird es auch noch von einer
    mysqli_real_escape_string($mysqli, $string);
    Funktion gefiltert
  6. JS bietet dir keinerlei Sicherheit, das ist lediglich für die bessere Benutzbarkeit/direkte Rückmeldung für den Benutzer.
    Das lässt sich ja deaktivieren oder auch vom Benutzer manipulieren. Mit mysqli_real_escape_string solltest Du aber soweit sicher sein.

    Haben die anderen Tipps denn geholfen?
  7. g****e

    davidlw schrieb:
    @ggamee: so wie ich das sehe enthält $me sowieso immer den Benutzernamen und ist somit auch nicht leer, selbst wenn kein Profilbild gesetzt ist.


    Stimmt, habe ich total übersehen, dass das auch im Query benutzt wird, und dementsprechend gar nicht leer sein kann. Dann müsste man auf Existenz der Datei prüfen.

    Hier gibt es aber, ebenfalls wie bei der Datenbank, Zeichenkombinationen, die uncool sind: Kombinationen mit . und /

    Eventuell wäre es am sinnvollsten, wenn du das Profilbild in einer Zusatzspalte in der Datenbank speicherst (also seinen Namen. Du musst den Namen allerdings generieren, damit nicht 2 Leute den gleichen Namen verwenden können). Du benennst das Bild mit einem Hash, speicherst diesen in der Datenbank, und wenn dieser fehlt, fehlt auch das Bild, und du zeigst die Alternative an.

    Liebe Grüße

    Edit: Achja, für die Prävention der Injections könnte man auch [urlhttps://secure.php.net/manual/de/mysqli.quickstart.prepared-statements.php]MySQLi-Prepared-Statements[/url] verwenden. Nur reingeworfen.

    Beitrag zuletzt geändert: 30.4.2017 15:55:03 von ggamee
  8. Autor dieses Themas

    theherobone

    theherobone hat kostenlosen Webspace.

    Könnte das mit diesem Code funktionieren?
    <?php
    include_once 'db_connect.php';
    include_once 'functions.php';
    
    sec_session_start();
    
    $username = htmlentities($_SESSION['username']);
    
    function getProfilePicture() {
        $file = $username + ".png";
        $file = file_exists($file);
        if ($file == true) {
            return $username + ".png";
        } else {
            return "user_not_confirmed.png";
        }
    }


    Also falls es so klappen sollte vielen dank für die Tipps!

    Beitrag zuletzt geändert: 30.4.2017 16:55:35 von theherobone
  9. Sollte prinzipiell so funktionieren, ist allerdings ein wenig umständlich programmiert, warum überschreibst Du $file anstatt das file_exists direkt in die if-Abfrage zu packen? Hättest Du $file nicht überschrieben könntest Du dann auch direkt return $file machen anstatt das nochmal neu zusammenzusetzen ;)

    Sähe dann ungefähr so aus:
    <?php
        $file = $username + ".png";
        if (file_exists($file)) {
            return $file;
        } else {
            return "user_not_confirmed.png";
        }


    Und wie bereits angemerkt: Du solltest dabei sichergehen, dass $username keine Kombinationen von . und / beinhalten kann, sonst könnte ein Angreifer evtl Informationen über die Existenz von Dateien erhalten, auf die er anders keinen Zugriff hätte (wahrscheinlich keine große Gefahr, aber better safe than sorry ;))
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!