PHP codeigniter SQL Injection (MSSQL) [dupliquer]

Oct 27 2020

Je recevais le rapport indiquant que ma requête a une injection SQL, j'aurais besoin de votre aide pour vérifier un problème:

  1. J'utilisais ceci comme instruction d'insertion
  function insert($table_name, $insert_data)
    {
        $this->db->set($insert_data);
        if ($this->db->insert($table_name)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

par exemple:

$name = 'iamklll'; $status = 1;

  $insert_data = array( 'name' => $name,
                'status' => $status, ); $this->model->insert('table', $insert_data);  

Ce type de méthode ne peut pas empêcher l'injection SQL? Si cela ne peut pas empêcher, je pense que le meilleur moyen est les liaisons de requête?

  1. Comment empêcher l'injection SQL si la $ POST ['column'] est un tableau?

  2. Comment stocker les données comme si la personne insère test"><h1>eee</h1>? Dois-je utiliser htmlspecialcharspour stocker dans la base de données?

Réponses

marcogmonteiro Oct 27 2020 at 18:13

Dans votre cas, vous utilisez le générateur de requêtes $ this-> db-> insert (), cela génère une chaîne d'insertion basée sur les données que vous fournissez et exécute la requête. Vous pouvez passer un tableau ou un objet à la fonction. Toutes les valeurs sont automatiquement échappées, ce qui produit des requêtes plus sûres.

C'est en fait la meilleure option à mon avis. Mieux que d'utiliser les liaisons de requête, surtout parce qu'à long terme, vous devrez peut-être passer de MSSQL à mySQL ou à tout autre moteur et vous n'aurez pas besoin de changer quoi que ce soit dans votre code.

Puisque vous utilisez codeigniter 3, assurez-vous de valider vos données avant de les insérer.

Utilisez le formulaire de validation pour cela: https://codeigniter.com/userguide3/libraries/form_validation.html?highlight=form%20validation

D'après votre exemple, je pense que vous faites également référence aux attaques xxs. Si tel est le cas, vous avez deux options, vous pouvez le faire en validant vos données avec la validation du formulaire à l'aide de la règle XSS. Ou vous pouvez l'activer globalement dans votre application / config / config.php

$config['global_xss_filtering'] = true;

Puisque nous parlons de protéger votre application, vous pouvez également envisager d'utiliser les paramètres csrf dans codeigniter. Cela peut également être fait dans votre fichier config.php.

/*
|--------------------------------------------------------------------------
| Cross Site Request Forgery
|--------------------------------------------------------------------------
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
| checked on a submitted form. If you are accepting user data, it is strongly
| recommended CSRF protection be enabled.
|
| 'csrf_token_name' = The token name
| 'csrf_cookie_name' = The cookie name
| 'csrf_expire' = The number in seconds the token should expire.
| 'csrf_regenerate' = Regenerate token on every submission
| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks
 */
$config['csrf_protection'] = true; $config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name'; $config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = true; $config['csrf_exclude_uris'] = array();

Donc, dans votre cas, l'utilisation du générateur de requêtes est très bien pour empêcher l'injection SQL de ce que vous recherchez réellement.

Yevgen Oct 27 2020 at 18:05

Vous faites référence à la classe Active Record. Il a son propre générateur de requêtes et il suppose de vous protéger des injections SQL de la boîte.

How to store the data as if the person insert test"><h1>eee</h1>

Je pense que vous faites référence à une attaque XSS. Je pense que la meilleure pratique consiste à supprimer toutes les balises à l'exception des balises autorisées . Je ne pense pas que cela htmlspecialcharsaura beaucoup de sens ici pendant que vous allez effectuer une conversion arrière sur la sortie.