• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Private Bilder

Freshmojojo

Mitglied
Hallo,
und zwar stelle ich mir schon seit längerem die Frage ob wenn ich eine Galerie auf meiner Website einrichte und die mit folgender Abfrage zugänglich mache:
Code:
<?php
session_start();
if(isset($_SESSION["user"])) {
$user = $_SESSION["user"];

$verbindung = mysql_connect("localhost", "root", "*******")
            or die ("Fehler im System");

            mysql_select_db("database")
            or die ("Verbidung zur Datenbank war nicht möglich...");
           
            $abfrage = "SELECT * FROM accounts WHERE user = '$user'";

           
            $result = mysql_query($abfrage);
           
            $userdaten = mysql_fetch_array($result);
           
            $_SESSION["userdaten"] = $userdaten

?>
dann die Bilder privat sind? Oder ob der Google bot etc. die trotzdem findet... ich möchte nämlich gerne eine Galerie haben, wovon die Bilder auf garkeinen Fall im internet zu finden sein sollten (image schäden... usw). Meine frage also reist das so oder muss ich andere vorkehrungen treffen?
LG
Freshmojojo
 
Werbung:
hey freshmojojo,

ich würde dir empfehlen ein richtiges login system einzubauen, es sollte soweit ich weiß dann nicht von iregendwelchen suchmaschinen angezeigt werden.
Also dann bitte auch keine meta Tags benutzen zur identifizierung der Webseite. Kannst ja später schauen ob es durch die suche angezeigt wird.

mfg
Flava
 
Also mein Login System ist denke soweit ausgereift und zwar wird $_SESSION["user"] durch die loginform übergeben:
Code:
<?php
session_start();
$verhalten = 0;

if(!isset($_SESSION["username"]) and !isset($_GET["page"])) {
$verhalten = 0;
}
if(isset($_GET["page"]) == "log") {

$user = $_POST["user"];
$passwort = $_POST["passwort"];

$user = stripslashes($user);
$passwort = stripslashes($passwort);

$user = strtolower($_POST["user"]);
$passwort = md5($_POST["passwort"]);

            $verbindung = mysql_connect("localhost", "root", "*****")
            or die ("Fehler im System");

            mysql_select_db("database")
            or die ("Verbidung zur Datenbank war nicht möglich...");
          
            $control = 0;      
            $abfrage = "SELECT * FROM accounts WHERE user = '$user' AND passwort = '$passwort'";

          
            $ergebnis = mysql_query($abfrage);

          

            while($row = mysql_fetch_object($ergebnis))
                {
                    $control++;
                }  
if($control != 0) {
$_SESSION["user"] = $user;
$verhalten = 1;
} else {
$verhalten = 2;
}
}
?>
Ich weis nicht in wie fern das sicher genug ist :) ? Danke schonmal.
Lg
Freshmojojo
 
Werbung:
Zu dem ersten Script
Was soll denn die DB-Abfrage? Wenn in der Session der User gesetzt ist, ist doch klar, dass es ein berechtigter User ist

Zu deinem Login:
  1. Du benutzt noch die MySQL-Extension statt MySQLi
  2. Du "escapest" $user nicht
  3. Du benutzt "Select *"
  4. Nach mysql_query kein Check auf Fehler
  5. Wozu die Schleife, mehr als einen Treffer kann es doch wohl nicht geben
 
Zu dem ersten Script
Was soll denn die DB-Abfrage? Wenn in der Session der User gesetzt ist, ist doch klar, dass es ein berechtigter User ist

Zu deinem Login:
  1. Du benutzt noch die MySQL-Extension statt MySQLi
  2. Du "escapest" $user nicht
  3. Du benutzt "Select *"
  4. Nach mysql_query kein Check auf Fehler
  5. Wozu die Schleife, mehr als einen Treffer kann es doch wohl nicht geben
Danke erstmal :)
1.) mit mySqli hab ich mich noch nicht beschäftigt... sollte ich das tun?
2.) was genau meinst du mit escapen? wie stellst du es dir vor?
3.) was sollte ich anstatt select benutzen gibt es andere Möglichkeiten oder ist das rein aus "Codeschönheit"?
4.) sehr gut danke hab ich übersehen :)
5.) hast recht eigene Dummheit ist eigentlich für die Katz :p

Kann man Sicherheitstechnisch noch etwas verbessern? :) Danke für deine Kritik bin was Web Programmierung angeht eigentlich noch ein relativer neuling :D von daher bitte nicht Wundern wenn ich manchmal nicht gleich was gemeint ist.
Lg
Freshmojojo
 
Werbung:
Zu 1. Ja, solltest du auf jeden Fall, die MySQL-Extension wird in späteren PHP-Versionen nicht mehr unterstützt
Zu 2. http://us1.php.net/manual/de/function.mysql-real-escape-string.php
Zu 3. Warum soll ich nicht SELECT * schreiben? http://www.php-faq.de/q-sql-select.html

1.) Werd ich mir dann mal nächstes Jahr zu Gemüte führen und die Site updaten ;)
2.)
Code:
<?php
session_start();
$verhalten = 0;

if(!isset($_SESSION["username"]) and !isset($_GET["page"])) {
$verhalten = 0;
}
if(isset($_GET["page"]) == "log") {

$user = $_POST["user"];
$user = mysql_real_escape_string($user);

$passwort = $_POST["passwort"];
$user = mysql_real_escape_string($user);

$user = stripslashes($user);
$passwort = stripslashes($passwort);

$user = strtolower($_POST["user"]);
$passwort = md5($_POST["passwort"]);

            $verbindung = mysql_connect("localhost", "root", "****")
            or die ("Fehler im System");

            mysql_select_db("database")
            or die ("Verbidung zur Datenbank war nicht möglich...");
           
            $control = 0;       
            $abfrage = "SELECT * FROM accounts WHERE user = '$user' AND passwort = '$passwort'";

           
            $ergebnis = mysql_query($abfrage) or die ("Abfrage war nicht möglich...");

           

            while($row = mysql_fetch_object($ergebnis))
                {
                    $control++;
                }
hab ich jetzt richtig "escaped" oder ist dort noch ein fehler drinne? :)

3.) Da dort maximal 50 accounts erstellt werden halte ich es nicht für notwendig... aber ich werde deine tipps für meine galerie anwenden denn dort werden deutlich mehr einträge vorgenommen und so ja auch nur unnötig viel rechenleistung gebraucht ;) danke
 
oder kann ich hier genauso in Z 19 + 20:
Code:
<?php
session_start();
$verhalten = 0;

if(!isset($_SESSION["username"]) and !isset($_GET["page"])) {
$verhalten = 0;
}
if(isset($_GET["page"]) == "log") {

$user = $_POST["user"];
$user = mysql_real_escape_string($user);

$passwort = $_POST["passwort"];
$user = mysql_real_escape_string($user);

$user = stripslashes($user);
$passwort = stripslashes($passwort);

$user = strtolower($user);
$passwort = md5($passwort);

            $verbindung = mysql_connect("localhost", "root", "****")
            or die ("Fehler im System");

            mysql_select_db("database")
            or die ("Verbidung zur Datenbank war nicht möglich...");
          
            $control = 0;      
            $abfrage = "SELECT * FROM accounts WHERE user = '$user' AND passwort = '$passwort'";

          
            $ergebnis = mysql_query($abfrage) or die ("Abfrage war nicht möglich...");

          

            while($row = mysql_fetch_object($ergebnis))
                {
                    $control++;
                }
 
Werbung:
Ungetestet und noch mit der MySQL-Extension:
PHP:
<?php
  session_start();
  if(!isset($_SESSION["username"]) and !isset($_GET["page"]))
    $verhalten = 0;

  if(isset($_GET["page"]) == "log")
  {
    $verbindung = mysql_connect("localhost", "root", "****")
        or die ("Fehler im System");
    mysql_select_db("database")
        or die ("Verbidung zur Datenbank war nicht möglich...");
      
    $query = "Select
                  count(*)
                from
                  `accounts`
                where
                  `user`='" . mysql_real_escape_string($_POST["user"]) . "'
                and
                  `passwort`='" . md5($_POST["passwort"]) . "'";
                
    $result = mysql_query($query)
        or die ("MySQL-Error: " . mysql_error());
      
    if (mysql_result($result,0))
      $_SESSION["validUser"] = true;
    else
      echo "Login failed";
}
?>
 
dann die Bilder privat sind? Oder ob der Google bot etc. die trotzdem findet... ich möchte nämlich gerne eine Galerie haben, wovon die Bilder auf garkeinen Fall im internet zu finden sein sollten (image schäden... usw). Meine frage also reist das so oder muss ich andere vorkehrungen treffen?
LG
Freshmojojo

Ein Problem sehe ich noch. Du hast wahrscheinlich so einen Aufbau (Ordnerstruktur):

Code:
- public_html/index.php
- public_html/uploads
     - bild1.jpg
     - bild2.png
     - bild3.gif

index.php:

Code:
<?php
     // Login überprüfen (Wie von bdt600 beschrieben).

     // Bilder einlesen
     $bilder = glob('uploads/*');

     // Bilder ausgeben
     foreach($bilder as $bild) {
          echo '<img src="'.$bild.'">';
     }
?>

Was hier jetzt aber noch für jeden möglich ist, ist es den Link $bild direkt aufzurufen. Könnte also von einem Mitglied/Ex-Mitglied weiter verbreitet werden.
Oder mit ausprobieren (Website Directory Scanner). Wenn jemand also unbedingt will, kommt er an die Bilder.

Daher solltest du das wie folgt sichern:

Code:
- public_html/index.php
- public_html/img.php
- uploads
     - bild1.jpg
     - bild2.png
     - bild3.gif

index.php:

Code:
<?php
     // Login überprüfen (Wie von bdt600 beschrieben).

     // Bilder einlesen
     $bilder = glob('../uploads/*');

     // Bilder ausgeben
     foreach($bilder as $bild) {
          echo '<img src="img.php?file='.$bild.'">';
     }
?>

img.php:

Code:
<?php
     // Login überprüfen (Wie von bdt600 beschrieben).

     // Bild auslesen
     $size = getimagesize($_GET['file']);

     // Bild weiterreichen   
     header('Content-type: '.$size['mime']);
     readfile($_GET['file']);

Da der Ordner "uploads" nicht im public_html Verzeichnis ist, ist er von "außen" nicht erreichbar.
Natürlich kannst du auch einfach das upload-Verzeichnis so schützen, dass es nicht öffentlich ist und dann das Bild über die selbe Methode weitergeben.

Damit wären die Bilder zumindest nach außen geschützt.
 
Zuletzt bearbeitet:
Danke erstmal für deine ausführliche Antwort. Und zwar hab ich mir auch schon Gedanken über das aufrufen der Bilder über direkte links gemacht. Dachte eigentlich dass die durch die oben schon beschriebene Prüfung schon abgesichert wären, denn in der else Bedingung von dem Code steht nämlich noch:
Code:
} else {
?>
Bitte erst einloggen, <a href="login.php">hier</a>.
<?php
}
?>
Damit wär die Seite an sich abgesichert, aber jedoch nicht die direkten Links der Bilder. Richtig? Vielen Dank ich werde mir das Problem heute Abend nochmal anschauen und dann euch über meine Ergebnisse informieren.
lg
freshmojojo
 
Werbung:
So... Guten Abend und zwar hab ich nun es geschafft die von bdt600 beschriebene überprüfung einzubinden :)
PHP:
<?php
  session_start();
  if(!isset($_SESSION["username"]) and !isset($_GET["page"]))
    $verhalten = 0;
  if(isset($_GET["page"]) == "log")
  {
    $verbindung = mysql_connect("localhost", "root", "****")
        or die ("Fehler im System");
    mysql_select_db("database")
        or die ("Verbidung zur Datenbank war nicht möglich...");
   
    $user = mysql_real_escape_string($_POST["user"]);

   
    $query = "Select
                count(*)
              from
                `accounts`
              where
                `user`='" . $user . "'
              and
                `passwort`='" . md5($_POST["passwort"]) . "'";
             
    $result = mysql_query($query)
        or die ("MySQL-Error: " . mysql_error());
   
    if (mysql_result($result,0)){
      $_SESSION["user"] = $user;
      $verhalten = 1;
      }
    else{
      $verhalten = 2;
      }
}
?>
ich habe die valid user Variable raus genommen, da ich den usernamen an sich auch übergeben wollte und nicht dann wieder eine neue Datenbank Verbindung herstellen wollte. Ich hoffe so ist das auch in Ordnung.

Nun zu dem Beitrag von scbawi. Danke erstmal. Jedoch ist meine "Bildauslese" etwas komplizierter... Dies habe ich nähmlich mit Ajax gelöst da ich die Seiten Ohne nachladen der eigentlichen Hauptseite haben wollte:
Code:
<script>
var rpp = <?php echo $rpp; ?>; // results per page
var last = <?php echo $last; ?>; // last page number
function request_page(pn){
    var results_box = document.getElementById("results_box");
    var pagination_controls = document.getElementById("pagination_controls");
    results_box.innerHTML = "Ergebnisse werden geladen...";
    var hr = new XMLHttpRequest();
    hr.open("POST", "pagination_parser.php", true);
    hr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    hr.onreadystatechange = function() {
        if(hr.readyState == 4 && hr.status == 200) {
            var dataArray = hr.responseText.split("||");
            var html_output = "";
            for(i = 0; i < dataArray.length - 1; i++){
                var itemArray = dataArray[i].split("|");
               
                html_output += '<li class = "rand" ><a rel="image" href="'+itemArray[2]+'" title="'+itemArray[4]+'"><img  src="'+itemArray[2]+'"style="thumbnail; width:204px; height:148px;" alt="Vorschau"></a></li>';

            }
            results_box.innerHTML = '<ul id="portfolio-list" class="gallery">' +html_output+ '</ul>';
            $("a[rel='image']").colorbox();
            $("a[class='gallery']").gallery();
        }
    }
    hr.send("rpp="+rpp+"&last="+last+"&pn="+pn);
    // Change the pagination controls
    var paginationCtrls = "";
    // Only if there is more than 1 page worth of results give the user pagination controls
    if(last != 1){
        if (pn > 1) {
            paginationCtrls += '<button onclick="request_page('+(pn-1)+')">&lt;</button>';
        }
        paginationCtrls += ' &nbsp; &nbsp; <b>Seite '+pn+' von '+last+'</b> &nbsp; &nbsp; ';
        if (pn != last) {
            paginationCtrls += '<button onclick="request_page('+(pn+1)+')">&gt;</button>';
        }
    }
    pagination_controls.innerHTML = paginationCtrls;
}
</script>

Nun wie genau stellst du dir das vor dieses "Ausleseverfahren" zu sichern? Oder ist dies schon sicher? Danke für eure Hilfe.
lg
Freshmojojo
 
Mir ist noch nicht so ganz klar wie ich den Upload Ordner aus dem Hauptverzeichnis herausbekomme. Noch ist die Website offline d.h. auf meinem PC mit xampp. Wie genau "exportiere" ich jetzt den Ordner? Wie genau wird dies später beim Webhoster umgesetzt sein?
Freshmojojo
 
Wie du es aus dem Hauptverzeichnis raus bekommst kommt sich auf deinen Server an. Einfach raus aus deinem www-Verzeichnis zB:

Code:
public_html/index.php
uploads/

Code:
httpdocs/index.php
uploads/

Code:
wwwroot/index.php
uploads/

Wie es in XAMPP geht weiß ich jetzt nicht garantiert, aber ich würde darauf tippen:

Code:
htdocs/deinProjekt/index.php
uploads/

Damit wirst du die Bilder via 127.0.0.1/ nicht mehr direkt aufrufen können.

Wie gesagt kannst du es auch in einen Unterordner legen und diesen via .htaccess schützen:

Code:
public_html/index.php
public_html/uploads
public_html/uploads/.htaccess

.htaccess:
Code:
order deny,allow
deny from all

Hier besteht dann eben die Gefahr dass du .htaccess aus versehen mal verschiebst/löscht, wodurch der Schutz dann aufgehoben ist.

Zu deinen Ajax bedenken, kann ich folgendes sagen.
Javascript ist vollkommen egal, ob das Bild jetzt so:

Code:
<img src="uploads/bild1.jpg">

oder so aussieht:

Code:
<img src="img.php?file=bild1.jpg">

Wichtig ist nur dass das Bild zurückgegeben wird.

Wo werden die Bildpfade ans JS übergeben? pagination_parser.php?

Hier musst du die Pfade ändern (also "img.php?file=…" statt "uploads/bild1…"). Dein Ajax/Javascript sollte damit weiterhin klarkommen.

Das ganze ist also nur eine PHP-Seitige Änderung.
 
Zuletzt bearbeitet:
Werbung:
Hallo,
ich denke die Methode mit htaccess liegt mir am besten. Kleine Frage am Rande wenn ich diesen Code in meine .htaccess Datei schreibe
Code:
order deny,allow
deny from all
verweigert er dann nicht jeglichen Zugriff auf diesen Ordner? Wie genau kann ich nun eine bestimmte Seite dafür berechtigen doch Zugriff zu haben?
lg
freshmojojo
 
Werbung:
Nicht für PHP, per Browser geht es aber nicht

Wofür? Lese die Bilder per PHP ein und alles ist gut


Okay Sorry das war wohl ein Missverständnis meinerseits. Wenn ich das jetzt richtig verstanden haben sichere ich durch die eine htacess Datei den Kompletten Ordner in dem sich die Datei befindet vor Zugriffen aus dem Browser. Richtig? Also kann jetzt nur noch eine entsprechende php-Seite auf meinem Server die Daten lesen und sonst nichts anderes?
Danke für eure Hilfe
Freshmojojo
 
Okay Sorry das war wohl ein Missverständnis meinerseits. Wenn ich das jetzt richtig verstanden haben sichere ich durch die eine htacess Datei den Kompletten Ordner in dem sich die Datei befindet vor Zugriffen aus dem Browser. Richtig? Also kann jetzt nur noch eine entsprechende php-Seite auf meinem Server die Daten lesen und sonst nichts anderes?
Danke für eure Hilfe
Freshmojojo

Ja, und diese php-Seite kann dann entscheiden ob der browser die daten bekommt oder nicht.
 
Zurück
Oben