PHP est l’un des langages de programmation les plus populaires sur le Web. Parfois, un langage convivial peut trop aider le programmeur et des failles de sécurité peuvent se glisser, créant des obstacles dans le chemin du développement. Dans ce didacticiel, nous allons examiner 5 astuces pour vous aider à éviter les pièges courants de la sécurité PHP et les problèmes de développement..
Au cours du processus de développement, le rapport d’erreur d’application est votre
meilleur ami. Les rapports d'erreur peuvent vous aider à trouver des fautes d'orthographe dans votre
variables, détecter une utilisation incorrecte des fonctions et bien plus encore. Cependant, une fois
le site va vivre le même reportage qui était un allié pendant
le développement peut devenir un traitre et en dire beaucoup plus à vos utilisateurs sur votre
que vous souhaitiez qu'ils connaissent (le logiciel que vous exécutez, votre dossier
structure, etc).
Une fois que votre site est en ligne, vous devez vous assurer de masquer toutes les erreurs.
les rapports. Cela peut être fait en appelant la fonction simple suivante
en haut de votre / vos dossier (s) de candidature.
error_reporting (0);
Si quelque chose ne va pas, vous voulez toujours et devez savoir sur
il. Par conséquent, vous devez toujours vous assurer de consigner vos erreurs dans un journal.
fichier protégé. Cela peut être fait avec la fonction PHP set_error_handler.
Depuis ses débuts, les concepteurs de PHP ont toujours inclus des
fonctionnalités pour faciliter le développement. Ou alors ils ont pensé! Certains d'entre eux
des fonctionnalités utiles peuvent avoir des conséquences inattendues. Je les appelle "mauvais"
caractéristiques "parce qu'ils ont permis des cauchemars de validation des données et
créé un chemin pour que les bugs trouvent leur chemin dans les scripts. Un des
les premières choses que vous devriez faire quand le processus de développement commence est
désactiver certaines de ces fonctionnalités.
Remarque: En fonction de votre hôte, ceux-ci peuvent être désactivés pour
vous. Si vous développez sur votre propre ordinateur ou un autre ordinateur local similaire
environnement, ils ne seront probablement pas désactivés. Certaines de ces fonctionnalités
ont également été supprimés dans la prochaine PHP6, mais sont omniprésents dans PHP4
applications et ne sont obsolètes que dans les applications PHP5.
Register Globals (register_globals)
En bref, register_globals était destiné à aider une application rapide
développement. Prenons par exemple cette URL,
http: //votresite.tld/index.php? var = 1, qui inclut une chaîne de requête. le
La déclaration register_globals nous permet d'accéder à la valeur avec $ var
au lieu de $ _GET ['var'] automatiquement. Cela peut vous sembler utile,
mais malheureusement, toutes les variables du code ont maintenant cette propriété, et
nous pouvons maintenant facilement entrer dans les applications PHP qui ne protègent pas contre
cette conséquence inattendue. L'extrait de code suivant n'est qu'un exemple.
exemple courant que vous verrez dans les scripts PHP:
if (! empty ($ _POST ['nom d'utilisateur'])) && $ _POST ['nom d'utilisateur'] == 'test' &&! vide ($ _POST ['mot de passe']) && $ _POST ['mot de passe'] == "test123 ") $ access = true;
Si l'application est en cours d'exécution avec register_globals ON, un utilisateur peut
il suffit de placer access = 1 dans une chaîne de requête, et aurait alors accès à
quel que soit le script en cours d'exécution.
Malheureusement, nous ne pouvons pas désactiver register_globals du script
côté (en utilisant ini_set, comme nous pourrions normalement), mais nous pouvons utiliser un
.fichiers htaccess pour le faire. Certains hôtes vous permettent également d'avoir un php.ini
déposer sur le serveur.
Désactiver avec .htaccess
php_flag register_globals 0
Désactiver avec php.ini
register_globals = Off
Remarque: Si vous utilisez un fichier php.ini personnalisé qui ne s'applique pas à la
serveur entier, vous devez inclure ces déclarations dans chaque sous-dossier
qui a PHP.
Citations magiques (magic_quotes_gpc, magic_quotes_runtime, magic_quotes_sybase)
Magic Quotes était une fonctionnalité destinée à éviter aux programmeurs la peine de
utilisant addlashes () et d'autres fonctionnalités de sécurité similaires dans leur code.
Il y a au moins trois problèmes associés aux citations magiques. Un
problème avec cette fonctionnalité utile est si les deux citations magiques et
addedlashes () sont utilisés. Si tel est le cas, alors vous vous retrouvez avec
plusieurs barres obliques étant ajoutées, provoquant des erreurs. Le deuxième problème est si
vous faites l'hypothèse citations magiques est activé et il est en fait
ne pas. Ensuite, toutes les entrées sont décochées. Le troisième problème est que la magie
guillemets n'échappe que des guillemets simples et doubles, mais si vous utilisez un
moteur de base de données, de nombreux caractères spécifiques à la base de données
également besoin d'être échappé. Il est recommandé d’utiliser cette option
fonctionnalité et utiliser la validation de variable appropriée à la place (voir ci-dessous).
Malheureusement, nous ne pouvons pas non plus désactiver les guillemets magiques du script.
side en utilisant ini_set. Comme avec register_globals, nous pouvons utiliser .htaccess ou
fichiers php.ini pour le faire.
Désactiver avec .htaccess
php_flag magic_quotes_gpc 0 php_flag magic_quotes_runtime 0
Désactiver avec php.ini
magic_quotes_gpc = Désactivé magic_quotes_runtime = Désactivé magic_quotes_sybase = Désactivé
Remarque: Si vous utilisez un fichier php.ini personnalisé qui ne s'applique pas à la
serveur entier, vous devez inclure ces déclarations dans chaque sous-dossier
qui a PHP.
En plus d'échapper aux personnages, un autre moyen de protéger
l'entrée consiste à le valider. Avec de nombreuses applications, vous avez déjà
savoir quel type de données vous attendez en entrée. Donc, le moyen le plus simple
pour vous protéger contre les attaques est de s'assurer que vos utilisateurs ne peuvent que
entrer les données appropriées.
Par exemple, supposons que nous créons une application qui répertorie les utilisateurs
anniversaires et permet aux utilisateurs d'ajouter leurs propres. Nous voudrons
accepter un mois sous forme de chiffre compris entre 1 et 12, un jour entre 1 et 31 et un an
dans le format de AAAA.
Avoir ce genre de logique dans votre application est simple et régulier
les expressions (regex) sont le moyen idéal pour gérer la validation des entrées.
Prenons l'exemple suivant:
if (! preg_match ("/ ^ [0-9] 1,2 $ /", $ _GET ['mois'])) // erreur de traitement if (! preg_match ("/ ^ [0-9] 1,2 $ / ", $ _GET ['jour']) // gérer l'erreur if (! Preg_match (" / ^ [0-9] 4 $ / ", $ _GET ['année' ])) // erreur de traitement
Dans cet exemple, nous avons simplement vérifié (dans les deux premières déclarations if)
pour les entiers [0-9] avec une longueur d'un ou deux 1,2 et nous avons fait la
idem dans la troisième déclaration if, mais vérifié pour une longueur stricte de 4
caractères 4.
Dans tous les cas, si les données ne correspondent pas au format que nous voulons, nous
renvoyer une sorte d'erreur. Ce type de validation laisse très peu
place pour tout type d'attaque SQL.
Les expressions de regex comme celles ci-dessus peuvent être un peu difficiles à
saisir au début, mais les expliquer est hors du champ de cette
article. Le manuel php a quelques ressources supplémentaires pour vous aider avec la validation. La base de données PEAR contient également quelques packages, tels que le package Validate, pour vous aider avec les emails, les dates et les URL..
Vous trouverez ci-dessous un exemple de script en action utilisant 200 comme entrée pour un mois, abc pour le jour et juste 09 pour l’année..
Une application Web accepte généralement les entrées des utilisateurs et les affiche
en quelque sorte. Cela peut, bien sûr, être sous une grande variété de formes
y compris les commentaires, discussions ou articles de blog au format HTML
code. Lors de l'acceptation d'une entrée, autoriser HTML peut être une chose dangereuse,
parce que cela permet à JavaScript d'être exécuté de manière inattendue.
Si même un trou est laissé ouvert, JavasScript peut être exécuté et les cookies
pourrait être détourné. Ces données de cookie pourraient ensuite être utilisées pour simuler une véritable
compte et donner à un utilisateur illégal l'accès aux données du site.
Il existe plusieurs moyens de vous protéger de telles attaques. Un
façon est de rejeter le code HTML complètement, car alors il n'y a pas de possible
moyen d'autoriser l'exécution de JavaScript. Cependant, si vous faites cela alors
le formatage est également interdit, ce qui n'est pas toujours une option pour les forums
et logiciel de blog.
Si vous voulez que le HTML soit en grande partie désactivé, mais que vous souhaitiez toujours
formatage, vous ne pouvez autoriser que quelques balises HTML sélectionnées (sans
attributs) tels que ou . Ou bien,
vous pouvez autoriser un ensemble populaire de balises appelées "BBCode" ou "BB Tags"
couramment vu sur les forums dans le format de [b] test [/ b]. Cela peut être un
moyen idéal pour permettre une certaine personnalisation de la mise en forme tout en interdisant
quelque chose de dangereux. Vous pouvez implémenter le BBCode en utilisant des
des packages tels que HTML_BBCodeParser ou écrivez votre propre implémentation BBCode avec des expressions régulières et une série d'instructions preg_replace.
Dernier point, mais non le moindre, l'une des attaques de sécurité les plus connues.
sur le web: injection SQL. Les attaques par injection SQL se produisent lorsque les données vont
décoché, et l'application n'échappe pas aux caractères utilisés dans SQL
des chaînes telles que guillemets simples (') ou doubles guillemets (").
Si ces caractères ne sont pas filtrés, les utilisateurs peuvent exploiter le système en rendant les requêtes toujours vraies et en leur permettant ainsi de tromper les systèmes de connexion..
Heureusement, PHP offre quelques outils pour protéger votre base de données.
contribution. Lorsque vous êtes connecté à un serveur SQL, vous pouvez utiliser ces
fonctions avec un simple appel, et vos variables doivent pouvoir être utilisées en toute sécurité
dans les requêtes. La plupart des principaux systèmes de base de données proposés avec PHP incluent
ces fonctions de protection.
MySQLi vous permet de le faire de deux manières. Soit avec la fonction mysqli_real_escape_string lorsque vous êtes connecté à un serveur:
$ username = mysqli_real_escape_string ($ GET ['nomutilisateur']); mysql_query ("SELECT * FROM tbl_members WHERE nom_utilisateur = '". $ nom_utilisateur. "'");
Ou avec des déclarations préparées.
Les instructions préparées permettent de séparer la logique SQL des données qui lui sont transmises. Les fonctions utilisées dans la bibliothèque MySQLi filtrent notre entrée lorsque nous lions des variables à l’instruction préparée. Ceci peut être utilisé comme ceci (quand vous êtes connecté à un serveur):
$ id = $ _GET ['id']; $ statement = $ connection-> prepare ("SELECT * FROM tbl_members WHERE id =?"); $ statement-> bind_param ("i", $ id); $ statement-> execute ();
Une chose à noter lors de l'utilisation d'instructions préparées est le "i" dans bind_param. i représente un entier, mais vous pouvez utiliser s pour chaîne, d pour double et b pour blob en fonction des données que nous transmettons.
Bien que cela vous protège dans la plupart des cas, vous devriez
gardez toujours à l'esprit la validation des données appropriée, comme mentionné précédemment.
Ce court tutoriel ne peut que gratter la surface de la sécurité Web.
En fin de compte, il appartient aux développeurs de s’assurer que les applications qu’ils
construire sont en sécurité en se renseignant sur les dangers du web et
les types les plus courants de vulnérabilités et d'attaques. Si vous souhaitez
En savoir plus sur les problèmes de sécurité en PHP, une section sur la sécurité dans le manuel php leur est consacrée.
Quels sont vos conseils?