PHP codeigniter SQL Injection (MSSQL) [duplicado]

Oct 27 2020

Estava recebendo o relatório que mostra que minha consulta tem injeção de SQL, precisaria da sua ajuda para verificar algum problema:

  1. Eu estava usando isso como a instrução de inserção
  function insert($table_name, $insert_data)
    {
        $this->db->set($insert_data);
        if ($this->db->insert($table_name)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

por exemplo:

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

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

Esse tipo de método não pode impedir a injeção de SQL? Se isso não puder impedir, acho que a melhor maneira é as ligações de consulta?

  1. Como evito a injeção de SQL se $ POST ['coluna'] é uma matriz?

  2. Como armazenar os dados como se a pessoa os inserisse test"><h1>eee</h1>? Devo usar htmlspecialcharspara armazenar no banco de dados?

Respostas

marcogmonteiro Oct 27 2020 at 18:13

No seu caso, você está usando o construtor de consultas $ this-> db-> insert () que gera uma string de inserção com base nos dados que você fornece e executa a consulta. Você pode passar uma matriz ou um objeto para a função. Todos os valores são escapados automaticamente, produzindo consultas mais seguras.

Esta é realmente a melhor opção na minha opinião. Melhor do que usar as ligações de consulta, especialmente porque no longo prazo você pode precisar mudar de MSSQL para mySQL ou qualquer outro mecanismo e não precisará mudar nada em seu código.

Como você está usando o codeigniter 3, certifique-se de validar seus dados antes de inseri-los.

Use a validação do formulário para isso: https://codeigniter.com/userguide3/libraries/form_validation.html?highlight=form%20validation

Pelo seu exemplo, acho que você também está se referindo a ataques xxs. Em caso afirmativo, você tem duas opções, você pode fazer isso ao validar seus dados com validação de formulário usando a regra XSS. Ou você pode ativar isso globalmente em seu application / config / config.php

$config['global_xss_filtering'] = true;

Já que estamos falando sobre como proteger seu aplicativo, você também pode querer considerar o uso das configurações csrf no codeigniter. Isso também pode ser feito em seu arquivo 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();

Portanto, no seu caso, usar o construtor de consultas é bom para evitar a injeção de SQL daquilo que você está realmente procurando.

Yevgen Oct 27 2020 at 18:05

Você está se referindo à classe Active Record. Ele tem seu próprio construtor de consulta e deve protegê-lo de injeções de SQL desde a caixa.

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

Acho que você está se referindo ao ataque XSS. Eu acredito que a melhor prática é remover todas as tags, exceto as permitidas . Eu não acho htmlspecialcharsque fará muito sentido aqui enquanto você vai fazer a conversão reversa na saída.