Aide - Recherche - Membres - Calendrier
Version complète : faille de securite - injection SQL
Forum osCommerce-fr > Les Bases d'OsCommerce MS2 > Fonctionnement
amonite
Bonjour,

le logiciel d'analyse nommé dans un précedent POST, ma dis que j'avais des failles de sécurité - Injection SQL -, est ce que quelqu'un saurait me dire comment y remédier.

Merci d'avance.

Bonne journée

Code
   • Alimentation :
     </td>
        <td width="40%">  <select name="listbox_alim" style="width:600px;">
              <option name="alim" value="alim" >Aucun(e)</option>
              
                    <?php
                      
        
     $req = "select distinct * from products p, products_description pd, products_to_categories p2c, categories_description cd where p.products_status = '1' and p.products_id = pd.products_id and p.products_id = p2c.products_id and p2c.categories_id = cd.categories_id and cd.categories_id LIKE '1658' order by p.products_price ASC ";
                      $sql = mysql_query($req);
                          while ($data = mysql_fetch_assoc($sql))
                            {
                                $nom_alim = $data['products_name'];
        $prix_alim = round($data['products_price'] * 1.196, 2);
                                $id_alim = $data['products_id'];
        
                                echo "<option value=$id_alim> ".($nom_alim)." - ".($prix_alim)." €</option>";
        
       }                    
                      ?>                        
               </select>
           </td>
           </tr>  
          
            <tr>
        <td width="60%" style="font-size:12px">
Gnidhal
Les failles de sécurité injection sql se font généralement via le paramètre $_GET.
Il convient donc de gérer la variable GET en filtrant tout ce qui n'est pas attendu et en formatant les valeurs attendues.
Un exemple si tu passes products_id en get, tu peux simplement dégager tout ce qui n'est pas attendu par un filtre du genre :
$products_id = (int)$_GET['products_id'];
et en ne passant à ta requête que la valeur traduite :
WHERE products_id = '$products_id'
la valeur de products_id ne pouvant être qu'un entier, cela élimine de fait les chaines qui pourraient s'injecter dans la requête via products_id.
d'autres possibilités de protection existent via les fonctions existantes dans la 2.3.1 :
Code
  function tep_output_string($string, $translate = false, $protected = false) {
    if ($protected == true) {
      return htmlspecialchars($string);
    } else {
      if ($translate == false) {
        return tep_parse_input_field_data($string, array('"' => '&quot;'));
      } else {
        return tep_parse_input_field_data($string, $translate);
      }
    }
  }

  function tep_output_string_protected($string) {
    return tep_output_string($string, false, true);
  }

  function tep_sanitize_string($string) {
    $patterns = array ('/ +/','/[<>]/');
    $replace = array (' ', '_');
    return preg_replace($patterns, $replace, trim($string));
  }

qui permettent de protéger les paramètres entrants.
A toi de voir comment procéder selon tes scripts.
FoxP2
Le code cité ne fait pas partie du code de base osCommerce.
C'est une adaptation personnalisée.
La sécurité du script n'est pas en cause.
Par conséquent, le sujet est déplacé en section fonctionnement
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2013 Invision Power Services, Inc.