CodeIgniter - Sécurité

Prévention XSS

XSS signifie script intersite. CodeIgniter est livré avec la sécurité de filtrage XSS. Ce filtre empêchera tout code JavaScript malveillant ou tout autre code qui tente de détourner des cookies et d'effectuer des activités malveillantes. Pour filtrer les données via le filtre XSS, utilisez lexss_clean() méthode comme indiqué ci-dessous.

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

Vous ne devez utiliser cette fonction que lorsque vous soumettez des données. Le deuxième paramètre booléen facultatif peut également être utilisé pour vérifier le fichier image pour l'attaque XSS. Ceci est utile pour la fonction de téléchargement de fichiers. Si sa valeur est true, cela signifie que l'image est sûre et pas autrement.

Prévention des injections SQL

L'injection SQL est une attaque effectuée sur une requête de base de données. En PHP, nous utilisonsmysql_real_escape_string() fonction pour éviter cela avec d'autres techniques, mais CodeIgniter fournit des fonctions et des bibliothèques intégrées pour éviter cela.

Nous pouvons empêcher l'injection SQL dans CodeIgniter des trois manières suivantes -

  • Échapper aux requêtes
  • Enchère de requête
  • Classe d'enregistrement actif

Échapper aux requêtes

<?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() La fonction ajoute automatiquement des guillemets simples autour des données et détermine le type de données afin qu'il ne puisse échapper qu'aux données de chaîne.

Enchère de requête

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

Dans l'exemple ci-dessus, le point d'interrogation (?) Sera remplacé par le tableau dans le deuxième paramètre de la fonction query (). Le principal avantage de créer une requête de cette manière est que les valeurs sont automatiquement échappées, ce qui produit des requêtes sûres. Le moteur CodeIgniter le fait automatiquement pour vous, vous n'avez donc pas à vous en souvenir.

Classe d'enregistrement actif

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

À l'aide d'enregistrements actifs, la syntaxe de requête est générée par chaque adaptateur de base de données. Il permet également des requêtes plus sûres, car les valeurs s'échappent automatiquement.

Masquer les erreurs PHP

Dans l'environnement de production, nous ne souhaitons souvent pas afficher de message d'erreur aux utilisateurs. C'est bien s'il est activé dans l'environnement de développement à des fins de débogage. Ces messages d'erreur peuvent contenir des informations que nous ne devons pas montrer aux utilisateurs du site pour des raisons de sécurité.

Il existe trois fichiers CodeIgniter liés aux erreurs.

Niveau de rapport d'erreur PHP

Un environnement différent nécessite différents niveaux de rapport d'erreur. Par défaut, le développement affichera les erreurs mais les tests et le live les masqueront. Il existe un fichier appeléindex.phpdans le répertoire racine de CodeIgniter, qui est utilisé à cet effet. Si nous passons zéro comme argument àerror_reporting() fonction alors qui cachera toutes les erreurs.

Erreur de la base de données

Même si vous avez désactivé les erreurs PHP, les erreurs MySQL sont toujours ouvertes. Vous pouvez désactiver cette option dansapplication/config/database.php. Met ledb_debug option dans $db tableau à FALSE comme indiqué ci-dessous.

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

Journal des erreurs

Une autre méthode consiste à transférer les erreurs dans les fichiers journaux. Ainsi, il ne sera pas affiché aux utilisateurs sur le site. Réglez simplement lelog_threshold valeur en $config tableau à 1 po application/cofig/config.php fichier comme indiqué ci-dessous.

$config['log_threshold'] = 1;

Prévention CSRF

CSRF signifie falsification de demandes intersites. Vous pouvez empêcher cette attaque en l'activant dans leapplication/config/config.php fichier comme indiqué ci-dessous.

$config['csrf_protection'] = TRUE;

Lorsque vous créez un formulaire en utilisant form_open()fonction, il insérera automatiquement un CSRF comme champ caché. Vous pouvez également ajouter manuellement le CSRF à l'aide duget_csrf_token_name() et get_csrf_hash()fonction. leget_csrf_token_name() la fonction retournera le nom du CSRF et get_csrf_hash() renverra la valeur de hachage de CSRF.

Le jeton CSRF peut être régénéré à chaque fois pour la soumission ou vous pouvez également le conserver tout au long de la vie du cookie CSRF. En définissant la valeurTRUE, dans le tableau de configuration avec la clé ‘csrf_regenerate’ régénérera le jeton comme indiqué ci-dessous.

$config['csrf_regenerate'] = TRUE;

Vous pouvez également mettre en liste blanche les URL de la protection CSRF en le définissant dans le tableau de configuration à l'aide de la clé ‘csrf_exclude_uris’comme indiqué ci-dessous. Vous pouvez également utiliser une expression régulière.

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

Gestion des mots de passe

De nombreux développeurs ne savent pas comment gérer les mots de passe dans les applications Web, ce qui explique probablement pourquoi de nombreux pirates informatiques trouvent si facile de s'introduire dans les systèmes. Il faut garder à l'esprit les points suivants lors de la gestion des mots de passe -

  • NE stockez PAS les mots de passe au format texte brut.

  • Hachez toujours vos mots de passe.

  • N'UTILISEZ PAS Base64 ou un encodage similaire pour stocker les mots de passe.

  • N'utilisez PAS d'algorithmes de hachage faibles ou cassés comme MD5 ou SHA1. N'utilisez que des algorithmes de hachage de mot de passe forts comme BCrypt, qui est utilisé dans les propres fonctions de hachage de mot de passe de PHP.

  • NE JAMAIS afficher ni envoyer de mot de passe au format texte brut.

  • NE mettez PAS de limites inutiles aux mots de passe de vos utilisateurs.