Maître PHP, 8 pratiques pour sécuriser votre Web App

En ce qui concerne la sécurité des applications, en plus de la sécurisation de votre matériel et la plate-forme, vous devez également écrire votre code en toute sécurité. Cet article explique comment garder votre application sécurisée et moins vulnérable au piratage. Voici les meilleures habitudes qu'un programmeur peut se développer afin de protéger sa demande d'une attaque:

  • la validation des données d'entrée
  • Protection contre les attaques XSS
  • Protection contre les attaques CSRF
  • La prévention des attaques par injection SQL
  • La protection du système de fichiers
  • La protection des données de session
  • Une bonne gestion des erreurs
  • Gardiennage fichiers inclus

Validation des données d'entrée

Lors de la conception de votre application, vous devez vous efforcer de protéger votre application contre la mauvaise entrée. La règle à suivre est la suivante: ne vous fiez pas l'entrée d'utilisateur. Bien que votre application est destinée à de bonnes personnes, il y a toujours une chance que certains mauvais utilisateur essaiera d'attaquer votre application en entrant mauvaise entrée. Si vous validez toujours et filtrer les données entrantes, vous pouvez construire une application sécurisée.

Protection contre les attaques XSS

Pour protéger votre application de ce genre d'attaques, exécutez les données d'entrée par strip_tags () pour supprimer toutes les balises présentes en elle. A la présentation des données dans le navigateur, appliquer la fonction htmlentities () sur les données.

Protection contre les attaques CSRF

Idéalement, requêtes GET sont idempotent dans la nature. Idempotence signifie qu'il est possible d'accéder à la même page plusieurs fois sans provoquer d'effets secondaires. Par conséquent, les demandes GET devraient être utilisées que pour accéder à l'information et non pour effectuer des transactions.

L'exemple suivant montre un fonctionnement d'une application mal codé prend en charge sans le savoir les attaques CSRF:

Supposons que Bob veut effectuer une attaque CSRF sur Alice, et construit une URL comme suit et l'envoie à Alice dans un courriel:

Le navigateur ne peut pas afficher une image comme prévu, mais il faudra encore faire la demande en utilisant l'URL qui fera une transaction sans en avertir Alice.

La solution est de traiter toute fonction qui modifie l'état de base de données dans une requête POST, et évitez d'utiliser _REQUEST de $. Utilisez $ _GET pour récupérer les paramètres GET et utiliser $ _POST pour récupérer les paramètres POST.

En outre, il devrait y avoir un jeton aléatoire appelé un jeton CSRF associé à chaque requête POST. Lorsque les connexions utilisateur dans son / son compte, l'application devrait générer un jeton aléatoire et le stocker dans la session. Chaque fois qu'un formulaire est affiché à l'utilisateur, le jeton doit être présent dans la page comme un champ de saisie caché. La logique d'application doit vérifier le jeton et veiller à ce qu'il corresponde à la présente jeton dans la session.

Prévention des attaques par injection SQL

Pour effectuer vos requêtes de base de données, vous devriez utiliser PDO. Avec des requêtes paramétrées et des déclarations préparées, vous pouvez empêcher l'injection SQL.

Jetez un oeil à l'exemple suivant:

Dans le code ci-dessus, nous fournissons les paramètres nommés: le nom et l'âge: pour préparer (). qui informe le moteur de base de données pré-compiler la requête et fixer les valeurs aux paramètres nommés plus tard. Lorsque l'appel à exécuter () est fait, la requête est exécutée avec les valeurs réelles des paramètres nommés. Si vous le code de cette façon, l'attaquant ne peut pas injecter SQL malveillant que la requête est déjà compilé et votre base de données sera sécurisé.

La protection du système de fichiers

En tant que développeur, vous devez toujours écrire votre code de telle sorte qu'aucun de vos opérations mettre votre système de fichiers à risque. Considérez PHP ci-dessous qui télécharge un fichier selon un paramètre fourni par l'utilisateur:

Le script est très dangereux car il peut servir des fichiers de tout répertoire qui lui est accessible, comme les répertoires de répertoires de session et système. La solution est d'assurer le script ne pas essayer d'accéder à des fichiers de répertoires arbitraires.

La protection des données de session

Par défaut, les informations de session est écrit dans un répertoire temporaire. Dans le cas d'un serveur d'hébergement partagé, quelqu'un d'autre que vous pouvez écrire un script et lire facilement les données de session. Par conséquent, vous ne devriez pas conserver des informations sensibles comme les mots de passe ou des numéros de carte de crédit dans une session.

Une bonne façon de protéger vos données de session est de chiffrer les informations stockées dans la session. Cela ne résout pas complètement le problème puisque les données cryptées ne sont pas tout à fait sûr, mais au moins les informations ne sont pas lisibles. Vous devriez également envisager de garder vos données de session stockées quelque part ailleurs, comme une base de données. PHP fournit une méthode appelée session_set_save_handler () qui peut être utilisé pour maintenir les données de session de votre propre chemin.

PHP 5.4, vous pouvez passer un objet de type SessionHandlerInterface à session_set_save_handler (). Consultez la documentation de PHP pour en savoir plus sur la mise en œuvre la persistance de session personnalisée en mettant en œuvre SessionHandlerInterface.

Gestion des erreurs correct

En mode de production, nous devons désactiver display_errors et paramètres display_start_up_errors. error_reporting et log_errors devraient être sur afin que nous puissions enregistrer les erreurs tout en cachant ceux des utilisateurs finaux.

Vous pouvez utiliser set_error_handler pour définir des gestionnaires d'erreur personnalisés. Cependant, il a ses limites. Le gestionnaire d'erreur personnalisé contourne le mécanisme de traitement standard des erreurs de PHP. Il ne peut pas attraper des erreurs comme E_CORE_ERROR. E_STRICT ou E_COMPILER_ERROR dans le même fichier le gestionnaire d'erreurs est défini. De plus, il ne parviendra pas à gérer les erreurs qui peuvent se produire dans le gestionnaire lui-même.

Pour gérer avec élégance les erreurs que vous devez effectuer la gestion des exceptions par blocs try / catch. Les exceptions sont représentées par la classe d'exception et ses sous-classes. Si une erreur se produit à l'intérieur du bloc try, vous pouvez lancer une exception et traiter dans le bloc catch.

Guarding Fichiers inclus

scripts PHP incluent souvent d'autres fichiers PHP qui contiennent du code pour des choses comme la connexion à une base de données, etc. Certains développeurs donnent les fichiers inclus une extension comme .inc. Les fichiers avec cette extension ne sont pas analysées par PHP par défaut si elle est appelée directement et sera servi sous forme de texte aux utilisateurs. Si un attaquant accède directement au fichier include qui contient des informations d'identification de base de données, il a maintenant accès à toutes les données de votre application. Toujours utiliser l'extension .php pour les fichiers de code inclus et les garder en dehors des répertoires directement accessibles aux utilisateurs.

En gardant les 8 points à l'esprit au-dessus, il est possible d'obtenir une application PHP dans une grande mesure. Le meilleur conseil est de loin ne font pas confiance entrée utilisateur, mais aussi assurez-vous de garder ainsi votre système de fichiers et base de données.

Articles Liés