Ankündigung

Einklappen
Keine Ankündigung bisher.

Zulassung von PHP - Vermeidung von Injections

Einklappen

Neue Werbung 2019

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

  • Zulassung von PHP - Vermeidung von Injections

    Guten Tag,
    ich habe aktuell ein ziemlich - naja - blödes Problem.
    Ich arbeite zurzeit an einem eigenen Projekt, besitze jedoch reichlich wenig Erfahrung. Um die Sicherheit möglichst größtenteils zu gewährleisten,
    verschlüssel ich Kommentare eines Users wie folgt:
    PHP-Code:
    function comments($text) {
            return 
    htmlentities(mysql_real_escape_string(strip_tags($text)));
                } 
    Das Problem dabei ist aber, dass die Ausgaben dann unter anderem
    statt <b> irgendwelche Zeichen ausgeben. Einige der HTML Elemente sollen
    aber erlaubt sein, ohne die Seite zu verunstalten.
    Unter anderem "<b>" aber auch ein (!) Zeilenumbrüche (<br />), wo wir auch beim
    nächsten Problem wären.
    Ich kann leider nicht schauen, wie viele Zeilenumbrüche
    der Nutzer eingibt. Er soll maximal einen Zeilenumbruch eingeben können.

    Wer mir da helfen könnte - das wäre super

    PS: Sollte an der Funktion etwas falsch oder gar die
    ganze Funktion Müll sein, so bitte ich um
    Verzeihung, ich kenne mich da noch nicht allzu sehr aus.

  • #2
    - Eingaben random durch ein paar Escaping-Funktionen zu jagen ist nie gut
    - mysql_ ist veraltet. Steige auf PDO um und nimm Prepared-Statements, dann kannst du dir das escapen sparen
    - Nimm BB-Codes anstatt gewisse HTML-Tags zu erlauben. So kannst du nämlich KOMPLETT HTML verbieten und die Tags dann in gültiges HTML umwandeln
    [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

    Kommentar


    • #3
      Also diese Funktion ist ja wirklich völliger Mist. Hast du einfach mal alle Funktionen, die du irgendwo aufgeschnappt hast (die irgendetwas verhindern sollen), kombiniert?

      Das mysql_real_escape_string() sollte z.B. unmittelbar dann angewendet werden, wenn der String in einem Query verbaut wird (Also vermutlich einem INSERT/UPDATE). Abgesehen davon sollte mysql_* überhaupt nicht mehr verwendet werden, da es ab PHP5.5 veraltet ist. Steige auf mysqli oder PDO um.

      Wenn du den Benutzern die möglichkeit geben möchtest, den Text etwas zu strukturieren bzw zu formatieren, dann verwende dafür am besten eine gesonderte Syntax, wie z.B. Markdown oder BB-Codes (diese werden hier im Forum auch verwendet). Markdown Parser für PHP findest du auch genug im Internet: https://github.com/cebe/markdown

      Kommentar


      • #4
        Also bedeutet das, dass ich meine gesamte Werbsite komplett umbauen muss?
        Wieso kann man kein MySQL mehr verwenden?

        Kommentar


        • #5
          Weil Mysql bald in neueren Versionen nicht mehr unterstützt wird. mysqli und pdo sind mit prepared statements sicherer.

          Kommentar


          • #6
            Ich komme aktuell mit mysqli nicht klar. Naja, was solls.
            Wie sollte ich bei mysqli die Datenbankeingben escapen?

            Kommentar


            • #7
              Du brauchst nicht escapen... schau dir prepared statements an

              update: ich war jetzt mal so dreißt und hab das einfach von einer Website geklaut. http://mattbango.com/notebook/code/p...hp-and-mysqli/

              PHP-Code:

                 
              /* Create a new mysqli object with database connection parameters */
                 
              $mysqli = new mysqli('localhost''username''password''db');

                 if(
              mysqli_connect_errno()) {
                    echo 
              "Connection Failed: " mysqli_connect_errno();
                    exit();
                 }

                 
              /* Create a prepared statement */
                 
              if($stmt $mysqli -> prepare("SELECT priv FROM testUsers WHERE username=?
                 AND password=?"
              )) {

                    
              /* Bind parameters
                       s - string, b - blob, i - int, etc */
                    
              $stmt -> bind_param("ss"$user$pass);

                    
              /* Execute it */
                    
              $stmt -> execute();

                    
              /* Bind results */
                    
              $stmt -> bind_result($result);

                    
              /* Fetch the value */
                    
              $stmt -> fetch();

                    echo 
              $user "'s level of priviledges is " $result;

                    
              /* Close statement */
                    
              $stmt -> close();
                 }

                 
              /* Close connection */
                 
              $mysqli -> close(); 

              Kommentar


              • #8
                PHP-Code:
                return htmlentities(mysql_real_escape_string(strip_tags($text))); 
                Das ist Riesen-Murks.

                - strip_tags "zerstört" HTML. Danach ist ein htmlentities() vollkommen sinnlos, weil es kein HTML markup mehr gibt
                - mysql_real_escape_string als "mittlerer" Befehl ist falsch, das passiert (wenn) immer ganz am Schluss, macht aber nur Sinn wenn man die Daten an die Datenbank sendet. Ansonsten schlichtweg falsch
                - htmlentities => siehe strip_tags, zudem wird es nur benutzt, wenn man HTML an den Browser schickt, welches aus Benutzereingaben stammt (XSS Lücke verhindern)
                Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                Kommentar


                • #9
                  Danke euch.
                  Also gibt es bei MySQLi sozusagen standartmäßig keine Chance auf Injections?
                  Ich sehe schon, ich muss offenbar noch seehr viel wieder ändern...

                  Kommentar


                  • #10
                    Zumindest nicht auf Level 1. Auf Level 2+ schon!

                    Kommentar


                    • #11
                      warum viel ändern? Verwendest du keine Objektorientierte Programmierung?

                      Kommentar


                      • #12
                        Oop != ood

                        Kommentar


                        • #13
                          Zitat von Fuel Beitrag anzeigen
                          warum viel ändern? Verwendest du keine Objektorientierte Programmierung?
                          Ehrlich gesagt programmiere ich wild drauf los, meine Logik habe ich aber,
                          das heißt ich finde alles wieder
                          Wie bereits erwähnt bin ich ja noch Anfänger

                          Kommentar


                          • #14
                            Zitat von Fuel Beitrag anzeigen
                            Weil Mysql bald in neueren Versionen nicht mehr unterstützt wird. mysqli und pdo sind mit prepared statements sicherer.

                            Bitte diese Aussage mit Vorsicht geniessen. MySQL ist weiterhin verwendbar. Nur die mysql-extension nicht. Die wird durch die mysqli-extension oder PDO ersetzt, welche beide jedoch wieder auf die MySQL-Datenbank zugreifen.
                            [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                            Kommentar


                            • #15
                              Zitat von ChristianK Beitrag anzeigen
                              Bitte diese Aussage mit Vorsicht geniessen. MySQL ist weiterhin verwendbar. Nur die mysql-extension nicht. Die wird durch die mysqli-extension oder PDO ersetzt, welche beide jedoch wieder auf die MySQL-Datenbank zugreifen.
                              Danke
                              Was genau ist eigentlich diese Extension?
                              Kann ich also an meiner Seite weiterhin arbeiten?
                              Und wäre jemand so nett mir die Funktion die ich gemacht hatte
                              so zu machen, dass Injetions nicht möglich, aber BB oder HTML
                              Codes einfügbar sind? Das wäre toll!

                              Kommentar

                              Lädt...
                              X