PHP codeigniter SQL Injection (MSSQL) [duplicato]
Stavo ricevendo il rapporto che mostra che la mia query ha SQL injection, avrei bisogno del tuo aiuto per verificare qualche problema:
- 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?
Come posso impedire l'iniezione SQL se $ POST ['colonna'] è array?
Come conservare i dati come se la persona inserisse
test"><h1>eee</h1>? Devo usarehtmlspecialcharsper archiviare nel database?
Risposte
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.
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.