Mysql $GET action mit "_"

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mysql $GET action mit "_"

    Guten Abend,

    ich Möchte gern datensätze aus meiner Datenbank Löschen.

    da dies hier nicht funktioniert hat,
    PHP-Code:
    if (isset($_POST['remove']))
                        {
                            if (!empty(
    $_GET['action']))  
                            
    //wenn GET übergeben wurde 
                            
    {  
                                
    $action $_GET["action"];  
                                
    $loeschen mysql_query("DELETE FROM news WHERE headline = '$action' ");
                                
                            }
                        } 



    hab ich in eine test.php
    folgendes getippt:
    PHP-Code:
     <form action="test.php?action=<?php echo $action?>" method="post">
    <input name="submit" type="submit" value="Erstellen">
    <?php

     
    if (isset($_POST['submit']))
    {
    $action $_GET["action"];
    echo 
    $action;



    ?>
    </form>
    Das Funktioniert auch solange, biss action = Test_4 ist, dann wird nichts ausgegeben.
    Jetzt frage ich mich , warum ?


    Mit freundlichen Grüßen
    Cpt.Riot

  • #2
    Wo soll $ueberschrift herkommen?

    Was ergibt das Debugging?

    Die mysql_* Funktionen sind veraltet und sollten nicht mehr verwendet werden. Nimm stattdessen mysqli oder PDO.

    Kommentar


    • #3
      Hab mich vertippt habs schon geändert

      Das Mysql veraltet ist, ist mir bewusst aber ich denke wenn ich den code fertig habe kann ich ihn immer noch umschreiben und mich dann speziell mir mysqli beschäftigen


      EDIT:

      Den Fehler im oberen Code habe ich gefunden, die Form, in der der Button ist beziht sich auf admin.php und übernimmt die variable nicht
      HTML-Code:
      <form action="admin.php" method="post">
      er müsste also ebenfalls so aussehen:
      HTML-Code:
      <form action="admin.php?action<?php echo $action;  ?>" method="post">

      EDIT 2:


      ein weiterer Fehler war :
      " Unknown column 'Test4' in 'where clause' "

      also einfach
      PHP-Code:
      $loeschen "DELETE FROM news WHERE headline = '$action' "
      in

      PHP-Code:
      $loeschen "DELETE FROM news WHERE headline LIKE '$action' "
      geändert.

      bleibt nur leider immernoch das Problem, mit den "_"


      EDIT3:

      Okay ?!? scheint sich von alleine erledigt zu haben kp warum aber jetzt funktioniert es, ohne das ich was geändert habe ?

      siht jetzt so aus:

      PHP-Code:
      <form action="admin.php?action=<?php echo $action?>" method="post">
                          <input name="remove" type="submit" value="Löschen">
                          <?php

                              
      if (isset($_POST['remove']))
                                  {
                                      if (!empty(
      $_GET['action']))  
                                      
      //wenn GET übergeben wurde 
                                          
      {  
                                              
      $action $_GET["action"];  
                                              
      $loeschen "DELETE FROM news WHERE headline LIKE '$action' "
                                              
      $loesch mysql_query($loeschen) OR die("Error: $loeschen <br>".mysql_error() );
                                              
                                              echo (
      '<script>window.location.href="admin.php"</script>');
                                          }
                                      else 
                              
                                      echo 
      "Es wurde kein Beitrag ausgewählt";
                                  } 

                          
      ?>
                          </form>
      Zuletzt geändert von CptRiot; 13.03.2014, 16:34.

      Kommentar


      • #4
        Hallo CptRiot,

        ich würde den Quelltext ein wenig ändern. Denn ich sehe hier folgende Probleme:
        1. Du prüfst nicht, WELCHE Aktion ausgeführt werden soll. Das könnte zu Komplikationen führen, sofern du später andere Aktionen hinzufügen möchtest. Zudem könnnte es als Sicherheitslücke missbraucht werden.
        2. Du verwendest die Überschrift eines Eintrages. Das kann man machen, wenn man sich zu 100% sicher ist, dass die Überschriften einmalig sind und sich NIEMALS wiederholen. Besser wäre hier eine eindeutige Nummer. Oft "ID" genannt.
        3. Ich für meinen Teil würde dir von "LIKE" abraten. Damit suchst du keinen eindeutigen Eintrag. Es können auch andere Einträge betroffen sein.
        4. Da du nur einen Teil des Quelltextes zeigst, kann ich nicht prüfen ob du den Zugriff auf die Datei nur berechtigten Usern ermöglichst. Das halte ich für extrem wichtig, da du sonst relativ schnell eine leere Datenbank hast.
        5. In Anlehung an 4.) noch Folgendes: Du scheinst deine Daten nicht zu filtern. Ich sage nur: SQL-Injection.

        Ich hoffe, ich konnte dir ein wenig Anregung liefern.


        Viel Erfolg!
        ~ Chris

        Kommentar


        • #5
          Guten Morgen,

          erstmal Danke für die Antwort

          zu 1:
          Ich steh leider seit ner woche scho aufm schlauh und habe kp wie ich das vernünftig filtern kann

          zu2: jetzt wo du es sagst klingt es logisch ( war einfach nur faul ) werde es ändern, danke für den hinweis

          zu 3:
          ich hatte dort auh er = stehen aber das hat irdgendwie nicht funktioniert

          zu4:

          ich denke du meinst ein session basiertes Login ? dies ist vorhanden

          in etwa so

          login.php
          PHP-Code:
          <?php
          $username 
          $_POST["username"]; 
          $passwort md5($_POST["password"]); 

          $abfrage "SELECT username, passwort FROM login WHERE username LIKE '$username' LIMIT 1"
          $ergebnis mysql_query($abfrage); 
          $row mysql_fetch_object($ergebnis); 

          if(
          $row->passwort == $passwort
              { 
              
          $_SESSION["username"] = $username
              echo 
          "Login erfolgreich. <br> <a href=\"geheim.php\">Geschützer Bereich</a>"
              } 
          else 
              { 
              echo 
          "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>"
              } 

          ?>
          und admin.php
          PHP-Code:
          <?php 
          session_start
          (); 
          ?> 

          <?php 
          if(!isset($_SESSION["username"])) 
             { 
             echo 
          "Bitte erst <a href=\"login.html\">einloggen</a>"
             exit; 
             } 
          ?>

          Kommentar


          • #6
            Hi CptRiot,

            Zum Thema Filterung:
            Du hast in deinem Quelltext folgendes:
            PHP-Code:
                                            if (!empty($_GET['action'])) 
            Du prüfst hier einfach nur, ob "action" gesetzt wurde. Aber nicht, ob "action" einen bestimmten Wert hat. Damit kann da praktisch alles stehen.
            Du kannst das Problem recht elegant lösen.
            Normalerweise muss man Variablen die über GET etc. kommen, prüfen ob sie gesetzt wurden und ob der Wert gültig ist.
            Also in etwa so:
            PHP-Code:
            if ( (isset( $_POST"id" ])) && (is_int($_POST"id" ])) ) {
              
            // Auf dem ersten Blick ist alles okay.
              
            $ID $_POST"id" ];

            Nun gibt es aber eine elegantere Lösung. Und zwar diese:
            PHP-Code:
            $ID filter_inputINPUT_POST"id"FILTER_VALIDATE_INT ); 
            Die Variable $ID hat nun einen von 3 möglichen Werten:
            - Wenn eine Zahl angegeben wurde: INT
            - Wenn ein ungültiger Wert (z.B. eine Zeichenkette) angegeben wurde: false
            - Wenn das Feld gar nicht übermittelt wurde: NULL

            Nun musst du im Zweifelsfalle nur noch prüfen, ob $ID eine Zahl enthält.

            Übrigens ... Du verwendest "action" um den zu löschenden Eintrag zu bestimmen. Ich denke nicht, dass das eine so gute Idee ist. Ich bin mir nichtmal sicher, ob das so gewollt ist. Nur mal so als Anmerkung.

            Zum vormals 3ten Punkt:
            Wenn du mit einer ID (eine Zahl) anstatt einer Überschrift (eine Zeichenkette) arbeitest, sollte der = Operator tadellos funktionieren.

            Zum Login:
            Dazu gleich 2 Dinge:
            1. MD5 ist nicht ratsam. Schon gar nicht ohne "Salz". Ich hoffe, ich verstoße jetzt gegen keine Foren-Regel. Daher an die Mods: Sollten die Links die ich hier poste, illegal sein oder gegen die Foren-Regeln verstoßen, entfernt sie bitte. Auf MD5Online kannst du einen MD5-Hash eingeben. Sollte dieser in der Datenbank der Seite gespeichert sein, liefert dir die Seite einen dazu passendes "Passwort". Viele gängige Passwörter wie "passwort", "123456" etc. sind eigentlich enthalten. Darüber hinaus ist auch die Anwendung von SHA1 nicht empfehlenswert. Auf FreeRainbowTables kannst du dir RainbowTables zu MD5 und SHA1 runterladen. Damit sind gängige Passwörter ziemlich schnell enttarnt. Doch selbst von der SHA2-Familie würde ich dir abraten. Denn MD5, SHA1 und die SHA2-Familie sind auf Geschwindigkeit ausgelegt. Das ist leider suboptimal wenn du Passwörter speichern willst. Gute Alternativen sind Hash-Algos, die auf Langsamkeit getrimmt sind. z.B. bcrypt (siehe: Schöner hashen mit bcrypt. Viel Spaß beim Lesen. ;-)
            2. Auch hier filterst du die Angaben nicht. Ein Angreifer könnte mühelos eine SQL-Injection durchführen. Dazu empfehle ich dir Allgemeines - Sicher programmieren - SQL-Injections Teil 1 auf Peterkropff.de

            Ich hoffe, das konnte dir ein wenig helfen.
            Weiterhin viel Erfolg.

            ~ Chris

            Kommentar


            • #7
              Super danke

              ich werde das gleich mal umsetzen
              Übrigens ... Du verwendest "action" um den zu löschenden Eintrag zu bestimmen. Ich denke nicht, dass das eine so gute Idee ist. Ich bin mir nichtmal sicher, ob das so gewollt ist. Nur mal so als Anmerkung.
              das könnte natürlich erklären, warum das bearbeiten auch nicht funktioniert
              ( http://www.php-resource.de/forum/php...bernehmen.html )


              zu3: '
              ja dass funktioniert dann auch war nur zu faul immer mit nem array dann den zur id passenden Rest auszulesen aber habe halt nicht bedacht, dass ja Überschriften öfter vorkommen könnten


              zum Thema Login erstmal danke
              das sind berechtigte Einwände, ich werde dat Login noch einmal Überarbeiten.
              ( hab imo. eh nur ein Account und das pw is denk ich auch net schlecht ( enthält so ziemlich jedes Zeichen )

              Kommentar


              • #8
                Hi CptRiot,

                wenn du dir absolut sicher bist, das nur DU darauf zugreifen darf kannst du das Login auch stark vereinfachen. Es ist zwar kein guter Stil, aber folgendes funktioniert ziemlich gut und du läufst auch nicht Gefahr, dass jemand deine Daten allzu schnell ausliest:

                login.php
                PHP-Code:
                <?php
                  
                require_once( "admin_datas.php" );
                  
                $Username sha1filter_inputINPUT_POST"username" ) );
                  
                $Password sha1filter_inputINPUT_POST"password" ) );

                  if ( (
                $Username == ADMIN_USER) && ($Password == ADMIN_PW ) ) {
                    
                $_SESSION"username" ] = filter_inputINPUT_POST"username" );
                  }
                ?>
                ADMIN_USER und ADMIN_PW wären dann Konstanten die nur in der login.php einbindest. Und die Datei "admin_datas.php" sollte sich an einen Ort befinden, wo definitv niemand sie aufrufen kann.
                Aber wie gesagt: Das ist kein guter Stil. Aber es funktioniert.

                Gruß
                ~ Chris

                Kommentar


                • #9
                  Ja im Moment bin ich mir dessen sicher, aber da das nicht so bleiben soll nehme ich doch lieber bcrypt

                  (versuch jz erstmal den $_GET teil abzusichern und den quarkt mit bearbeiten undso ans laufen zu bekommen )



                  LG
                  Chrischy

                  Kommentar

                  Lädt...
                  X