Matthez: Eine SQL-Abfrage per GET.

Hallo,

ich bin am verzweifeln. Schon seit Stunden suche ich die passende Antwort auf meine Frage.

Kurz zur Erklärung: Ich möchte mir eine autonome Bildergallerie erstellen. Ich könnte zwar eine vorgefertigte nehmen, jedoch bei eventuellen Änderungen an der Struktur würde ich dann wieder total durcheinander kommen. So habe ich mir gedacht, mach es selbst, dann kennste deinen Code.

Zudem muss ich sagen das ich Anfänger bin.

Jetzt aber mal zu meiner Frage:

Eine Script soll untersuchen ob die gerade erhaltene $_GET Anweisung überhaupt in der Datenbank steht. Klingt simpel ist für mich aber im Moment echt nicht zu bewältigen.

Das ist ein Code auszug:

<?

include("dbconnect.php");

$check = mysql_query("SELECT id FROM gallery WHERE title LIKE "$_GET["date"]"");

include("dbdisconnect.php");

echo $check

?>

Die If-Abfrage würde dann dorthin kommen wo jetzt der Echo steht. Aber das wäre dann kein Problem.

Achso zur Erklärung: die dbconnect.php und dbdisconnect.php funktionieren und bauen die Verbindung zur Datenbank auf und wieder ab.

Als Anwendungsbeispiel:

Später gebe ich z.B. einfach den Titel meiner Bildergallerie in der URL ein, z.B. bilder.php?titel=urlaub so und er soll dann erstmal überprüfen ob es den titel urlaub überhaupt gibt. wenn nicht soll er dann auf bilder.php weiterleiten wo dann die Auflistung aller verfügbaren galleries zu finden ist.

vielen dank im vorraus, und bitte entschuldigt meine rechtschreibfehler sowie die kleinschreibung aber ich bin echt alle.

;-)

Gruß

  1. Hello,

    na hoppla, ein neuer Pflegefall ;-)

    Eine Script soll untersuchen ob die gerade erhaltene $_GET Anweisung überhaupt in der Datenbank steht. Klingt simpel ist für mich aber im Moment echt nicht zu bewältigen.

    Du rufst also ein PHP-Script auf, und überträgst diesem Script per URi einen Parameter mit dem Namen "date". Beachte bereits jetzt, dass Andere als Wert für diesen Parameter reinschreiben könnten, was sie wollen, also auch gemeine Sachen.

    Da Du den übertragenen Wert direkt als Bestandteil einer SQL-Abrage einsetzt, könnte eine SQL Injection stattfinden (such mal im Archiv nach dem Begriff!).

    Du solltest den übertragenen Parameter "date" also vorher auf Plausibilität prüfen und außerdem maskieren (such mal im Archiv nach 'SQL maskieren') und lese Dir
    http://de2.php.net/manual/en/function.mysql-real-escape-string.php
    und
    http://de2.php.net/manual/en/function.get-magic-quotes-gpc.php
    nebst weiterführender Links durch.

    <?php
         error_reporting(E_ALL);  ## Damit Dir Deine Versäumnisse auch gemeldet werden

    include("dbconnect.php");

    if(isset($_GET["date"]))   ## Wurde ein Parameter mitn Namen date per GET übertragen?
       {
         ...

    $check = mysql_query("SELECT id FROM gallery WHERE title LIKE "$_GET["date"]"");

    --------------
       # siehe mysql_real_escape_string()

    if (mysql_errno($con) == 0)       ## War das Query erfolgreich?
       {
         ...
       }
       else
       {
         echo "MySQL-Fehler: ".mysql_error($con);
       }

    include("dbdisconnect.php");

    echo $check

    # $check ist nun ein Handle einer Result-Ressource, wenn es nicht false ist.
       # Wenn man wissen will, was im Ergebnis drinsteht, muss man das erst Zeile für Zeile
       # aus dem Resultset herausholen

    while($_rec = mysql_fetch_assoc($check))
       {
         echo "<p>{$_rec['id']}</p>\n";
       }

    ?>

    So ungefähr als Fahrplan...

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. Hallo,

      vielen vielen Dank euch beiden.

      Der SQL Injection Angriff ist doch nur bei dem Username und oder Passwort interessant, oder? Weil ich mit dem Parameter "date" eigentlich nur den Titel der Bildergallerie auslesen möchte. Oder gehe ich richtig in der Annahme das eine Art Zugriffsbombardierung stattfinden kann?

      <?

      include 'content/d0029998-c.php';

      $sql='SELECT * FROM gallery WHERE title = "'.mysql_real_escape_string(trim($_GET['date'])).'"';

      $result = mysql_query($sql) or die('<hr>'.mysql_error().'<hr>'.$sql.'<hr>');

      $sqk='SELECT * FROM gallery';

      $resukt = mysql_query($sqk) or die('<hr>'.mysql_error().'<hr>'.$sql.'<hr>');

      mysql_close($connection);

      if(isset($_GET["date"]))

      {

      if(mysql_num_rows($result) > 0)

      {

      echo 'Hier erscheint dann später die Abfrage der Gallerydatenbank '.htmlentities($_GET['date']).'.';

      }

      else

      {

      while($row = mysql_fetch_object($resukt))

      {

      echo "<a href='test.php?date=$row->title' target='_self'>$row->title</a><br>\n";

      }

      }

      }

      else

      {

      while($row = mysql_fetch_object($resukt))

      {

      echo "<a href='test.php?date=$row->title' target='_self'>$row->title</a><br>\n";

      }

      }

      ?>

      Damit habe ich jetzt mein Ziel erreicht. Nur wie ich mein Glück kenne wieder viel zu umständlich oder?

      Trotzdem erstmal vielen vielen Dank. Ich rieche förmlich dass das was wird. ;-)

      1. Hi,

        Der SQL Injection Angriff ist doch nur bei dem Username und oder Passwort interessant, oder?

        Du willst doch testen, ob Dein Ding überhaupt in der Datenbank drinsteht.

        'SELECT * FROM gallery WHERE title = "'.$_GET['date'].'"'

        Stell Dir vor, ich rufe das Script so auf, daß date den Wert
        " OR "" = "
        hat, auf.

        Dann käme bei der Datenbank an:
        SELECT * FROM gallery WHERE title = "" OR "" = ""

        Die WHERE-clause ist dann immer true, da der zweite Operand des OR immer true ist - es werden alle Datensätze ausgelesen.

        SELECT * solltest Du auch nicht verwenden - gib die Spalten an, die Du haben willst.

        if(mysql_num_rows($result) > 0)

        [...]

        else
            {
                while($row = mysql_fetch_object($result))

        Du willst als dann die Zeilen des Ergebnisses auslesen, wenn es keine Zeilen gibt?
        Denn die Schleife wird ja - dank mysql_num_rows($result) > 0 und else - nur erreicht, wenn keine Ergebnisse vorhanden sind.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  2. Moin!

    »» Das ist ein Code auszug:
    »» <?
    »»  include("dbconnect.php");
    »»  $check = mysql_query("SELECT id FROM gallery WHERE title LIKE "$_GET["date"]"");
    »»  include("dbdisconnect.php");
    »»  echo $check
    »» ?>

    <?php
      include 'dbconnect.php'; # ist keine Funktion

    /*
      $check = mysql_query("SELECT id FROM gallery WHERE title LIKE $_GET["date"]"");
      Oh oh!
      */

    /*
      $sql='SELECT id FROM gallery WHERE title = "'.$_GET['date'].'"';
       Das wäre wohl richtige Syntax, aber unsicher, in einer echten
       Webanwendung könnte die Datenbank angegriffen werden.
       Gut finde ich es, dass Du die SQL-Anweisungen GROSS und
       die Daten klein geschrieben hast. Also machen wir es besser:
      */
        $sql='SELECT id FROM gallery WHERE title = "'.mysql_real_escape_string(trim($_GET['date'])).'"';

    $result = mysql_query($sql) or die('<hr>'.mysql_error().'<hr>'.$sql.'<hr>')
      echo 'Es wurden '.mysql_num_rows().' Datensätze zurückgegeben, die '.htmlentities($_GET['date']).' enthalten.
      include 'dbdisconnect.php'; # Äh... da steht nur ein Befehl
                                  #drin...oder? Macht das Sinn?
    ?>

    Schau also

    • mysql_real_escape_string()
    • htmlentities ()
    • trim()
    • die()

    bei PHP.net nach.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development