Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Hab paar grundsätzliche fragen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Hab paar grundsätzliche fragen

    Hallo zusammen

    Bin neu hier und hoff, ich frag nicht das gleiche, wie 99054589389 vor mir.

    Schutz vor sql injection:

    Habe einige Artikel und Tutorials gelesen. Was mich wundert, ist das nie htmlspecialchars angewendet wurde in den Beispielen, die ich gesehen habe.
    Verbindet ihr das nicht mit mysql_real_escape_string??

    Zu OOP:

    mittlerweile trau ich mich langsam an Klassen ran.
    Hab zu Übungszwecken paar Klassen geschrieben, u.a. ne kleine news- Klasse und dabei folgendes entdeckt:

    PHP-Code:
    class News extends MySQL{
            protected 
    $result=array();
            public function 
    writeNews($table,$author,$headline,$text) {
                    
    // stripslashes if magic quotes are on        
                    
    if(get_magic_quotes_gpc()) {
                            
    $text stripslashes($text);
                            
    $author stripslashes($author);
                            
    $headlinestripslashes($headline);
                    }
                    
    // convert lines to html breaks 1st
                    
    $text nl2br($text);
                    
    // escape all strings by mysql routine!
                    
    $table mysql_real_escape_string($table);
                    
    $headline mysql_real_escape_string($headline);
                    
    $text mysql_real_escape_string($text);
                    
    $author mysql_real_escape_string($author);
                    
    $sql "INSERT INTO ".$table."
                              (user, headline, text, date)
                              VALUES
                              ('
    $author', '$headline','$text', NOW());";
                    
    $result $this -> doQuery($sql);
                    if (
    $result) {
                             return 
    true;            
                    }
                    else {
                             return 
    false;
                    }
         }
    ... 
    Bei den Methoden updateNews, addComment, etc muß ich natürlich wieder magic quotes checken, stripslashes,alles escapen.... Geht das nicht eleganter?? Mir ist leider keine Lösung per array eingefallen, aber da geht bestimmt was

    Und zu guter Letzt: Hab mir ne eigene MySQL- Klasse gebastelt.
    Allerdings hab ich noch nicht ausgiebig viel Zeit in die exceptions investiert.
    Benutzt ihr mysqli? Oder eigene Klassen? Deklariert ihr die gar als interface, damit man zusätzlich zum implementieren noch vererben kann oder schließt sich das aus wegen der public Methoden?

    Danke schonmal fürs Lesen

    ___
    edit: Sorry, den quelltext hats verzogen beim Einfügen ausm editor

  • #2
    Willkommen im Forum!

    Wie der Name htmlspecialchars schon sagt, dient dieser Befhel dazu, Sonderzeichen in entsprechende Entitäten umzusetzen. Das ist genau genommen nur für Nicht-Unicodezeichensätze notwendig, die nicht alle Zeichen abbilden können oder für die Ausgabe von HTML-eigenen Zeichen. Mit der Datenbank hat das nichts zu tun.
    mysql_real_escape_string macht dasselbe für Datenbanken: DB-System eigene Zeichen maskieren (escapen), um so nicht die Daten zum Teil der Syntax werden zu lassen.

    Zu stripslashes und get_magic_quotes_gpc gibt es jede Menge Beispiele im Netz, u.a. in den user notes im php Manual. Typisch ist, gleich die Eingabearrays ($_POST, $_GET...) oder besser Kopien davon gleich am Anfang des Scripts pauschal zu behandeln.

    Zur news Klasse: Wenn die $table nicht aus usereingaben stammt, brauchst Du die nicht escapen. Zudem könnte sowas auch die Datenbankklasse übernehmen.

    Zur DB Klasse: Da solltest DU nochmal etwas über OOP lesen.

    Kommentar


    • #3
      das problem hab ich aber auch gehabt, ich hab mir bestimmt schon über 5 verschiedene tutorials angeschaut gehabt, und überall wurde htmspecialchars, entities ect. verwendet. hab vor 2 tagen das erste mal das mysql_real_escape_string gefunden.
      ist das allgemein ein fehler bei vielen tutorials oder ist das eine so sicher wie das andere?
      wenn ich vorher das andere verwendet habe, müsste ich dann alles umbauen um es zu sichern?

      Kommentar


      • #4
        Danke schonmal. Auch für die freundliche Begrüßung!
        Hatte das vor Jahren mal gelesen, daß man mit addslashes und htmlspecialchars escaped vorm in die DB einfügen.

        Werds dann wohl nur noch vor den Useroutput setzen

        @screeze: den ersten meiner Meinung nach richtig guten Artikel zur Sicherheit hab ich hier gelesen. Vielleicht hilfts dir ja auch weiter gruß

        Kommentar


        • #5
          @screeze:
          Nein! htmlspecialchars ist für DB Escaping ungeeignet! Du solltest es umbauen und Dir in diesem Zusammenhang gleich UTF-8 Codierung für Deine Komponenten (Scriptcode, Datenbankfelder...) angewöhnen.

          edit: Sorry, den quelltext hats verzogen beim Einfügen ausm editor
          Versuch mal leerzeichenbasierte Tabs im Editor.

          Kommentar


          • #6
            kleine Korrektur zu #2: htmlspecialchars kümmert sich ausschließlich um & " ' < und >
            Für sonstige Entitäten ist htmlentities zuständig. Allerdings bildet das nur Zeichen innerhalb des angegeben Zeichensatzes ab. Man kann es also nicht dafür nutzen, Zeichen aus anderen Zeichensätzen darzustellen.

            Kommentar


            • #7
              Richtig. Schon wieder verwechselt (wo doch schon entities im anderen Befehl drinsteckt. Gehirn bitte merken). Ein Grund mehr, das nicht für Datenbanken zu verwenden.

              Kommentar


              • #8
                ich hatter immer htmlentities benutzt nicht specialchars, aber das scheints nicht besser zu machen...

                *notiz an mich selbst: traue nie tutorials, auch wenn die aussagen in 6 weiteren damit übereinstimmen*

                Kommentar


                • #9
                  @ Nikosch: werd ich in Zukunft wohl so handhaben. Habs jetzt geändert. Geht eigentlich eh nur um das immer gleiche Wiederholen von mysql_real_escape_string sowie das stripslahes. Wär dankbar, wenn ihr da nen Tip habt, will gern so sauber wie möglich programmieren.
                  Von daher bin ich für jede Form von Kritik offen.

                  Kommentar


                  • #10
                    Ich machs aktuell so.

                    Alle Scripte auf UTF-8, DB auf UTF-8, DB Verbindung dito.

                    Am Anfang ein Bootstrap-Script mit Frontcontroller. Im Frontcontroller oder einer geeigneten Klasse werden Kopien der Superglobalen bereitgestellt, die vorher bei Bedarf (je nach magic_quotes) mit stripslashes behandelt wurden. Zugriff über statische Methoden.

                    Bildschirmausgaben werden mit htmlentities maskiert, Datenbankeingaben mit mysql_real_escape_string. Letzteres übernimmt bei mir die Datenbankklasse (Das kann sinnvoll sein, wenn bspw. mehrere Datenbankverbindungen verwendet werden. Das DB Objekt enthält ja in diesem Fall die aktuelle Verbindungsressource, die man besser für mysql_real_escape_string mit angeben sollte). Bspw. kannst Du ein Array mit zu escapenden Werten übergeben, das später auch direkt mit vsprintf in die Generierung der Query eingehen kann.
                    Bitte beachten: Bei INT-Feld-Angaben in der Query ohne Stringbegrenzer hilft real_escpae nichts. Da sollte man explizite Typumwandlung verwenden oder %d / %f in Verbindung mit printf-kompatiblen Formatstrings oder generell immer alle Feldwerttypen mit ' ' in die Query schreiben.
                    Vgl:
                    PHP-Code:
                    $query 'SELECT ... WHERE id = ' mysql_real_escpae_string ($id);
                    // böse Falle wenn id bspw. '0 OR 1=1' ist

                    // besser:
                    $query 'SELECT ... WHERE id = ' . (int) $id// explizite Typzuweisung

                    // oder:
                    $query sprintf ('SELECT ... WHERE id = %d' $id); 

                    // oder:
                    $query 'SELECT ... WHERE id = "' mysql_real_escpae_string ($id) . '"'

                    Kommentar


                    • #11
                      Ahja *lichtaufgeh* danke
                      den frontcontroller dann als singleton?
                      ints laß ich mit intval "kontrollieren".
                      Benutzt du ein Framework? Oder hast du den Controller etc selbst gescriptet? Wenn ja, wie lange warste da in etwa dran gesessen?
                      Das Zend Framework find ich eigentlich ganz interessant, würd mich interessieren, was ihr davon haltet.

                      Gruß

                      __edit: ups, jetzt hab ich bissl vorgegriffen ^^ besser int als intval? Müßte meiner Meinung nach dasselbe Ergebnis liefern.

                      Kommentar


                      • #12
                        den frontcontroller dann als singleton?
                        Ist i. A. sinnvoll.
                        ints laß ich mit intval "kontrollieren".
                        intval hat aber auch seine Tücken. Wenn, dann mußt Du die Werte neu zuweisen; nur kontrollieren kann fatal sein. Vgl:

                        PHP-Code:
                        <?
                        function check ($test)
                          {
                          if (0 !== intval ($test)) {
                            echo $test;
                            }
                          }
                        check ('A'); // nix
                        check ('42 OR 1=1'); // 42 OR 1=1
                        Zumal 0 aus einer echten 0 Angabe oder einer Nicht-INT Angabe resultieren kann. Das ist auch nicht immer gewünscht. Da wäre bspw. (string) (int) $test === $test genauer. Oder die PHP Filterfunktionen.
                        Benutzt du ein Framework? Oder hast du den Controller etc selbst gescriptet? Wenn ja, wie lange warste da in etwa dran gesessen?
                        Sowohl als auch. Und ich schreibe immer noch Kommt drauf an, wie komplex es werden soll und wieviel Zeit man dafür am Stück lockermachen kann.
                        Das Zend Framework find ich eigentlich ganz interessant, würd mich interessieren, was ihr davon haltet.
                        Kann ich nichts zu sagen.

                        Kommentar


                        • #13
                          Das "Problem" mit mysql_real_escape_string/Injections hast Du übrigens nur, wenn Du die Nutzdaten in das SQL Statement einbaust.
                          INSERT INTO tablename (x,y,z) VALUES (1,2, 'abc')
                          Das muss aber nicht so sein, wenn Du prepared statements und gebundene (benannte) Parameter verwendest. Dann werden das SQL Statement und die Nutzdaten getrennt voneinander übertragen und es kann zu keiner "Verwechslung" durch den Parser im SQL Server kommen.
                          Zitat von basti0681
                          Benutzt ihr mysqli? Oder eigene Klassen?
                          Auf "eigene" Datenbank-Klassen reagiere ich ehrlich gesagt allergisch.

                          Kommentar


                          • #14
                            prepared statements
                            sind natürlich noch besser. Dann erübrigt sich imho auch real_escape.
                            Auf "eigene" Datenbank-Klassen reagiere ich ehrlich gesagt allergisch.
                            Hihi. Warum denn das?

                            Kommentar


                            • #15
                              Zitat von nikosch
                              Hihi. Warum denn das?
                              Weil sie meistens mit einem Wort Schrott sind
                              Das alleine wäre ja noch nicht dramatisch. Aber die meisten ad hoc Datenbanken-Klassen, die ich zu sehe bekomme (auch und gerade hier im Forum), sind entweder so kurz gegriffen, dass sie komplett nutzlos sind (um die API nochmal class { } geschrieben und irgendwas wichtiges dafür weg gelassen) oder so verwuselt, dass sie laut rufen "und jetzt schieße ich mir selbst in den Fuß, mit Ansage und Spotlight". Jeder hat halt seine Reizthemen. Bei PHP sind meine: Datenbank- und Template-Klassen. Bei C waren es String-Klasse #4992834 und alles mit Generic im Klassennamen.

                              Kommentar

                              Lädt...
                              X