Une partie cruciale de la pratique de développement de PHP consiste à garder à l’esprit que la sécurité n’est pas un élément que vous pouvez simplement acheter dans votre dépanneur local. Garantir la sécurité de vos applications Web est un processus qui, au fil du temps, doit être constamment évalué, surveillé et renforcé..
Bien que l’utilisation de filtres et la validation des données fassent partie du processus de sécurité, un développeur Web doit savoir que la randomisation, l’obscurcissement et la cryptographie en PHP peuvent avoir un impact positif sur la sécurité des applications Web. Ce tutoriel vous guidera à travers des techniques simples pour créer et utiliser des valeurs aléatoires ou uniques au sein de vos applications Web, en examinant et en appliquant certaines techniques générales d’obscurcissement, et en approfondissant la science de la cryptologie et son utilisation dans PHP..
Dictionary.com définit la randomisation comme:
"-verb: pour ordonner ou sélectionner de manière aléatoire, comme dans un échantillon ou une expérience, notamment afin de réduire les biais et les interférences causées par des variables non pertinentes; make random."
La génération de nombres aléatoires est déterminée de diverses manières. Toutefois, les générateurs de calcul ne présentent pas le caractère «réel» de l’aléatoire, comme on le voit dans la nature ou dans le bruit électronique (canaux flous, cris, noir et blanc à la télévision). Ces valeurs calculées sont considérées comme pseudo-aléatoires.
PHP nous fournit deux façons différentes de créer des valeurs aléatoires. Regardons quelques-unes des fonctions les plus populaires.
Les deux fonctions rand()
et mt_rand ()
sont probablement les fonctions les plus largement utilisées pour générer un ensemble de nombres aléatoires en PHP. La fonction rand()
; est un ancien générateur, et tombe en panne en raison de mt_rand ()
; qui est plus rapide, plus fiable et peut gérer une valeur entière maximale plus élevée sur certaines plates-formes. La fonction str_shuffle ()
fait exactement ce que vous attendez, il mélange une chaîne qui lui a été transmise.
"; print mt_rand (0, 20); // génère un entier aléatoire compris entre 0 et 20 echo"
"; // Exemples d'utilisation de rand () print rand rand (); // echo par défaut"
"; print rand (0, 25); // génère un entier aléatoire compris entre 0 et 25 echo"
"; // Exemple d'utilisation de str_shuffle $ string = 'abcefghijklmnopqrstuvwxyz'; print str_shuffle ($ string); // remanie $ string?>
le rand()
et mt_rand ()
les fonctions acceptent les deux paramètres où $ min
est le plus petit entier pour commencer, et $ max
étant le plus grand entier pour finir. La fonction str_shuffle
prend un paramètre, une chaîne, générant une mutation aléatoire de la chaîne. C'est comme si vous battiez un jeu de cartes..
Tandis que mt_rand ();
crachera un entier aléatoire, et str_shuffle
va mélanger une chaîne, une fonction largement utilisée pour créer des valeurs uniques aléatoires est uniqid ()
. Cela génère un identifiant unique préfixé basé sur l'heure actuelle en microsecondes (via php.net). L'utilisation de cette fonction est utile pour créer des jetons de session et même des clés de formulaire, comme indiqué dans Sécurisez vos formulaires avec des clés de formulaire..
"; print uniqid (" NETTUTS ", TRUE); // Ajout d'un préfixe supplémentaire et définition de more_entropy sur TRUE?>
La fonction uniqid ()
accepte deux paramètres, le premier ajoute un préfixe aux résultats tandis que le second, s'il est défini sur TRUE, ajoutera une entropie supplémentaire à la fin de la valeur renvoyée.
Il existe un nombre incroyable de milliards d’exemples sur le Web qui génèrent des mots de passe aléatoires, qui y parviennent tous très bien. "Mais pourquoi", vous demandez "aurais-je besoin de générer un mot de passe aléatoire?" Eh bien, la solution, tout simplement, est que vous n'ayez pas à vous fier à l'utilisateur final pour vous fournir un mot de passe moins que sécurisé dès le départ. La génération de mots de passe aléatoires est très utile lors des inscriptions d'utilisateurs, ou lorsqu'un utilisateur fait une demande parce qu'il a oublié son mot de passe. Cela garantit un mot de passe fort au début de l'expérience utilisateur de votre site Web ou permet de réduire les lignes de code lorsqu'un utilisateur doit y accéder à nouveau..
Regardons quelques exemples: Exemple 1
Cet exemple mélange une chaîne avec str_shuffle
et retournera une chaîne dans une plage comptée. Donc, si vous voulez générer un mot de passe de 8 caractères, transmettez 8 à la fonction randompassword, ou randompassword (8) à partir de votre code source..
Exemple 2
En comparaison, l'exemple 1 prend une chaîne statique et la mélange, puis la renvoie, l'exemple 2 ajoute une saveur plus dynamique (mmm tasty). Dans l'exemple deux, la chaîne en cours de mélange n'est plus statique, mais change à chaque génération. Alors que le premier exemple est certainement suffisant dans la plupart des cas pour générer un mot de passe fort, le second exemple nous permet de nous assurer que la longueur de la chaîne et les caractères vont changer avec l'utilisation, ce qui réduit considérablement les chances de duplication..
L'application de mots de passe forts dans une application Web dissuadera les utilisateurs de consulter ou de créer un site Web. C'est souvent un compromis entre obtenir le trafic que vous désirez et assurer la sécurité de l'application. Je suggère de permettre à vos utilisateurs de créer leurs propres mots de passe lors de l'inscription, ou de leur permettre de choisir entre les deux.
La salaison des mots de passe est un moyen efficace d'accroître la sécurité de vos comptes d'utilisateurs, même si un attaquant parvient à accéder à votre base de données, s'il le fait correctement. On peut faire valoir qu'avec un accès au sel, un attaquant peut toujours obtenir vos informations d'identification. Bien que cela soit vrai, l'application de certaines techniques de randomisation au stockage des mots de passe rendra ce processus extrêmement difficile, en particulier si le stockage des informations et du contenu de l'utilisateur est divisé en bases de données distinctes..
Là encore, cela relève de la "non-dépendance de l'utilisateur final à se fournir lui-même une sécurité simple". Les utilisateurs utilisent généralement des mots de passe faciles à retenir, et utilisent même les mêmes mots de passe sur plusieurs sites Web (je sais, pas vrai??). Les mots de passe faciles à retenir sont généralement des mots contenus dans un dictionnaire et d'autres types de valeurs (ex. 12345, QWERTY). En tant que développeurs, nous nous moquons souvent de cette pratique, mais nous ne pouvons pas nier que c'est simplement ainsi que les choses se passent..
Pour qu'une application Web utilise un sel dans un mot de passe, l'application doit le stocker quelque part. Il n'est pas recommandé d'utiliser le même sel dans toute une base de données de mots de passe, mais de générer un sel unique par utilisateur. Générer un seul sel pour une base de données entière diminue en fait la sécurité de l'application Web en ce sens que si un attaquant réussit à la casser, tout le schéma est cassé ou, s'il est perdu, rend la base de données inutile. Créer un système d'enregistrement de membre à part entière avec toutes les options qui s'offrent à vous est hors de la portée de ce didacticiel. Cependant, nous allons créer un système simple pour utiliser un exemple. Regardons comment générer un sel et appliquer certaines techniques de randomisation:
Voici la table SQL que nous allons utiliser.
CREATE TABLE IF NOT NOT EXISTS 'utilisateurs' ('usr_id' int (11) NOT NULL AUTO_INCREMENT, 'usr_name' varchar (24) NOT NULL, 'usr_pass' varchar (32) NOT NULL, 'usr_email' varchar (255) NOT NULL, 'usr_salt' varchar (255) NOT NULL, PRIMARY KEY ('usr_id')) ENGINE = MyISAM DEFAULT CHARSET = latin1;
Succès'; else echo 'Échec
'; ?>
Passons en revue le code PHP. Pour que les choses restent simples, nous incluons notre fichier de configuration de base de données. Ensuite, PHP vérifie si le formulaire HTML a été soumis en vérifiant si le $ _POST
les variables ne sont pas vides. S'ils ne sont pas vides, le script échappe aux données de formulaire postées de l'utilisateur et les prépare pour l'insertion dans la base de données. Nous générons ensuite un simple sel en utilisant uniqid ()
et mt_rand ()
et le stocker dans la variable $ salt_gen
. Pour saler notre mot de passe, nous combinons le mot de passe $, puis le sel. Prochaine étape, un moyen de hacher les variables combinées avec md5.
"Mais attendez! Vous avez également ajouté le courrier électronique des utilisateurs à l'avant du combo mot de passe et sel!" Ouaip! Je l’ai fait parce que, si un attaquant parvient à accéder à ma base de données d’une manière ou d’une autre, et le sel, l’attaquant saura de façon certaine que l’adresse e-mail est utilisée dans le hachage du mot de passe est s’ils ont accès à le code source. Comment aléatoire et unique est une adresse email?
Pour compléter le reste du code PHP, nous insérons nos variables dans la table de la base de données dans leurs champs respectifs et donnons à l'utilisateur des informations en cas de succès ou d'échec. Maintenant sur le reste du fichier d’enregistrement, le code HTML
Ici, nous créons un simple formulaire HTML qui va collecter un nom d'utilisateur, un email et un mot de passe d'un utilisateur. Rien d'extraordinaire ici.
Nous avons donc maintenant un simple formulaire d’inscription, qui insère un utilisateur dans la base de données avec son mot de passe salé. Créons une page de connexion qui nécessitera de récupérer des informations de la base de données et d’authentifier l’utilisateur. D'abord le PHP:
Yippie, nous sommes authentifiés!'; else echo 'Oh non, nous ne sommes pas authentifiés!
'; else echo 'Oh non, nous ne sommes pas dans la base de données!
'; ?>
Fondamentalement, ce que nous faisons dans le fichier login.php consiste à prendre les variables de formulaire soumises, à saisir la ligne de table associée au nom d'utilisateur et à reconstruire le mot de passe à partir des éléments de la base de données avec laquelle il a été créé (email, pass, salt) et de les rediffuser. . Nous vérifions ensuite à nouveau le nom d'utilisateur ET la valeur du mot de passe rehashed dans la base de données pour trouver une correspondance, en indiquant l'utilisateur en cas de succès ou d'échec. Enfin voici le code HTML:
Une définition simple mais complexe de l'obscurcissement est (utilisez la version contenue dans le source si vous souhaitez exécuter le code):
Comme vous pouvez le constater, ce code ne doit pas être distingué. Il n'y a pas de noms de variables distincts, pas de commentaires, pas d'espacement, pas d'indentation, pas d'ordre distinct et tout cela sur une seule ligne. Même si nous ne pouvons pas distinguer le code, nos machines savent toujours ce que c'est. Ça marche. Cette ligne de chaos évoque simplement "L’obfusction est une technique utilisée pour compliquer le code de telle sorte qu’elle ne soit pas compréhensible." Oui, je connais les erreurs.
L'obfuscation a des avantages et des inconvénients. Son but est de dissuader une personne de découvrir ce que fait le code d'un coup d'œil ou pendant une période donnée. C'est un avantage pour les personnes peu ou pas familiarisées avec le langage de programmation. Cependant, toute personne ayant une connaissance de base de PHP peut diffuser le code obfusqué ci-dessus et comprendre ce qu'il fait. Cela peut prendre un peu de temps. C'est l'une des failles de l'obfuscation, ce n'est pas une forme de cryptage, c'est juste une tentative d'être cryptique. L'obscurcissement ajoute aussi normalement à la taille du fichier. Souvent, vous rencontrez du code obscurci dans des logiciels propriétaires et malveillants.
C'est une question commune. Il existe principalement deux façons d’obscurcir votre code. Tout d'abord, vous pouvez le faire à la main. L'écriture de code obfusqué prend beaucoup de temps. L’exemple utilisé dans cet article a pris un certain temps à écrire pour les mêmes raisons que vous utilisez l’obscurcissement (manque de structure, d’ordre, etc.), cela a même entraîné des erreurs insignifiantes que je ne voulais même pas traquer. et réparer. La deuxième façon de masquer votre code consiste à acheter un logiciel qui le fait pour vous. Utiliser un programme pour obscurcir le code est trivial et coûte bien sûr de l'argent très souvent. Certains logiciels qui prétendent masquer votre code le chiffrent et / ou le codent de manière à ce qu’il se base sur une poignée de main pour fonctionner. Vous trouverez souvent des logiciels dont le fournisseur ne garantit même pas que votre code fonctionnera une fois terminé. Même dans l'exemple, j'ai utilisé un simple Base64
fonction pour encoder la construction de la sortie du script.
Cela dépend vraiment de votre plan. En particulier si vous souhaitez vendre votre script PHP (ou tout autre logiciel), vous devez le concéder sous licence. Cela constituera l’un des moyens de défense de première ligne pour empêcher le public visé par les logiciels de faire ce qu’ils veulent. Un excellent exemple de licence peut être vu dans le wiki d'Envato Marketplace. Toutefois, vous pouvez vouloir masquer tout ou partie de votre code pour une raison quelconque. Cependant, en raison des inconvénients liés aux obscurcissements, si vous vous inquiétez vraiment de la sécurité de votre code source, il peut être intéressant de chercher plutôt le cryptage..
Wikipedia.com définit la cryptographie comme suit:
"la pratique et l'étude de la dissimulation d'informations."
La cryptographie est un gros problème, que vous en soyez conscient ou non. Dans presque toutes les applications Web actuellement déployées, la cryptographie est utilisée (par exemple, les clients de messagerie et les sites Web). En tant que développeurs, nous devons être informés et conscients des applications pratiques de la cryptographie au sein de nos logiciels. PHP nous fournit des fonctions très fondamentales et pratiques que nous pouvons utiliser pour chiffrer des données. Dans cette section, je vais principalement passer en revue les algorithmes de hachage unidirectionnel, bien que je touche légèrement au cryptage basé sur une clé symétrique. Il y a beaucoup plus (par exemple, stéganographie, clé asymétrique pour nommer un couple).
Très souvent, nous utilisons le hachage unidirectionnel pour stocker en toute sécurité les mots de passe et vérifier l'intégrité des données des fichiers. Pendant que nous procédons de la sorte, pour authentifier les membres d’une application Web, nous hachons le mot de passe entré par les utilisateurs et nous le comparons au hachage stocké par les utilisateurs. La même technique s'applique à la vérification de l'intégrité des fichiers.
SHA-1, 2 et 3
La famille des algorithmes de hachage SHA est actuellement la plus populaire, de manière significative SHA-1. Même si l’algorithme SHA-1 peut avoir une faiblesse, il est encore largement utilisé.
"; echo $ hash2."
"; // La sortie sera: 42d2f15c3f92d28d7d58776e5d81b800f662cc6c?>
En PHP, SHA-2 est appelé de manière différente et requiert PHP 5 supérieur ou égal à 5.1.2. SHA-2 est supérieur à SHA-1 et peut être appelé avec différentes tailles de bits.
"; echo $ hash_sha384."
"; echo $ hash_sha512."
? « ; / * Sorties repspectively: SHA256: 09074adc0d70e15b88494643e29c2836e1ab94a21989691dec594cb0bd742ebc de SHA384: 8535470750df54a78701d4bfe0451f9799057a5bc101944a32480d2436e8b95440bce3bcab3f9ce107b0b92d9595ae32 SHA512: c2e6dce873a71800b862791e56b480b976bb26cd3136c02da510c3905caa49b7b9e9260549976e1e741cc93e4569a611f2030d3b7104c6c6c2ff9e6c9bf0946a * />
La fonction de hachage est appelée par hash (algorithme, chaîne); Dans les versions les plus récentes de PHP, la fonction hash () peut être utilisée pour appeler n’importe quel algorithme de hachage unidirectionnel pris en charge par PHP (par exemple, md5, sha-1, haval, ghost). Si vous voulez voir une liste de tous les algorithmes de hachage enregistrés, vous pouvez utiliser:
= 5.1.2 print_r (hash_algos ()); ?>
SHA-3 est toujours en cours de développement et est envisagé pour la normalisation L'Institut national des normes et de la technologie a lancé un concours visant à trouver le bon candidat pour le nouvel algorithme de hachage sécurisé. Les inscriptions au concours ont été fixées au 31 octobre 2008. Une inscription assez populaire, Skein, dispose d'un module PHP disponible. vous pouvez télécharger (bien que vous deviez le compiler vous-même). Skein est développé par de grands noms de l'industrie de la sécurité tels que Bruce Schneier, Niels Ferguson et Stefan Lucks, pour n'en nommer que quelques-uns. Le site officiel de Skein peut être trouvé ici.
Les méthodes de chiffrement à clé symétrique sont les endroits où la sécurité du chiffrement réside principalement dans une clé partagée entre deux points, où les données sont chiffrées et où les données sont déchiffrées. Le tutoriel "Créer une classe Crypter avec PHP" de Christian Beikov fournit un très bon exemple de la façon dont cela peut fonctionner..
HMAC est essentiellement un mélange de hachage unidirectionnel et de chiffrement à clé. La sécurité HMAC repose sur la taille de la clé utilisée et sur la force de la fonction de hachage avec laquelle elle est calculée. Vous pouvez un peu comparer cette méthode au salage des mots de passe.
";?>
Eh bien quel voyage! Randomiser les valeurs, générer des mots de passe aléatoires, saler, stocker et authentifier les utilisateurs, obscurcir les apparences, crypto… semble prendre beaucoup de temps. Il est important de savoir quel type de sécurité vous allez mettre en œuvre dans vos applications Web et comment vous allez le protéger. De plus, il est important de garder une attitude intelligente vis-à-vis de ces implémentations et de ne pas penser que la sécurité ne peut être mise en œuvre que par quelques méthodes, mais par une combinaison de ces méthodes, avec une pointe de créativité..