SQL-Abfrage in Array

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

  • SQL-Abfrage in Array

    Hi,

    habe das Ziel eine Url auszulesen, um einen Artikel aus meiner Datenbank auszugeben. Um einer MySqlInjection aus dem Weg zu gehen wollte ich die Tabelle mit den Artikeln in ein Array einlesen (bzw nur die Nummer des Artikels) und dann dieses Array danach durchsuchen lassen. Ist die Überprüfung erfolgreich ist sowohl klargestellt, dass es sich um den richtigen Datentyp handelt (Int) und, dass es diesen Artikel auch gibt. So kann ich bei Attacken oder veralteten Links einen schöden Artikel ausgeben lassen ala "Sorry die Seite gibts nicht".

    Mein Problem ist, dass ich immer nur die erste Zeile der Datenbankabfrage in mein Array bekomme

    Hier der Code:

    PHP-Code:
    ...
    // Adresse in Cleanurl umwandeln
    $cleanurl=substr($HTTP_SERVER_VARS["REQUEST_URI"],1,strlen($HTTP_SERVER_VARS["REQUEST_URI"]));
    list(
    $dummy,$sprache,$google1,$artikelnummer,$sessionid,$google2) = explode("/",$cleanurl);
    ...
    $abfrage    "SELECT id_artikel FROM artikel";
    $erg            mysql_db_query($dbname,$abfrage,$dbverbindung);
    $array        mysql_fetch_array($erg,MYSQL_ASSOC);

    if (!
    in_array($artikelnummer$array)){$artikelnummer=$defaultarticlenumber}

    // Artikel bereitstellen
    $abfrage "SELECT * FROM artikel WHERE id_artikel = '$artikelnummer'";
    $erg                         mysql_db_query($dbname,$abfrage,$dbverbindung);
    $row                         mysql_fetch_array($erg);

    $content                =    $row['inhalt'];
    $ueberschrift        =    $row['ueberschrift'];
    $lastchange            =    $row['letzteaenderung'];
    $artikelgruppe    =    $row['artikelgruppe']; 
    Bin auch für andere Optmierungsvorschläge dankbar.


    PS:
    PHP Version 4.3.10-16
    MySQL Client API version 4.0.24
    Register Globals On (deaktiviere ich noch)
    magic_quotes_gpc on
    safe mode on

  • #2
    [...] die Tabelle mit den Artikeln in ein Array einlesen (bzw nur die Nummer des Artikels) und dann dieses Array danach durchsuchen lassen
    das ist sehr ineffizient und schlecht begründet. mach das nicht.
    Mein Problem ist, dass ich immer nur die erste Zeile der Datenbankabfrage in mein Array bekomme
    http://tut.php-q.net/mysql-select-php.html klärt auf.

    Kommentar


    • #3
      Hi Penizillin,
      danke für Deine schnelle Hilfe.

      Original geschrieben von penizillin
      das ist sehr ineffizient und schlecht begründet. mach das nicht.
      Ich habe das auch etwas blöd geschrieben. Habe erst mit isnumeric() geschaut ob das ein int-wert ist, um so auf legal eingaben zu checken. Genau hätte die Formulierung natürlich lauten müssen, dass ich auf legale Eingaben und die Existenz der übergebenen Artikelnummer prüfen möchte. Eine perfekte Funktion zur Überprüfung auf Injections habe ich bisher nicht gefunden. Mit stripslashes, magicquotes, escapestrings habe ich zwar gute Lösungsansätze ergooglet, aber keines davon scheint mir die absolute Sicherheit zu bringen. Es ja quasi ein blacklisting. Ein Whitelisting ist langfristig immer sicherer da es nicht nachgebessert werden muss. Ich lasse mich aber gerne eines besseren belehren.
      Im Konkreten Anwendungsfall sind es diesmal nur ca. 21 Artikel woran sich auch nichts ändern wird. Ich möchte in diesem Zuge aber gleich eine Lösung erzielen, die ich in Zukunft auch für größere Tabellen verwenden kann.
      Wie handhabst Du denn das so?

      Original geschrieben von penizillin
      http://tut.php-q.net/mysql-select-php.html klärt auf.
      Danke für den Link, durch rumprobieren habe ich mir das schon so vorstellt. Sehe ich das richtig, dass ich auf jeden Fall die Resulttabelle zeilenweise in ein array per while-schleife übergeben muss, um anschliessend in_array() verwenden zu können? Damit könnte ich zwar leben, aber ich hätte gedacht, dass die Daten ja schon so angeordnet sind wie ich sie brauche. Übergebe ich in_array() die Resulttabelle direkt bekomme ich ne Fehlermeldung, dass der Datentyp nicht korrekt sei. Gibts evtl. ne Möglichkeit die Daten mit eine kürzeren Code als der While-schleife direkt zu konvertieren?

      Vielen Dank und Gruß
      Hannes

      Kommentar


      • #4
        Original geschrieben von Skeeve
        Sehe ich das richtig, dass ich auf jeden Fall die Resulttabelle zeilenweise in ein array per while-schleife übergeben muss, um anschliessend in_array() verwenden zu können?
        Du siehst es falsch, wenn du meinst eine "Resulttabelle" zu haben. Du hast bisher eine Ressource-ID, und nichts weiter.
        Du siehst es aber richtig, wenn dir klar ist, dass du dir unter Verwendung dieser Ressource-ID die Daten erst mal beschaffen musst.
        Damit könnte ich zwar leben, aber ich hätte gedacht, dass die Daten ja schon so angeordnet sind wie ich sie brauche.
        Sind sie aber nicht.
        Übergebe ich in_array() die Resulttabelle direkt bekomme ich ne Fehlermeldung, dass der Datentyp nicht korrekt sei.
        Na, siehste ...
        Gibts evtl. ne Möglichkeit die Daten mit eine kürzeren Code als der While-schleife direkt zu konvertieren?
        Noch kürzer ...?

        Tu bitte nicht so, als ob eine Schleife das umständlichste von der Welt wäre.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          hi Skeeve.
          kontrolliere bitte deine erste zeile mit substr und schau bitte kurz docu für diese function.
          ich finde in jedem fall 3-te parameter nicht nur überflüssig, sondern fehlerhaft
          Slava
          bituniverse.com

          Kommentar


          • #6
            wahsaga
            Tu bitte nicht so, als ob eine Schleife das umständlichste von der Welt wäre.
            Hi Wahsaga, das wollte ich gar nicht ausdrücken. Ich wollte nur wissen ob es noch besser geht. Ala func_resid2array($erg) z.B.. Schreib ich mir dann halt selber.

            slava
            kontrolliere bitte deine erste zeile mit substr und schau bitte kurz docu für diese function.
            ich finde in jedem fall 3-te parameter nicht nur überflüssig, sondern fehlerhaft
            Hi Slava,
            werde mir die Doku nochmal ansehen, aber kannst Du mir bitte sagen wieso das fehlerhaft sein soll? Hat bisher bestens geklappt.

            Kommentar


            • #7


              kannst Du mir bitte sagen wieso das fehlerhaft sein soll? Hat bisher bestens geklappt.
              der dritte parameter zeigt Anzahl von Zeichen die ab Position(2-te parameter ) ausgegeben werden.
              Du benutzt dafür aber die lenge von Origenal-String, was natürlich der Anzahl von Zeichen überschreitet.
              Grüße Slava
              Slava
              bituniverse.com

              Kommentar


              • #8
                Original geschrieben von Slava
                der dritte parameter zeigt Anzahl von Zeichen die ab Position(2-te parameter ) ausgegeben werden.
                Du benutzt dafür aber die lenge von Origenal-String, was natürlich der Anzahl von Zeichen überschreitet.
                Grüße Slava
                Oh! Hast Recht. Das habe ich immer falsch gelesen. Danke für den Hinweis.

                Gruß Hannes

                Kommentar


                • #9
                  Habe erst mit isnumeric() geschaut ob das ein int-wert ist [...]
                  nicht ganz - is_numeric() schluckt alles, was man als eine zahl deuten kann - siehe manual.
                  Genau hätte die Formulierung natürlich lauten müssen, dass ich auf legale Eingaben und die Existenz der übergebenen Artikelnummer prüfen möchte.
                  das geht im grunde auch einfacher - du sorgst für eine sichere query und sendest diese ab. ist nichts zurückgekommen - hat der benutzer pech gehabt. mehr zauber lohnt sich i.d.r. nicht.
                  [...] aber keines davon scheint mir die absolute Sicherheit zu bringen.
                  was spricht denn gegen mysql_real_escape_string? warum hältst du es für unsicher?

                  Kommentar


                  • #10
                    Original geschrieben von penizillin
                    was spricht denn gegen mysql_real_escape_string? warum hältst du es für unsicher?
                    Habe selber kein Beispiel dafür, habe zu dem Thema ein paar Threads gelesen und dabei diese Meinung eines Schreibers im Hinterkopf behalten. Der hatte halt die Meinung, dass man nur durch mehrere gezielte Prüfungen für den jeweiligen Einzelfall die absolute Sicherheit erlangen kann. Ich meine, dass das sogar der von o'reilly war. Ich such mal nach dem Link.

                    Der folgende Satz aus der Doku ist doch so zu verstehen, dass die Funktion sicher ist solange man sie verwendet - auch wenn man das nicht immer kann. Oder interpretiere ich das falsch?
                    "This function must always (with few exceptions) be used to make data safe before sending a query to MySQL."

                    Gruß Hannes

                    Kommentar


                    • #11
                      in wie fern man allem glauben soll, was man liest, sei mal dahingestellt.

                      der satz aus dem manual erklärt lediglich den anwendungsbereich dieser funktion.

                      Kommentar

                      Lädt...
                      X