Ankündigung

Einklappen
Keine Ankündigung bisher.

RealEscape und Mehrzeilige SQL Statements

Einklappen

Neue Werbung 2019

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

  • RealEscape und Mehrzeilige SQL Statements

    Servus,

    aufgrund des Threads von wegen Sicherheit usw. ( http://www.phpfriend.de/forum/ftopic50781.html ) hab ich mal den Rat
    befolgt und führe nun mysql_real_escape standartmäßig vor dem Query aus aber ich bekomme bei mehrzeiligen SQL Satements die zuvor wunderbar
    funktioniert haben einen SQL Fehler nun.

    Wie kann ich das verhindern?

    PHP-Code:
    $SQL "SELECT g.group_id, g.group_name 
                   FROM " 
    USER_GROUP_TABLE " ug, " GROUPS_TABLE " g 
                   WHERE ug.user_id = '" 
    $userdata['user_id'] . "' 
                     AND g.group_id = ug.group_id
                     AND LENGTH( g.group_name ) >0"



    You have an error in your SQL syntax; check the manual that corresponds to your
    MySQL server version for the right syntax to use near '\r FROM forum_user_group ug,
    forum_groups g \r WHERE ug.us'
    Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.


  • #2
    Wo kann man denn die Verwendung von mysql_real_escape_string() bewundern?

    Kommentar


    • #3
      PHP-Code:
      <?php
      public function query($SQL$escape 'real'$unbuffered FALSE)
          {
              if ( !
      is_bool($unbuffered) )
                  throw new 
      MySQLException('param not a boolean');
              
              if (!
      $this->conn)        
                  throw new 
      MySQLConException($this->conn);
                  
              if (
      $this->resource)
                  @
      mysql_free_result($this->resource);
                  
              if (
      $escape == 'real')
              {
                  
      $SQL = @mysql_real_escape_string($SQL);
              }
              elseif (
      $escape == TRUE)
              {           
                  
      $SQL = @mysql_escape_string($SQL);
              }
              elseif (!
      is_bool($escape))
                      throw new 
      MySQLException('param not a string or boolean');
                      
              if (!
      $unbuffered)
              {
                  
      $this->resource mysql_query($SQL$this->conn);
              }
              else
              {
                  
      $this->resource mysql_unbuffered_query($SQL$this->conn);
              }
                      
              if (!
      $this->resource
              {        
                  throw new 
      MySQLIllegalQueryException($this->conn);
              }
          }
      ?>
      Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

      Kommentar


      • #4
        Zitat von HStev
        PHP-Code:
        <?php
        ...
                    
        $SQL = @mysql_real_escape_string($SQL);
        ...
        Du solltest wohl nicht die ganze Query escapen [http://www.php.net/mysql_real_escape_string]... :wink:

        Kommentar


        • #5
          Du darfst nicht die komplette Abfrage mit mysql_real_escape_string bearbeiten sondern nur die Werte, die von Benutzer getätigt werden, da sonst zuviel maskiert wird. Lass dir einfach mal deine aktuelle Abfrage anzeigen, dann wirst du relativ schnell sehen, wo zuviele Backslashes vorhanden sind.

          Kommentar


          • #6
            hmmm da hab ich gar nicht so drauf geachtet das ist aber blöd
            Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

            Kommentar


            • #7
              so umständlich aber das sollte nun funktionieren ...

              PHP-Code:
              <?php
              /**    Bereitet einen SQL Befehl durch escapen der Benutzereingaben sicher vor um SQL Inejctions zu vermeiden
                   *    @param string $SQL Ein SQL Statement
                   *     @param array $secure_values Werte die für das Query vorbereitet werden sollen
                   *    @exception MySQLException Verarbeitungsfehler
                   *    @exception MySQLPrepareException Vorbereitungsfehler
                   */
                  
              public function prepare($SQL$secure_values)
                  {
                      if (!
              is_array($secure_values))
                          throw new 
              MySQLException("param not an array");
                          
                      if (!
              preg_match("/\?/"$SQL))
                          throw new 
              MySQLPrepareException("no placeholder found");
                      
                      
              $this->secure_values_fifo $secure_values;
                      
                      
              $this->prepared_string preg_replace_callback("/\?/", array($this"replace_secure_values_callback"), $SQL); 
                      
                      
              $this->secure_values_fifo NULL;           
                  }
                  
                  
              /**    Callback-Function die die Function prepare für jedes Element im Werte-Array aufrufen lässt
                   *    @param array $treffer ist nötig, aber vollkommen unwichtig
                   *    @exception MySQLPrepareException Vorbereitungsfehler
                   */
                  
              protected function replace_secure_values_callback($treffer)
                  {
                      if (
              count($this->secure_values_fifo) < 1)
                          throw new 
              MySQLPrepareException("not enough secure values");
                          
                      return 
              mysql_real_escape_string(array_shift($this->secure_values_fifo));
                  }
              ?>
              Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

              Kommentar

              Lädt...
              X