[PHP] Ava-Changer testen

imde

Well-known member
ID: 69925
L
3 Mai 2006
197
19
Ich habe gestern meinen ersten Ava-Changer programmiert. Wahrscheinlich habe ich auch einige Fehler reingebaut, kann schon mal vorkommen. Könntet ihr ihn mal etwas ausprobieren und mir die Fehler hier bekanntgeben? Den Link findet ihr in meiner Signatur.

Der Ava-Changer befindet sich nicht mehr online, sondern wurde für die Testphase offline gestellt.
 
Zuletzt bearbeitet:
naja als erstes solltest du mal überprüfen ob die get variable überhaupt eine datei ist.

gibt sonst hässliche fehlermeldungen, wenn ich den get parameter manuell ändere.

jperl
 
Ich habe gestern meinen ersten Ava-Changer programmiert. Wahrscheinlich habe ich auch einige Fehler reingebaut, kann schon mal vorkommen. Könntet ihr ihn mal etwas ausprobieren und mir die Fehler hier bekanntgeben? Den Link findet ihr in meiner Signatur.

Ohne Code lässt sich nicht alles sagen, aber du solltest auf jeden Fall sämtliche übergebene (vorallem Get- und Post-) Parameter überprüfen bzw. ansonsten soetwas nicht veröffentlichen.

edit: zu spät - und es gibt nicht nur hässliche Fehlermeldungen sondern auch Infos über das System ;) *g*
 
jep du solltest überprüfen was du da einbindest.

habe gerade deine index.php als dein aktuelles ava markiert ;)

jperl
 
Ich habe mir mit deinem Script erfolgreich den PHP-Source herunterladen können, also nimm das Ding sofort off 8O
 
Wie kann man denn einen PHP-Source herunterladen? Du solltet doch nur die Ausgabe bekommen. :(
Hab ich doch, nämlich jede Datei auf deinem Webspace (ohne open_basedir-Restriktion sogar dem gesamten Server) kann ich runterladen, wenn ich will: Passwörter, Quellcodes, einfach alles

PHP:
if (isset($_GET['ava'])) {
    $newava=$_GET['ava'];
    if (copy("ava/$newava", "ava/avatar.gif")) {
Quelle: index.php - Zeilen 28-30

Jede Eingabe, die vom User kommt, ist potentiell gefährlich ! Du prüfst hier aber absolut überhaupt nichts.
Als erstes solltest du nur Dateien zulassen, die a) in dem Verzeichnis ./ava liegen und b) nur Dateien, die wirklich existieren.
 
Kann ich es irgendwie anstellen, dass man eine POST-Variable schickt, sobald man auf einen Avatar geklickt hat?
 
naja das kannst du schon, aber das löst ja dein problem nicht.
$_POST variablen sind genauso angreifbar.

du müsstest halt bei onclick=submit() machen, was aber nicht wirklich guter stil wäre.

du könntest aber auch die buttons via css so gestalten, dass sie nur wie bilder ausschauen.

jperl
 
Kann ich es irgendwie anstellen, dass man eine POST-Variable schickt, sobald man auf einen Avatar geklickt hat?
Ob ich die Anforderung, dass ich gerne die index.php (oder jede andere Datei auf dem Server) haben will, per GET oder per POST schicke, is mir eigentlich egal.

Ich würde lieber das Problem lösen, anstatt mir zu überlegen, wie ich es verstecken kann ;)
 
Mit einem Formular und Radiobuttons wäre es auch nicht besser, oder? Ich lese den Inhalt von ./ava aus und erzeuge für alle jpgs, gifs und pngs jeweils einen Radio. Den Wert des Radios schick ich dann über das POST-Formular, welches dann avatar.gif erstellt.

PHP:
$html.="<form name=\"avachanger\" method=\"post\" action=\"index.php\"><table>\n";
  
  if (isset($_POST['ava'])) {
    $newava=$_POST['ava'];
    if (copy("ava/$newava", "ava/avatar.gif")) $html.="<tr><td colspan=\"5\">Avatar $newava wird verwendet!<br /></td></tr>\n";
  }
  
  $html.="<tr><td colspan=\"5\">Aktuelles Avatar:<br /><img src=\"ava/avatar.gif\" /></td></tr>\n";
  
  $dir="ava";
  if (is_dir($dir)) {
    if ($handle=opendir($dir)) {
      while (false!==($file=readdir($handle))) {
        if ((substr($file, -3)=="jpg" || substr($file, -3)=="gif" || substr($file, -3)=="png") && $file!="avatar.gif") {
          $avaarray[]=$file;
        }
      }
    }
  }
  
  $html.="<tr><td colspan=\"5\">Wähle ein Avatar:</td></tr>";
  for ($i=0;$i<count($avaarray);$i++) {
    if ($i%5==0) $html.="<tr>\n";
    $html.="<td><img src=\"ava/$avaarray[$i]\" border=\"0\" /><br /><input type=\"radio\" name=\"ava\" id=\"$avaarray[$i]\" value=\"$avaarray[$i]\" /><label for=\"$avaarray[$i]\">$avaarray[$i]</label></td>\n";
    if ($i%5==4) $html.="</tr>\n";
  }
 
Mit einem Formular und Radiobuttons wäre es auch nicht besser, oder?
Ein Formular bereitet die POST-Daten nur vor. Was ich letztendlich sende, kannst du nicht beeinflussen.
Du kannst es nur analysieren und gefährliche Daten verwerfen.

Ich hab doch schon oben geschrieben, was du tun musst.
 
Mit folgender Abfrage sollte es doch funktionieren. Ich frage ab, ob die per POST gesendete Datei sich im ava-Verzeichnis befindet:
PHP:
if (file_exists("ava/$newava")) {
      if (copy("ava/$newava", "ava/avatar.gif")) $html.="<tr><td colspan=\"5\">Avatar $newava wird verwendet!<br /></td></tr>\n";
}
 
Und was ist, wenn $newava "../config.php" ist, wo zufällig alle Passwörter drinstehen ? :roll:
Dann gibt es die Datei, du willst aber nicht, dass ich sie bekomme.
 
Welche Infos genau wären das?

z.B. dass das Script einfach jedes File nach ava/avatar.gif kopiert. Somit kann, wie tH beschrieben hat z.B. PHP-Code runtergeladen werden, da *.gif nicht geparst wird ;)

Schon alleine deshalb (wenn auch nur als kleine Teilmaßnahme): error_reporting außerhalb der Entwicklungsmaschine ausstellen!
 
Gibt es irgendeine Funktion, um herauszufinden, ob die Datei ein Bild ist? Oder reicht es, wenn ich abfrage, ob die Datei auf .jpg usw. endet?
 
Bitte um erneutes Korrekturlesen:
PHP:
if (isset($_POST['ava'])) {
  $newava=$_POST['ava'];
  if (!strpos($newava, "/")) { // würde es so funktionieren?
    if (file_exists("ava/$newava")) {
      if (exif_imagetype("ava/$newava")==1 || exif_imagetype("ava/$newava")==2 || exif_imagetype("ava/$newava")==3) {
        if (copy("ava/$newava", "ava/avatar.gif")) $html.="<tr><td colspan=\"5\">Avatar $newava wird verwendet!<br /></td></tr>\n";
      }
      else $html.="<tr><td colspan=\"5\">Die angegebene Datei ist kein Bild vom JPG-, GIF- oder PNG-Format. Das Avatar wurde nicht geändert!<br /></td></tr>\n";
    }
  }
}
 
Zuletzt bearbeitet: