CodeIgniter - Segurança

Prevenção XSS

XSS significa script entre sites. CodeIgniter vem com segurança de filtragem XSS. Este filtro impedirá qualquer código JavaScript malicioso ou qualquer outro código que tente sequestrar o cookie e realizar atividades maliciosas. Para filtrar dados por meio do filtro XSS, use oxss_clean() método conforme mostrado abaixo.

$data = $this->security->xss_clean($data);

Você deve usar esta função apenas quando estiver enviando dados. O segundo parâmetro booleano opcional também pode ser usado para verificar se há ataque XSS no arquivo de imagem. Isso é útil para facilidade de upload de arquivo. Se o valor for verdadeiro, significa que a imagem é segura e não o contrário.

Prevenção de injeção de SQL

A injeção de SQL é um ataque feito na consulta de banco de dados. Em PHP, usamosmysql_real_escape_string() função para evitar isso junto com outras técnicas, mas CodeIgniter fornece funções embutidas e bibliotecas para evitar isso.

Podemos prevenir a injeção de SQL no CodeIgniter das três maneiras a seguir -

  • Consultas de escape
  • Query Biding
  • Classe Active Record

Consultas de escape

<?php
   $username = $this->input->post('username');
   $query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.
      $this->db->escape($email);
   $this->db->query($query);
?>

$this->db->escape() A função adiciona automaticamente aspas simples ao redor dos dados e determina o tipo de dados para que ele possa escapar apenas dos dados da string.

Query Biding

<?php
   $sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
   $this->db->query($sql, array(3, 'live', 'Rick'));
?>

No exemplo acima, o ponto de interrogação (?) Será substituído pela matriz no segundo parâmetro da função query (). A principal vantagem de construir uma consulta dessa maneira é que os valores são automaticamente escapados, o que produz consultas seguras. O motor CodeIgniter faz isso para você automaticamente, então você não precisa se lembrar disso.

Classe Active Record

<?php
   $this->db->get_where('subscribers_tbl',array
      ('status'=> active','email' => '[email protected]'));
?>

Usando registros ativos, a sintaxe de consulta é gerada por cada adaptador de banco de dados. Também permite consultas mais seguras, pois os valores escapam automaticamente.

Escondendo Erros PHP

No ambiente de produção, muitas vezes não queremos exibir nenhuma mensagem de erro aos usuários. É bom se estiver habilitado no ambiente de desenvolvimento para fins de depuração. Essas mensagens de erro podem conter algumas informações, que não devemos mostrar aos usuários do site por motivos de segurança.

Existem três arquivos CodeIgniter relacionados a erros.

Nível de relatório de erros de PHP

Diferentes ambientes requerem diferentes níveis de relatório de erros. Por padrão, o desenvolvimento mostrará erros, mas o teste e a ativação os ocultarão. Existe um arquivo chamadoindex.phpno diretório raiz do CodeIgniter, que é usado para este propósito. Se passarmos zero como argumento paraerror_reporting() função então que irá esconder todos os erros.

Erro de banco de dados

Mesmo que você tenha desativado os erros do PHP, os erros do MySQL ainda estarão abertos. Você pode desligar isso emapplication/config/database.php. Colocou odb_debug opção em $db matriz para FALSE como mostrado abaixo.

$db['default']['db_debug'] = FALSE;

Log de erros

Outra forma é transferir os erros para arquivos de log. Portanto, ele não será exibido para os usuários no site. Simplesmente, defina olog_threshold valor em $config matriz para 1 em application/cofig/config.php arquivo como mostrado abaixo.

$config['log_threshold'] = 1;

Prevenção CSRF

CSRF significa falsificação de solicitação entre sites. Você pode evitar este ataque ativando-o noapplication/config/config.php arquivo como mostrado abaixo.

$config['csrf_protection'] = TRUE;

Quando você está criando um formulário usando form_open()função, ele irá inserir automaticamente um CSRF como campo oculto. Você também pode adicionar manualmente o CSRF usando oget_csrf_token_name() e get_csrf_hash()função. oget_csrf_token_name() função retornará o nome do CSRF e get_csrf_hash() retornará o valor hash de CSRF.

O token CSRF pode ser regenerado todas as vezes para envio ou você também pode mantê-lo durante toda a vida do cookie CSRF. Definindo o valorTRUE, na matriz de configuração com chave ‘csrf_regenerate’ irá regenerar o token conforme mostrado abaixo.

$config['csrf_regenerate'] = TRUE;

Você também pode colocar URLs na lista de permissões de proteção CSRF, definindo-o na matriz de configuração usando a chave ‘csrf_exclude_uris’como mostrado abaixo. Você também pode usar expressões regulares.

$config['csrf_exclude_uris'] = array('api/person/add');

Tratamento de senha

Muitos desenvolvedores não sabem como lidar com senhas em aplicativos da web, o que provavelmente é o motivo pelo qual vários hackers consideram tão fácil invadir os sistemas. Deve-se ter em mente os seguintes pontos ao lidar com senhas -

  • NÃO armazene senhas em formato de texto simples.

  • Sempre hash suas senhas.

  • NÃO use Base64 ou codificação semelhante para armazenar senhas.

  • NÃO use algoritmos de hash fracos ou corrompidos, como MD5 ou SHA1. Use apenas algoritmos de hash de senha forte, como BCrypt, que é usado nas próprias funções de hash de senha do PHP.

  • NUNCA exiba ou envie uma senha em formato de texto simples.

  • NÃO coloque limites desnecessários nas senhas dos seus usuários.