Pergunta

Eu apenas herdei um projeto porque a última desenvolvedor esquerda. O projeto é construído fora do Code Igniter. Eu nunca trabalhei com Code Igniter antes.

Eu levei um rápido olhar para o código e vejo chamadas de banco de dados no controlador como este:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$_POST['user_name']."'");

ou chamadas como este:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$this->input->post('username')."'");

código faz ignição higienizar automaticamente essas consultas para evitar a injeção de SQL?

Foi útil?

Solução

CodeIgniter foge as variáveis ??que passam ao usar o método $this->db->query. Mas só quando você passar as variáveis ??como liga, aqui está um exemplo:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '?'", array($this->input->post('username')));

Lembre-se também que $_POST não deve ser preferido sobre $this->input->post desde que ele faz é verificar se as variáveis ??existe para evitar erros.

Outras dicas

CodeIgniter fornece uma string poucos escapar funções em sua camada de banco de dados.

CI manual :

É uma boa prática de segurança para escapar de seus dados antes de enviá-lo em seu banco de dados. CodeIgniter tem três métodos que o ajudam a fazer isso:

  1. $ this-> db-> escapar () Esta função determina o tipo de dados para que ele possa escapar apenas dados de cadeia. Ele também adiciona automaticamente aspas simples em torno dos dados para que você não tem que:

    $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
    

Eu ia postar os outros dois exemplos, mas eu não gostaria de ter toda a diversão de ler o manual.

Não, o código que você postou é suscetível a injeção de SQL. Você precisa usar consulta vinculativa para construir suas consultas SQL. Se você estiver usando a biblioteca CI DB, você codificá-lo algo como isto (exemplo do guia do usuário):

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";

$this->db->query($sql, array(3, 'live', 'Rick')); 

Não, CodeIgniter não higienizar magicamente consultas que foram construídos como esta.

De acordo com documentos da CI aqui , o quadro filtros de pós em construção controlador. Também opcionalmente não XSS filtragem, quer chamando manualmente a função ou definir uma configuração global.

Eu nunca usei CI quer exceto apenas para brincar com ele, então eu não tenho certeza de quão longe eu confio isto.

Isso não escapa nada. Você é melhor fora de alterá-lo para a sintaxe ligamento ou a registro ativo sintaxe

Você deve usar $ this-> input-> post, obrigatório de consulta e registro ativo para ter os dados mais seguros e, em seguida, ainda, teste teste teste para ter certeza.

Use registro ativo para a segurança e mais fácil de codificação:

Em vez de:

  $dbResult = $this->db->query("SELECT * FROM users WHERE username'".$_POST['user_name']."'");

Use (o mesmo resultado):

$this->db->where('username',$this->input->post('user_name');
$dbResult = $this->db->get('users');

Pode ser uma dor, mas você deve converter as suas consultas para registro ativo.

Eu estou copiando a partir do manual CodeIgniter: "Além de simplicidade, um grande benefício para usando o Active Record apresenta é que ele permite que você crie aplicativos independentes de banco de dados, já que a sintaxe de consulta é gerado por cada adaptador de banco de dados. Ele também permite mais seguro consultas, uma vez que os valores são escapados automaticamente pelo sistema . "

E como algumas pessoas já disse, sim este código é suscetível a injeção de SQL

Optimizado com um segundo post param (TRUE) para XSS filtro no nível de entrada:

$this->db->where('username',$this->input->post('user_name', TRUE);
$dbResult = $this->db->get('users');

bibliotecas / input.html

Os docs para (pelo menos) 2.2 estado, em um grande caixa vermelha:

Embora Active Record vai tentar o seu melhor para citar adequadamente qualquer campo e nomes de tabela que você alimentá-lo, note que não é projetado para trabalhar com a entrada do usuário arbitrário. Não alimentá-lo com os dados do usuário unsanitized.

Qual a este programador meios "não dependem de Active Record para citar qualquer ".

Usando a função de escape para injeção de CI

<?php $username = $this->input->post('username');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.$this->db->escape($email);
$this->db->query($query);?>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top