PHP codeigniter SQL Injection (MSSQL) [duplicato]

Oct 27 2020

Stavo ricevendo il rapporto che mostra che la mia query ha SQL injection, avrei bisogno del tuo aiuto per verificare qualche problema:

  1. Lo stavo usando come istruzione di inserimento
  function insert($table_name, $insert_data)
    {
        $this->db->set($insert_data);
        if ($this->db->insert($table_name)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

per esempio:

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

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

Questo tipo di metodo non può impedire l'iniezione di SQL? Se ciò non può impedire, penso che il modo migliore sia i binding di query?

  1. Come posso impedire l'iniezione SQL se $ POST ['colonna'] è array?

  2. Come conservare i dati come se la persona inserisse test"><h1>eee</h1>? Devo usare htmlspecialcharsper archiviare nel database?

Risposte

marcogmonteiro Oct 27 2020 at 18:13

Nel tuo caso stai usando il generatore di query $ this-> db-> insert () questo genera una stringa di inserimento in base ai dati forniti ed esegue la query. È possibile passare un array o un oggetto alla funzione. Tutti i valori vengono sottoposti a escape automaticamente producendo query più sicure.

Questa è in realtà l'opzione migliore secondo me. Meglio che usare le associazioni di query, specialmente perché a lungo termine potresti dover cambiare da MSSQL a mySQL o qualsiasi altro motore e non avrai bisogno di cambiare nulla nel tuo codice.

Dato che stai usando codeigniter 3 assicurati di convalidare i tuoi dati prima di inserirli.

Usa la convalida del modulo per quello: https://codeigniter.com/userguide3/libraries/form_validation.html?highlight=form%20validation

Dal tuo esempio penso che ti riferisci anche agli attacchi xxs. In tal caso, hai due opzioni, puoi farlo mentre convalidi i tuoi dati con la convalida del modulo utilizzando la regola XSS. Oppure puoi attivarlo globalmente nella tua applicazione / config / config.php

$config['global_xss_filtering'] = true;

Dato che stiamo parlando di proteggere la tua app, potresti anche prendere in considerazione l'utilizzo delle impostazioni csrf in codeigniter. Questo può essere fatto anche nel tuo file 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();

Quindi, nel tuo caso, utilizzare il generatore di query va bene per impedire l'iniezione SQL di quello che stai effettivamente cercando.

Yevgen Oct 27 2020 at 18:05

Ti riferisci alla classe Active Record. Ha un proprio generatore di query e si suppone di proteggerti dalle iniezioni SQL dalla scatola.

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

Penso che ti riferisci all'attacco XSS. Credo che la migliore pratica sia quella di eliminare tutti i tag tranne i tag consentiti . Non penso che htmlspecialcharsavrà molto senso qui mentre eseguirai la conversione all'indietro sull'output.