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

Base64 comme méthode de désinfection des entrées utilisateur pour Mysql

Ne "désinfectez" comme moyen d'empêcher l'injection SQL - utiliser des espaces réservés (ou échappement correct) , toujours. Être cohérent. Fais attention. Le problème est déjà résolu.

Ce cas sera "sûr" en raison du domaine limité du base64_encode fonction. Cependant..

C'est c'est une mauvaise pratique et le stockage de valeurs encodées en base64 (de sorte que la requête affichée puisse fonctionner) comporte plusieurs valeurs négatives implications à mesure qu'il change les informations stockées :elles détruisent l'ordre des valeurs, rend l'information pas trivialement interrogeable , nécessite un supplément étape "encoder/décoder", et même consomme plus d'espace - aïe !

Ainsi, bien qu'il puisse y avoir des cas spécifiques pour coder les données en base64, cette approche n'est pas bien adapté comme moyen d'atténuer l'l'injection SQL .

Le problème est dû à l'accès à SQL via un protocole texte où la requête commande/forme et valeurs sont entremêlés. L'utilisation de correct techniques d'échappement (par exemple mysql_real_escape_string ) corrige ce problème en s'assurant que les informations sont échappées afin que le texte SQL soit parsé comme prévu - cependant, contrairement à une étape d'encodage en base64, pas modifier réellement les informations fournies !

Ce est exactement ce que fournissent les espaces réservés ! Les espaces réservés sont le approche universellement correcte et devrait être encouragée. Les espaces réservés permettent d'envoyer la requête et les valeurs à la base de données séparément lorsqu'il est pris en charge par la bibliothèque/base de données ; et sont émulés en s'échappant autrement. L'utilisation correcte des espaces réservés élimine L'injection SQL et le besoin de code utilisateur pour mélanger les valeurs dans le texte de la commande SQL, ce qui peut également faciliter l'écriture et la maintenance des requêtes.

Pour empêcher les "programmeurs individuels" d'écrire de terribles requêtes, la solution consiste à empêcher requêtes ad hoc d'être dispersées dans le code :collectez les opérations d'accès aux données dans une Couche d'accès aux données ( DAL) (éventuellement en conjonction avec un ORM) et n'exposer que les actions pertinentes, garantissant une utilisation correcte de SQL dans le DAL. Dans les projets plus simples, le DAL est également un emplacement approprié pour gérer de manière centralisée les règles métier pour l'assainissement et d'autres logiques de validation.

Plus précisément :

  • Désinfecter valeurs pour les règles métier ; cela devrait empêcher les "mauvaises informations", telles qu'un nom d'utilisateur trop court, contenant des caractères restreints ou ne répondant pas aux exigences de l'entreprise.

  • Utiliser des espaces réservés pour empêcher l'injection SQL . C'est strictement lié au transfert des données vers SQL et n'a aucune incidence sur les informations qu'elles contiennent.

Alors que MySQL 5.6.1 ajoute FROM_BASE64 , de sorte que l'encodage puisse simplement être utilisé dans le texte de la commande SQL, cela ajoute encore une étape de décodage explicite supplémentaire et complique la requête lors de l'utilisation d'un tel schéma d'encodage. Cette approche base64 n'est tout simplement pas nécessaire, car il existe déjà des techniques éprouvées pour empêcher l'injection SQL, et n'a pas été proposé dans la question initiale.