Facebook
Twitter
Google+
Kommentare
13

Der „Developers Shame Day“

Heute ist mal wieder ein besonderer Tag und zwar ein Tag, an dem es Zeit wird sich zu schämen. Aber erstmal die Vorgeschichte. Lang war es ruhig um Cem den PHP-Hacker und dann, eines Tages, kommt er mir einer Kracher-Idee. Wie wäre es, wenn alle Entwickler, die schon eine Weile im Geschäft sind mal demonstrieren, dann sie nicht immer Profis waren. Ja auch der beste PHP-Entwickler hat mal echt scheiß Code gebaut.

Und genau am heutigen Tag wird es Zeit mal alten Code rauszukramen und in der Welt zu präsentieren. Wie gesagt, ich fand die Idee so gut, dass ich mitmachen wollte und bin in die Tiefen meines Archivs vorgestoßen und habe mal ein wenig alten Source-Code angeschaut. Hier mein Ergebnis. Ich habe versucht nur einen kurzen Snippet zu finden, der trotzdem alles sagt.

...
elseif ( $step == 3 )
{
  if ( $content["zahlweise"] == "kk" && (  $content["kkinhaber"] == "" || $content["kartennummer"] == "" || $content["pruefziffern"] == "" ) ) $error = true;
  if ( $content["zahlweise"] == "lastschrift" && (  $content["kontonr"] == "" || $content["blz"] == "" || $content["koinhaber"] == "" ) ) $error = true;

  $uploaddir ='/kunden/108859_79115/webseiten/apfelbild_de/upload/';
  $id = md5( time() );
  if ( !$error && move_uploaded_file($_FILES['file_userfile']['tmp_name'], $uploaddir.$id. "_".$_FILES['file_userfile']['name']))
  {
    chmod ( $uploaddir.$id. "_".$_FILES['file_userfile']['name'], 0777 );
    $content["firmenlogo"] = "http://www.apfelbild.de/upload/".$id."_".$_FILES['file_userfile']['name'];

    $content = array_merge ( $content, $forward );
    $message = "";
    foreach ( $content as $key => $value )
    {
      $message .= "$key: $value \n";
    }

    mail ( "langner@plan08.de", "Bestellung Apfelbild.de", $message );

    include "bestellung4.php";

  }
  else
  {
    $error = true;
    $hidden = forwardData ( $forward );
    include "bestellung3.php";
  }
}

Der kurze Ausschnitt ist aus einem Projekt, dass ich Anfang 2003 für eine Agentur (die jetzt zum Glück pleite ist) programmiert habe. Eigentlich brauch man da nicht mehr so viel zu sagen, oder? Wie einfach da mit Kredtikarten-Daten umgegangen wurde – wunderbar. Pfade und E-Mail-Adresse sind hart-codiert. Der „Controller“ ist einfach ein include, dass im Erfolgsfall ein bestellung4.php anzieht und wenn es kein Erfolg war wieder zurück zu bestellung3.php geht. Irgendwas kann man auch im Formular hochladen (ich glaube das Firmenlogo), das wird dann in ein Upload-Verzeichnis kopiert, ohne zu schauen was für ein Typ es ist. Und noch schlimmer! Es sieht so aus, als ob die Datei auch noch über den Browser erreichbar ist.Variablennamen waren auf Deutsch., zumindest die Array-Keys.

Ich bin echt stolz, diese Meisterleistung gefunden zu haben. Bin mir sogar fast sicher, dass ich ziemlich weit vorne sein werde, bei den Artikeln, die heute so gepostet werden. Habe ja schließlich von jedem etwas: Sicherheitsprobleme, keine OOP, hardkodierte Werte, …

Falls ihr übrigens auch am Shame-Day teilnehmt, dann könnt ihr hier gerne eure Links posten. Und nicht vergessen: Cem Bescheid geben, damit er eine Liste aufstellen kann.

Über den Autor

Nils Langner

Nils Langner ist der Gründer von "the web hates me" und auch der Hauptautor. Im wahren Leben leitet er das Qualitätsmanagementteam im Gruner+Jahr-Digitalbereich und ist somit für Seiten wie stern.de, eltern.de und gala.de aus Qualitätssicht verantwortlich. Nils schreibt seit den Anfängen von phphatesme, welches er ebenfalls gegründet hat, nicht nur für diverse Blogs, sondern auch für Fachmagazine, wie das PHP Magazin, die t3n, die c't oder die iX. Nebenbei ist er noch ein gern gesehener Sprecher auf Konferenzen. Herr Langner schreibt die Texte über sich gerne in der dritten Form.
Kommentare

13 Comments

  1. Da erinnert man sich ja an seine Anfangszeiten – und weiss wieder warum PHP als eine sehr unsichere Sprache galt. Ich werde bei nächster Gelegenheit mal nachsehen was sich so in unserem Archiv findet. 🙂

    Reply
  2. Als ich noch jung und unerfahren war… 🙂

    if(isset($_SESSION[‚foldercontainer‘]) || isset($_SESSION[’songcontainer‘]))
    {
    //take config for fields first…
    if(is_file($templatedir.“/“.$_SESSION[‚type‘].“/input/fielddef“))
    {
    $lines=@file($templatedir.“/“.$_SESSION[‚type‘].“/input/fielddef“);

    for($i=0;$i<=9;$i++)
    {
    if(isset($lines[$i]))
    {
    if($i<9)
    {
    list($showtxt, $inputtxt)=split('[;]', $lines[$i]);

    $queryinput=$queryinput." '".addslashes($inputtxt)."',";
    $queryshow=$queryshow." '".addslashes($showtxt)."',";
    }
    else
    {
    $queryinput=$queryinput." '".addslashes($inputtxt)."'";
    $queryshow=$queryshow." '".addslashes($showtxt)."'";

    }
    }
    else
    {
    if($iquery(„INSERT INTO fields (name, motto, type, date, time, field_input1, field_input2, field_input3, field_input4, field_input5, field_input6, field_input7, field_input8, field_input9, field_input10, field_show1, field_show2, field_show3, field_show4, field_show5, field_show6, field_show7, field_show8, field_show9, field_show10) VALUES (‚“.addslashes(utf8_decode($name)).“‚, ‚“.addslashes(utf8_decode($motto)).“‚, ‚“.addslashes(utf8_decode($_SESSION[‚type‘])).“‚, ‚“.addslashes(utf8_decode($startdate)).“‚, ‚“.addslashes(utf8_decode($starttime)).“‚, „.$queryinput.“, „.$queryshow.“)“))
    {
    $songid=array();
    $last__id = $db->lastid;

    foreach ($_SESSION[’songcontainer‘] as $sid => $val)
    $songid[]=$val;

    foreach ($_SESSION[‚foldercontainer‘] as $fid => $val)
    getSongIds($val);

    array_unique($songid);

    foreach($songid as $id)
    $db->query(„INSERT INTO rel_song_ (_id, song_id) VALUES (‚$last__id‘, ‚“.addslashes($id).“‚)“);

    // gets one song out of rel_song_ and puts it into playlist
    if ($db->query(„SELECT song_id FROM rel_song_ WHERE _id=’$last__id‘ ORDER BY RAND() LIMIT 0,1“))
    {
    if ($db->query(„INSERT INTO playlist VALUES (NULL, ‚$last__id‘, ‚“.$db->d[„song_id“].“‚, NULL, ‚1‘, ‚1‘, ‚1‘, ‚ABSPIELBAR‘, ‚Let the begin!‘, “, “, “, “, “, “, “, “, now())“))
    {
    $last_playlist_id = $db->lastid;
    $db->query(„INSERT INTO playing VALUES (‚$last_playlist_id‘, $last__id, 0)“);
    $db->query(„INSERT INTO _live_status VALUES (NULL, ‚$last__id‘, 0, 1, 0, 1, 0)“);
    $sendstring=“&status=good&“;
    }
    else
    $sendstring=“&status=error4&“;
    }
    else
    $sendstring=“&status=error0&“;
    }
    else
    $sendstring=“&status=error1&“;
    }
    else
    $sendstring=“&status=error2&“;
    }
    else
    {
    echo $_SESSION[‚foldercontainer‘][0];
    $sendstring=“&status=error3&“;
    }

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen