Quels caractères doivent être échappés pour empêcher les injections de (mon) SQL?
Je suis de l'utilisation de MySQL de l'API de la fonction
mysql_real_escape_string()
Basée sur la documentation, il s'échappe les caractères suivants:
\0
\n
\r
\
'
"
\Z
Maintenant, j'ai regardé dans OWASP.org's ESAPI de sécurité de la bibliothèque et dans le Python port, elle avait le code suivant (http://code.google.com/p/owasp-esapi-python/source/browse/esapi/codecs/mysql.py):
"""
Encodes a character for MySQL.
"""
lookup = {
0x00 : "\ """
Encodes a character for MySQL.
"""
lookup = {
0x00 : "\\0",
0x08 : "\\b",
0x09 : "\\t",
0x0a : "\\n",
0x0d : "\\r",
0x1a : "\\Z",
0x22 : '\\"',
0x25 : "\\%",
0x27 : "\\'",
0x5c : "\\\\",
0x5f : "\\_",
}
",
0x08 : "\\b",
0x09 : "\\t",
0x0a : "\\n",
0x0d : "\\r",
0x1a : "\\Z",
0x22 : '\\"',
0x25 : "\\%",
0x27 : "\\'",
0x5c : "\\\\",
0x5f : "\\_",
}
Maintenant, je me demande si tous ces personnages sont vraiment nécessaires pour être échappé. Je comprends pourquoi % " et " _ " sont là, ils sont des méta caractères COMME opérateur, mais je ne peux pas tout simplement comprendre pourquoi ont-ils ajouter la touche retour arrière et les caractères de tabulation (\b \t)? Est-il un problème de sécurité si vous faites une requête:
SELECT a FROM b WHERE c = '...user input ...';
Où la saisie de l'utilisateur contient tabulation ou retour arrière personnages?
Ma question est là: Pourquoi ont-ils include \b \t dans l'ESAPI de sécurité de la bibliothèque? Sont là tout les situations où vous pourriez avoir besoin pour échapper à ces personnages?
source d'informationauteur Tower
Vous devez vous connecter pour publier un commentaire.
La MySQL page de manuel pour les chaînes dit:
\0
Un ASCII NUL (0x00).\'
Un guillemet simple ( “'
” ).\"
Un guillemet double ( “"
” ).\b
Un caractère de retour arrière.\n
Un retour à la ligne, saut de ligne).\r
Un caractère de retour chariot.\t
Un caractère de tabulation.\Z
26 ASCII (ctrl-Z). Voir la note à la suite de la table.\\
Une barre oblique inverse ( “\
” ).\%
“%
caractère”. Voir la note à la suite de la table.\_
“_
caractère”. Voir la note à la suite de la table.Une supposition concernant le caractère de retour arrière: Imaginez-je vous envoyer un e-mail "Bonjour, voici la requête pour mettre à jour votre base de données que vous vouliez" et un fichier texte avec
Vous chat le fichier, vous voyez que c'est bien, et tout tuyau le fichier MySQL. Ce que vous ne savez pas, cependant, était que j'ai mis
avant l'INSTRUCTION INSERT qui vous ne voyez pas parce que sur la sortie de la console de la correction arrière écrasait. Bamm!
Juste une supposition, mais.
Modifier (pas pu résister):
Liste noire (identification de mauvais caractères) n'est jamais que le chemin à parcourir, si vous avez d'autres options.
Vous devez utiliser un conbination de la liste blanche, et, plus important, lié à paramètre approches.
Alors que cette réponse a un PHP, il permet encore de nombreuses et permettent d'expliquer que la simple exécution d'une chaîne à travers un char filtre ne fonctionne pas dans de nombreux cas. S'il vous plaît, veuillez voir Ne htmlspecialchars et mysql_real_escape_string garder mon code PHP à l'abri de l'injection?
Il est tout à fait remarquable d'un fait que jusqu'à ce jour, la plupart des utilisateurs de faire croire que c'est la saisie de l'utilisateur ont échappé, et ces échapper "empêche injections".
Solution Java:
ne pourrait-on pas simplement de supprimer le guillemet simple(s) à partir de la saisie de l'utilisateur?
par exemple:
$input =~ s/\'|\"//g;