Mysql
 sql >> Base de données >  >> RDS >> Mysql

Variable utilisateur sécurisée PHP

Il y a deux choses très importantes que vous devez faire pour éviter de graves problèmes de sécurité.

  1. Vous devez échapper l'entrée utilisateur avant de la mettre dans votre requête SQL. Échapper signifie échapper tous les caractères spéciaux tels que '; heureusement, il existe une fonction qui le fait déjà automatiquement :mysql_real_escape_string .

    Si vous n'échappez pas à l'entrée de l'utilisateur, des choses désagréables pourraient se produire. Imaginez que votre requête est INSERT INTO userdata VALUES ('$user_data') . Imaginez maintenant que l'utilisateur a écrit '; DROP DATABASE userdata; .

    Si vous n'y échappez pas, votre requête deviendra :INSERT INTO userdata VALUES (''; DROP DATABASE userdata;') . Comme vous pouvez l'imaginer, ce n'est pas bon :si vous avez activé plusieurs déclarations, vous pouvez dire adieu à votre base de données. C'est ce qu'on appelle une injection SQL attaque.

  2. Lorsque vous envoyez votre variable à l'utilisateur, vous devez également remplacer correctement les caractères spéciaux HTML par des entités HTML. Heureusement, il existe une fonction pour faire cela aussi :htmlspecialchars() . Il transformera les caractères HTML spéciaux tels que < à < .

    Cela semble être un problème souvent sous-estimé, mais en réalité c'est très grave. Imaginez si $user_data contient <script>SomeNastyScript()</script> . Il pourrait exploiter les vulnérabilités existantes dans le navigateur de vos utilisateurs, ou il pourrait envoyer un cookie non-HTTPOnly (qui peut contenir des mots de passe enregistrés) à l'attaquant, ou il pourrait inciter l'utilisateur à écrire son mot de passe sur un formulaire généré par la manipulation de le DOM (possible en javascript), ou plein d'autres mauvaises choses.

    Cela s'appelle XSS (Script intersite).

Version courte

  1. Appelez mysql_real_escape_string sur la chaîne avant de l'insérer dans votre requête SQL (mais pas lorsque vous echo il).

  2. Appelez htmlspecialchars sur la chaîne avant de l'afficher à l'utilisateur (mais pas lorsque vous la mettez dans la base de données).