Ankündigung

Einklappen
Keine Ankündigung bisher.

Sicherheit! nicht sicher?

Einklappen

Neue Werbung 2019

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

  • Sicherheit! nicht sicher?

    Hallo,

    ich als leihe versuche mein wissen zu erweitern und meine abfragen sicherer zu machen.

    im netz habe ich viele erläuterungen gefunden, steige da aber nur schwer durch.

    der folgende code arbeitet nicht mit der funktion mysql_real_escape_string. jedoch werden alle wichtigen "eingänge" maskiert (get, post, cookie).

    PHP-Code:
    // Sucht und erstetzt (böse) Zeichen
    function secure($str)
    {
        
    $str trim($str);
        
    $str str_replace("#","#",$str);
        
    $str str_replace("(","(",$str);
        
    $str str_replace(")",")",$str);
        
    $str str_replace("<","<",$str);
        
    $str str_replace(">",">",$str);

        return 
    $str;
    }


    // Get-Variable filtern mit der Funktion secure
    for(reset($_GET); list($key,$value) = each($_GET);)
    $_GET[$key] = secure($value);
        
        
    // Setzt ein Backslash vor quote in $_POST, $_GET and $_COOKIE Variablen sofern magic_quotes_gpc ausgeschaltet ist
    if(!get_magic_quotes_gpc())
    {
        foreach(
    $_GET AS $key => $value)
        
    $_GET[$key] = addslashes($value);
        
        foreach(
    $_POST AS $key => $value)
        {
              if(
    is_array($_POST[$key]))
              {
                foreach(
    $_POST[$key] AS $key1 => $value1)
                  
    $_POST[$key][$key1] = addslashes($value1);
              } 
            else 
            {
                
    $_POST[$key] = addslashes($value);
            }
        }
        
        foreach(
    $_COOKIE AS $key => $value)
        {
              if(
    is_array($_COOKIE[$key]))
              {
                foreach(
    $_COOKIE[$key] AS $key1 => $value1)
                  
    $_COOKIE[$key][$key1] = addslashes($value1);
              } 
            else 
            {
                
    $_COOKIE[$key] = addslashes($value);
            }
        }

    ich lese jetzt aber überall, dass man auf mysql_real_escape_string nicht verzichten darf, dies tue ich aber wohl bisher. deshalb habe ich die folgende funktion mit eingebaut.

    PHP-Code:
    // SQL Abfragen sicher machen
    function secure_db($value)
    {
        global 
    $db_connect;
        
        
    // stripslashes, falls nötig
        
    if (get_magic_quotes_gpc()) 
        {
            
    $value stripslashes($value);
        }

        
    // quotieren, falls kein integer
        
    if (!is_numeric($value)) 
        {
            
    $value mysql_real_escape_string($value$db_connect);
        }

        return 
    $value

    Wenn nun aber mal ein paar anfragen teste (erstmal über get) sieht dies wie folgt aus.

    PHP-Code:
    // get hat den wert -- \x00 -- also (?test=\x00)
    echo secure_db($_GET['test']).'  <- MIT der secure_db funktion (mysql_real_escape_string)<br><br>';
    echo 
    $_GET['test'].'              <- OHNE die secure_db funktion (mysql_real_escape_string)<br><br>';

    // die ausgabe sieht dann so aus
    //  \\\\x00    <- MIT der secure_db funktion (mysql_real_escape_string)
    //  \\x00      <- OHNE die secure_db funktion (mysql_real_escape_string) 
    wenn ich also mysql_real_escape_string so nutze, werden die werte 3fach mit einem backslash versehen.

    muss ich mysql_real_escape_string also garnicht benutzen oder wende ich diesen code einfach falsch an?

    kann ich nicht eigentlich das erste codebeispiel um mysql_real_escape_string erweitern, so dass ich die secure_db garnicht aufrufen muss?

    bitte schaut mal drüber, ich und mein derzeitiges wissen ist einfach zu beschränkt um es zu 100% zu verstehen oder sicher zu sein.

    grüße


  • #2
    Die Funktion secure() ist irgendwie sinnfrei, oder? Du ersetzt bestimmte Zeichen durch das gleiche Zeichen.

    Dieser Block
    Code:
    if(!get_magic_quotes_gpc()) { 
      // ...
    }
    erscheint mir auch fremd. Normalerweise entfernt man die durch magic_quotes_gpc hinzugefügten Escapezeichen wieder, da man sich selbst um notwendiges Escaping kümmern möchte.

    Dazu wird folgender Code verwendet:
    Code:
    if (get_magic_quotes_gpc() == 1) {
      // Daten mit Hilfe von stripslashes von unnötigen Escapezeichen befreien
    }
    Dies macht auch mehr Sinn, da magic_quotes_gpc als veraltet gekennzeichnet ist, und bald entfernt werden wird.

    Deine secure_db() Funktion sieht schon ganz vernünftig aus. Die Verbindungskennung für die Datenbank würde ich aber nicht als global kennzeichnen, sondern als Parameter übergeben. Zudem solltest du Integer nach int casten
    Code:
    (int)$var
    oder die Variablen durch PHP: intval - Manual schicken.
    http://hallophp.de

    Kommentar


    • #3
      Deine secure_db() Funktion sieht schon ganz vernünftig aus.
      Nein, sieht sie nicht. Denn nicht der Typ der eingehenden Variable ist entscheidend, sondern der für den einbindenden Kontext erwartete Typ.

      Siehe auch: http://aktuell.de.selfhtml.org/artik...ontextwechsel/
      --

      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


      --

      Kommentar


      • #4
        Hmm, ja, das leuchtet ein. Von daher schießt so eine allgemeine Funktion wohl am Ziel vorbei.
        http://hallophp.de

        Kommentar


        • #5
          also ich weis nicht wieso man die mysql_real_escape_string funktion ersetzen will.. man kann die doch einfach benutzen.. gut es ist schon nervig wenn man ständig es eintippen muss zb:

          PHP-Code:
          $username mysql_real_escape_string($_POST['username']);
          $passwort md5($_POST['password']);
          $sql sprintf("SELECT id FROM users WHERE username = '%s' AND password = '%s' ",
          $username,
          $passwort);
          $sql mysql_query($sql); 
          ich habe mir stattdessen eine kleine klasse gebastelt welche mir ALLE werte escaped und die bearbeitete query ausführt

          PHP-Code:
          include 'DataBase.class.php';
          $query "SELECT id FROM users WHERE username ='%s' AND password = '%s' "
          $result DataBase::getInstance()->sql($query,$_POST['username'],md5($_POST['password']));

          while(
          $row mysql_fetch_object($result)){
          echo 
          $row->id;

          wenn interesse besteht, könnte ich die klasse posten. auf jedenfall wollte ich sagen benutz doch einfach mysql_real_escape_string diese funktion wurde nicht umsonst eingebaut

          MFG
          apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

          Kommentar


          • #6
            welche mir ALLE werte escaped und die bearbeitete query ausführt
            Siehe Quelle oben und diverse Beiträge die ich zu diesem Thema verfasst habe, pauschal alles zu escapen ist und bleibt falsch.
            --

            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


            --

            Kommentar


            • #7
              Zitat von nikosch Beitrag anzeigen
              Siehe Quelle oben und diverse Beiträge die ich zu diesem Thema verfasst habe, pauschal alles zu escapen ist und bleibt falsch.
              gut ich könnte noch eine if(is_int()) abfrage einbauen, wärst du dann zufrieden?
              apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

              Kommentar


              • #8
                Nein. Siehe oben. Entscheidend ist nicht der Typ der eingeht.

                PHP-Code:
                $pw 'a OR 1';
                $status 'adminstatus';

                echo 
                "SELECT name WHERE password='$pw' AND adminstatus = $status"
                --

                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                --

                Kommentar

                Lädt...
                X