1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Unsere jährliche Weihnachts-Banner-Aktion hat begonnen! Wir freuen uns auf viele, viele kreative Vorschläge.
    Mehr dazu könnt Ihr hier nachlesen: Weihnachtsbanner 2016

    Information ausblenden

Newsscript Login

Dieses Thema im Forum "PHP & Co." wurde erstellt von Macloc, 17.08.09.

  1. Macloc

    Macloc Elstar

    Dabei seit:
    15.03.07
    Beiträge:
    73
    Guten Abend,
    ich habe ein simples Newsscript um einige funktionen erweitert. Bis jetzt hat auch alles super geklappt. Nun möchte ich noch den Benutzerlogin des Scriptes sicherer machen.
    Momentan wird das Passwort an die URL übergeben um sich einzulogen bzw. um funktionen wie zum Beispiel bearbeiten, neu erstellen usw. verwendet werden können.

    D.h. dass das Passwort im Klartext in der URL steht. Das möchte ich unterbinden!
    Nur leider schaffe ich es nicht. Mir wäre eine methode mir md5 am liebsten.
    Kann mir jemand helfen? Wäre echt super!!!

    Code:
    <?php require("config.php"); ?>
    
    <?php echo $title; ?>
         
    <?php
      //load configuration
      
      
      //connect to database
      @mysql_connect($db_server,$db_user,$db_password) or die("Database server connection failed. Check variables \$db_server, \$db_user and \$db_password in config.php");
      @mysql_select_db($db_name) or die("Selecting database failed. Check variable \$db_name in config.php");
      
    ?>
    
    <?php
      $pwd = $_GET["pwd"];
    
      //simple login
      if(isset($pwd) && ($pwd == $passwd)){
      $edit = $_GET["edit"];
      $del = $_GET["del"]; 
        
         
        //submit changes
        if(isset($_POST["edit_submit"])){
          $news = str_replace("\n","<br>",$_POST["news"]);
          $header2 = str_replace("\n","<br>",$_POST["header"]);
          
          @mysql_query("UPDATE $db_table SET date=".mktime($_POST["date_hour"],$_POST["date_minute"],0,$_POST["date_month"],$_POST["date_day"],$_POST["date_year"]).",news='$news',header='$header2',links='{$_POST["links"]}' WHERE id={$_POST["edit"]};");
          
          
          //error occurred
          if(@mysql_error()){
            ?><p>Bearbeitung schlug fehl: <?php echo @mysql_error(); ?></p>
          <p><a href="javascript:history.back();">Zurück.</a></p><?php
          //successful
          }else{
            ?><p>Eintrag wurde erstellt. <a href="newsa.php?pwd=<?php echo $pwd; ?>">Hier weiter.</a></p><?php
          }
        //edit an entry
        }else if(isset($edit)){
          $row = @mysql_fetch_array(@mysql_query("SELECT * FROM $db_table WHERE id=$edit;"));
          $news = str_replace("<br>","\n",$row["news"]);
          $header2 = str_replace("<br>","\n",$row["header"]);
    
    ?>
    <form action="newsa.php?pwd=<?php echo $pwd; ?>" method="post">
      <input type="hidden" name="edit" value="<?php echo $edit; ?>">
      <table border="0" cellpadding="2" cellspacing="2">
        <tr>
          <td>Date:</td>
          <td>
            <?php
              $d = date("d",$row["date"]);
              $m = date("m",$row["date"]);
              $y = date("Y",$row["date"]);
              $h = date("H",$row["date"]);
              $s = date("i",$row["date"]);
            ?>
            <select name="date_month">
              <?php
                for($i=1;$i<=12;$i++){ 
                  ?><option value="<?php echo $i; ?>"<?php if($i==$m){ ?> selected<?php } ?>><?php echo $i; ?></option><?php
                }
              ?>
            </select>
            <select name="date_day">
              <?php
                for($i=1;$i<=31;$i++){ 
                  ?><option value="<?php echo $i; ?>"<?php if($i==$d){ ?> selected<?php } ?>><?php echo $i; ?></option><?php
                }
              ?>
            </select>
            <select name="date_year">
              <?php
                for($i=2000;$i<=$y+10;$i++){ 
                  ?><option value="<?php echo $i; ?>"<?php if($i==$y){ ?> selected<?php } ?>><?php echo $i; ?></option><?php
                }
              ?>
            </select>
            -
            <select name="date_hour">
              <?php
                for($i=0;$i<=23;$i++){ 
                  ?><option value="<?php echo $i; ?>"<?php if($i==$h){ ?> selected<?php } ?>><?php echo $i; ?></option><?php
                }
              ?>
            </select>
        :
        <select name="date_minute">
              <?php
                for($i=0;$i<=59;$i++){ 
                  ?><option value="<?php echo $i; ?>"<?php if($i==$s){ ?> selected<?php } ?>><?php echo $i; ?></option><?php
                }
              ?>
            </select>
          </td>
        </tr>
        <tr>
          <td valign="top">&Uuml;berschrift:</td>
          <td><textarea name="header" cols="40" rows="1"><?php echo $header2; ?></textarea></td>
        </tr>  
        <tr>   
          <td valign="top">News:</td>
          <td><textarea name="news" cols="40" rows="10"><?php echo $news; ?></textarea></td>
        </tr>
        <tr>
          <td valign="top">Links:<br>(comma separated)</td>
          <td><textarea name="links" cols="40" rows="3"><?php echo $row["links"]; ?></textarea></td>
        </tr>
        <tr>
          <td>&nbsp;</td>
          <td><input type="submit" name="edit_submit" value="Speichern"></td>
        </tr>
      </table>
    </form>
    <?php
        //delete an entry
        }else if(isset($del)){
          @mysql_query("DELETE FROM $db_table WHERE id=$del;");
          
          //error occurred
          if(@mysql_error()){
            ?><p>Löschen schlug fehl: <?php echo @mysql_error(); ?></p>
        <p><a href="javascript:history.back();">Zurück</a></p><?php
          //successful
          }else{
            ?><p>Eintrag wurde gelöscht. <a href="newsa.php?pwd=<?php echo $pwd; ?>">Hier weiter.</a></p><?php
          }
        //insert an entry
        }else if(isset($_POST["new_submit"])){
          $news = str_replace("\n","<br>",$_POST["news"]);
          $header2 = str_replace("\n","<br>",$_POST["header"]);
          
          @mysql_query("INSERT INTO $db_table (date,news,header,links) VALUES(".mktime($_POST["date_hour"],$_POST["date_minute"],0,$_POST["date_month"],$_POST["date_day"],$_POST["date_year"]).",'$news','$header2','{$_POST["links"]}');");
          
          //error occurred
          if(@mysql_error()){
            ?><p>Eintrag erstellen fehlgeschlagen: <?php echo @mysql_error(); ?></p>
        <p><a href="javascript:history.back();">Zurück</a></p><?php
          //successful
          }else{
            ?><p>Eintrag wurde erstellt. <a href="newsa.php?pwd=<?php echo $pwd; ?>">Hier weiter.</a></p><?php
          }
        //new entry
        }else if(isset($_GET["new"])){
    ?>
    <form action="newsa.php?pwd=<?php echo $pwd; ?>" method="post">
      <table border="0" cellpadding="2" cellspacing="2">
        <tr>
          <td>Date:</td>
          <td>
            <?php
              $d = date("d");
              $m = date("m");
              $y = date("Y");
              $h = date("H");
              $s = date("i");
            ?>
            <select name="date_month">
              <?php
                for($i=1;$i<=12;$i++){ 
                  ?><option value="<?php echo $i; ?>"<?php if($i==$m){ ?> selected<?php } ?>><?php echo $i; ?></option><?php
                }
              ?>
            </select>
            <select name="date_day">
              <?php
                for($i=1;$i<=31;$i++){ 
                  ?><option value="<?php echo $i; ?>"<?php if($i==$d){ ?> selected<?php } ?>><?php echo $i; ?></option><?php
                }
              ?>
            </select>
            <select name="date_year">
              <?php
                for($i=2000;$i<=$y+10;$i++){ 
                  ?><option value="<?php echo $i; ?>"<?php if($i==$y){ ?> selected<?php } ?>><?php echo $i; ?></option><?php
                }
              ?>
            </select>
            -
            <select name="date_hour">
              <?php
                for($i=0;$i<=23;$i++){ 
                  ?><option value="<?php echo $i; ?>"<?php if($i==$h){ ?> selected<?php } ?>><?php echo $i; ?></option><?php
                }
              ?>
            </select>
        :
        <select name="date_minute">
              <?php
                for($i=0;$i<=59;$i++){ 
                  ?><option value="<?php echo $i; ?>"<?php if($i==$s){ ?> selected<?php } ?>><?php echo $i; ?></option><?php
                }
              ?>
            </select>
          </td>
        </tr>
        <tr>
          <td valign="top">&Uuml;berschrift:</td>
          <td><textarea name="header" cols="40" rows="1"><?php echo $header2; ?></textarea></td>
        </tr>  
        <tr>
          <td valign="top">News:</td>
          <td><textarea name="news" cols="40" rows="10"></textarea></td>
        </tr>
        <tr>
          <td valign="top">Links:<br>(comma separated)</td>
          <td><textarea name="links" cols="40" rows="3"></textarea></td>
        </tr>
        <tr>
          <td>&nbsp;</td>
          <td><input type="submit" name="new_submit" value="Speichern"></td>
        </tr>
      </table>
    </form>
    <?php
        //print news list
        }else{
          //get all entries
          $result = @mysql_query("SELECT * FROM $db_table ORDER BY date DESC;");
          $colored = true;
    
    
          ?><p><a href="newsa.php?pwd=<?php echo $pwd; ?>&new">Neue News</a> | <a href="newsa.php">Logout</a></p><br />
          <table border="0" cellpadding="3" cellspacing="0" width="100%"><?php
          
          //print entries
          while($row=@mysql_fetch_array($result)){
            $row["news"] = strip_tags($row["news"]);
    
              ?><tr<?php if($colored){ ?> style="background-color:#eee;"<?php } ?>>
                <td valign="top"><strong><?php echo $row["id"]; ?></strong></td>
                <td valign="top"><?php echo date("m/d/Y - H:i",$row["date"]); ?></td>
                <td valign="top"><?php echo (strlen($row["header"])>200 ? (substr($row["header"],0,20)."...") : $row["header"]); ?></td>
                <td valign="top"><?php echo (strlen($row["news"])>200 ? (substr($row["news"],0,20)."...") : $row["news"]); ?></td>
                <td valign="top" width="50"><?php echo ($row["links"] != "" ? count(explode(",",$row["links"])) : 0); ?> link(s)</td>
                <td><a href="newsa.php?pwd=<?php echo $pwd; ?>&edit=<?php echo $row["id"]; ?>">Bearbeiten</a></td>
                <td><a href="newsa.php?pwd=<?php echo $pwd; ?>&del=<?php echo $row["id"]; ?>">Löschen</a></td>
              </tr><?php
    
            $colored = !$colored;
          }
    
          ?></table><?php
        }
      }else{
        //print login form
        echo $login;
      }
      //print link to news
      ?>
      
      <p align="left"><a href="index.php">News</a></p>
      
      
      <?php  
      //close database connection
      @mysql_close();
    
      ?>
    
    in der config.php steht das Passwort als Klartext.
    Siehe:

    Code:
    ...
    ...
    ...
      $passwd = "xxx";
    
    $login = <<<EOT
              <form action="newsa.php" method="get">
                Password: <input name="pwd" type="password"> <input type="submit" value="Login">
              </form>
              <?php      
    EOT;
    
    
    
    Wäre spitze wenn mir jemand helfen würde!

    Grüße, Qap
     
  2. creative7even

    creative7even Jerseymac

    Dabei seit:
    23.02.05
    Beiträge:
    454
    hi!

    der Ansatz, das Passwort in der URL mitzuschleifen - ob als MD5 oder Plain ist nicht zu empfehlen. Ich würde den Einsatz von Sessions empfehlen - php.net - sessions

    Nebenbei könnte man noch die Queries gegen Injections absichern - php.net - mysql_real_escape_string

    die Beispiele geben Aufschluss über die Verwendung der Funktionen - auch finden sich in den User-Posts hilfreiche Snippets (also ruhig mal querlesen).

    lg
     
  3. Macloc

    Macloc Elstar

    Dabei seit:
    15.03.07
    Beiträge:
    73
    Guten Abend,
    das hatte ich auch schon gefunde. Ich wusste nur leider nicht wie ich das korrekt einbauen muss...
    Muss ich dort viel ändern?

    Ich hatte in der config.php eine Variable $hash:"HIER_WAR_DER_HASH";

    Für den Login hatte ich in der *.php Datei die Zeile if(isset($pwd) && ($pwd == $passwd)){
    mit folgendem ausgetauscht:


    ...
    ....
    ...
    if (md5(($_POST["pwd"])==$hash)
    {
    ...
    ... Hier war der Rest des Quellcodes :)
    ...
    }
    ?>

    Das hatte leider nicht funktioniert, ich bekamm einen Prase error. Verstand aber nicht warum.

    Muss ich die Session um die einzelnen funktionen machen?

    Gruß, Macloc
     
  4. karolherbst

    karolherbst Danziger Kant

    Dabei seit:
    11.05.07
    Beiträge:
    3.878
    Code:
    if (md5($_POST["pwd"])==$hash)
    Klammer nicht vergessen ;) oder keine Klammern zu viel setzen...
     
  5. Macloc

    Macloc Elstar

    Dabei seit:
    15.03.07
    Beiträge:
    73
    Oh, merci! Hatte ich garnicht gesehen. Danke.

    Nun baut sich die Seite auf :).

    Leider wird nach dem Login, die "neue" Seite nicht geladen.

    Ich habe nun folgendes geändern.
    Code:
    <?php
    
      //connect to database
      @mysql_connect($db_server,$db_user,$db_password) or die("Database server connection failed. Check variables \$db_server, \$db_user and \$db_password in config.php");
      @mysql_select_db($db_name) or die("Selecting database failed. Check variable \$db_name in config.php");
      
      $pwd = $[B][COLOR=Red]_POST[/COLOR][/B]["pwd"]; // GET wird zu POST
    
      //simple login
      //if(isset($pwd) && ($pwd == $passwd)){
      
    [B][COLOR=Red]  if (md5($_POST["pwd"])==$hash)
      {[/COLOR][/B]
     
      $edit = $_GET["edit"];
      $del = $_GET["del"]; 
    ...
    ...
    ...
     [B][COLOR=Red] }[/COLOR][/B]
    
    in der config.php

    Code:
    $hash:"xxxx";
    
    $login = <<<EOT
              <form action="newsa.php" method="[COLOR=Red][B]post[/B][/COLOR]">
                Password: <input name="pwd" type="password"> <input type="submit" value="Login">
              </form>
              <?php      
    EOT;
    
    Wie sag ich dem Script das er nun, die "neue" Seiten laden soll?

    Muss ich die Session, hier einbauen?
    Früher habe ich das mit:
    Code:
    <a href="newsa.php?pwd=[COLOR=Red][B]<?php echo $pwd; ?>[/B][/COLOR][B][COLOR=SeaGreen]&edit[/COLOR][/B]=[B][COLOR=MediumTurquoise]<?php echo $row["id"]; ?>[/COLOR][/B]">Bearbeiten</a>
    
    Hier wurde das Passwort übergeben.
    Hier wirde die Variable edit übergeben.
    Hier welcher SQL eintrag ausgegeben werden soll.

    Grüße, Macloc
     
  6. creative7even

    creative7even Jerseymac

    Dabei seit:
    23.02.05
    Beiträge:
    454
    hallo!

    mit Sessions kann man Informationen an einen User "binden"...
    Initialisiert wird das ganze mit session_start(void). Zu beachten gilt, dass vor dem Aufruf der Methode KEIN Output erlaubt ist (weder mit echo/print noch als plain html - auch keine Leerzeichen/Leerzeilen)!
    Infos werden in das Superglobale Array $_SESSION gespeichert. Mit Hilfe dieser kann man bspw. als Flag einen User-Status auf "loggedIn" setzen.

    Code:
    <?php
      session_start();
    
      if($action == 'login') {
        // check submitted password - if OK set loggedIn-flag to true
        ...
        $_SESSION['userLoggedIn'] = true;
    
      } else if($action == 'logout') {
        unset($_SESSION['userLoggedIn']);
      }
    
      ...  
    
      if($_SESSION['userLoggedIn'] === true) {
        // show edit-form
        ...
      }
    
    ?>
    
     
    Macloc gefällt das.
  7. Macloc

    Macloc Elstar

    Dabei seit:
    15.03.07
    Beiträge:
    73
    Merci!@creative7even. Nun läuft alles!

    Vielen Dank.

    /Kann geschlossen werden.

    Grüße, Macloc
     

Diese Seite empfehlen