2010-03-26 7 views
5

Je voulais juste savoir quelles sont les techniques de sécurité de base PHP que je devrais utiliser lors de la création d'une page Web qui accepte les articles? Je suis assez nouveau à PHP et je me demandais ce qui retiendra le fort jusqu'à ce que je sois un expert en sécurité?Question de sécurité PHP?

Répondre

1

Ceci est trop large, peut-être que vous devriez essayer de le réduire un peu.

Quel type de sécurité? Pour les mots de passe? Voulez-vous restreindre certaines choses? Injection SQL? HTML Injection? Sécurité inter-domaines?

+0

permet de dire la présentation des données comme les noms des personnes, le contenu et ainsi de suite. – pHp

0

Il y a beaucoup à savoir, et vous devriez commencer dès que vous le pouvez. Pour un, si vous acceptez des articles (et utilisez probablement un WYSIWYG et acceptez HTML), utilisez quelque chose pour analyser le contenu et éliminer les éléments qui pourraient vous rendre vulnérable à XSS et autres.

Un exemple est HTML Purifier.

5

Il y a deux fronts à considérer lors de l'acceptation d'un texte généré par l'utilisateur qui sera affiché ultérieurement.

Tout d'abord, vous devez protéger votre base de données contre les attaques par injection. Il y a une simple fonction PHP pour cela: mysql_real_escape_string() suffira généralement pour protéger votre base de données de l'injection lors de la transmission de cette chaîne pour la stocker en tant que valeur de champ. De là, vous devez faire attention à votre affichage, car un utilisateur qui est autorisé à télécharger du code HTML peut faire des choses désagréables à autres utilisateurs lorsque ce code est affiché. Si vous faites des articles en texte brut, vous pouvez simplement htmlspecialchars() le texte résultant. (vous aurez probablement aussi envie de convertir les nouvelles lignes en tags
.) Si vous utilisez une solution de mise en forme, telle que le moteur Markdown utilisé sur ce site, ces solutions fourniront généralement une désinfection HTML en fonction du moteur, mais Assurez-vous de lire la documentation et assurez-vous. Oh, assurez-vous également de vérifier vos variables GET/POST utilisées pour soumettre les articles. Cela va sans dire, et la vérification effectuée devra être adaptée à ce que votre site fait avec sa logique.

+0

A noter: Je suppose une base de données MySQL, il existe des fonctions équivalentes pour d'autres types de bases de données. –

+3

Les requêtes paramétrées doivent être utilisées à la place de mysql_real_escape_string() '- http://en.wikipedia.org/wiki/SQL_injection#Parameterized_statements –

+1

mysql_real_escape_string() ne protège rien. C'est simplement une fonction d'échappement simple, et ne fonctionne que lorsqu'il est combiné avec des guillemets. Donc, la règle doit être comme "échapper vos données avec mysql_real_escape_string() ** et" le placer entre guillemets ". Le reste est correct. –

1

Eh bien, comme mentionné dans les autres réponses, il existe un certain nombre de fronts différents dans lesquels vos scripts PHP peuvent être compromis.

Voici juste un couple:

Il y a plusieurs façons de traiter chacun. Voici quelques choses à regarder:

0

Il pourrait être sage de commencer à l'aide d'un cadre comme Drupal ou CakePHP.De cette façon, vous pouvez apprendre à la fois comment ils ont implémenté la sécurité et profiter du fait que cela a déjà été fait. La courbe d'apprentissage est assez raide sans avoir à lancer vos propres mécanismes d'authentification.

-1

Lorsque votre projet est prêt pour une utilisation publique, il est généralement recommandé de définir error_reporting (0);

Il ne fournira pas plus de sécurité, mais il est beaucoup plus difficile (généralement) pour les malfaiteurs de trouver des problèmes de sécurité possibles avec votre site.

+0

Terrible recommandation. Ne confondez pas les rapports d'erreurs ** niveau **, qui doivent toujours être aussi élevés que possible, avec le rapport d'erreur ** destination **, qui doit être commuté de l'affichage à la connexion sur un serveur de production. –

+0

Eh bien oui, mon idée était plutôt que l'utilisateur régulier ne verrait pas les messages d'erreur. Que faire des messages d'erreur? Je suis de la décision de tout le monde, mais comme vous l'avez dit, il est préférable de les stocker. – Mikk

0

peut-être deux conseils pourraient vous aider à obtenir des sites Web plus sûrs

  • créer deux utilisateurs dans votre base de données, de lecture compte uniquement pour ne faire que des sélections et des comptes, et d'écrire compte lorsque vous avez à faire des mises à jour, insertions ou suppressions .
  • lorsque vous devez insérer dans la base de données ou supprimer, désinfectez les entrées, utilisez MySQL a préparé des états ou faire valoir les valeurs qui arrivent par la poste ou obtiennent de cette façon:

    if(!empty($_GET["integer_like_id_value"]){ 
        $integer_id_value = (int)$_GET["integer_like_id_value"]; 
    }else{ 
        // that stuff seems not to be legit, die application, log error ? whatever 
        die(); 
    }