Quels sont les personnages sont réellement capables de provoquer une injection SQL dans mysql
Nous savons tous que nous devrions utiliser les requêtes préparées ou le remplacement/règles de mise en forme afin de prévenir l'injection sql dans nos applications.
Toutefois, lorsque vous prenez un coup d'oeil à MySQL liste de chaînes de caractères, j'ai remarqué qu'il comprend les caractères suivants:
\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 (\
).\%
Un%
caractère.\_
Un_
caractère.
Maintenant, alors que la %
et _
caractères doivent être échappés afin d'éviter l'injection de indésirables des caractères génériques dans les déclarations, et alors que le '
(apostrophe), \
(barre oblique inverse), et "
(double quote) tous doivent être échappés afin d'éviter l'injection de requêtes SQL - pourrait avoir l'une de ces autres personnages sans échappement conduire directement à une vulnérabilité d'injection SQL qui autrement ne seraient pas présents? Quelqu'un at-il des exemples du monde réel d'un tel exploit?
Supposons que nous construisons notre requête comme:
SELECT * FROM users WHERE username='$user'
Est-il de la valeur pour $user
où la seule sans échappement de caractères littéraux sont \b
(retour arrière), \0
(NUL), \n
(saut de ligne), \r
(saut de ligne), \t
(tab) ou \Z
(Ctrl+Z) qui permet l'injection de requêtes SQL dans cette requête?
La réponse courte à votre question est, autant que je sache, pas de ce type de caractères (même si sans échappement) de ne pas interrompre la chaîne de caractères littérale contexte et de la place du serveur dans SQL contexte; ainsi, l'injection SQL ne peut pas apparaître. Cependant, vous devez être attentif à ce que vos échapper méthodologie est conscient du jeu de caractères que le serveur utilise pour décoder le littéral de chaîne d'octets reçus du: si l'échappement est réalisée dans un jeu de caractères différent, il peut être possible pour soigneusement conçu chaînes de résilier le littéral de chaîne et de les injecter un code SQL arbitraire.
Le démarrage d'une comme avec un % modifie le plan de requête à utiliser une analyse de la table qui est généralement mauvais pour la performance. Donc, si tout le reste est géré qui peut encore être utilisé pour attaquer un système. Selon l'interface que vous utilisez, l'injection d'un ; il peut vous permettre d'exécuter une deuxième requête. C'est une bonne politique pour limiter les autorisations de l'utilisateur de l'exécution de la requête. Ligne de caractères de commentaire -- dans mysql peut aussi causer des problèmes. ex: mise à JOUR aux utilisateurs de définir des access_time = x where id = y; si x est -9999 -- qui pourrait être utilisé pour mettre à jour tous les utilisateurs access_time.
Je ne vois pas un caractère de commentaire répertoriés. C'est l'un des plus communs qui sont listés dans des attaques par injection SQL.
OriginalL'auteur schizodactyl | 2013-01-17
Vous devez vous connecter pour publier un commentaire.
Considérant les lignes ci-dessous à partir de mysql_real_escape_string() manuel :
Injection SQL dans MySQL ne devrait pas être possible avec ces caractères spéciaux rien que par eux-mêmes :
\b
\0
\n
\r
\t
\Z
.Cependant les Littéraux de Chaîne manuel stipule ce qui suit, mais les raisons spécifiées ( ou pas ) ne se rapportent pas à l'injection SQL :
En outre , dans un simple test , quelle que soit la météo énumérées ci-dessus, les caractères spéciaux sont échappés ou pas , MySQL a donné les mêmes résultats . En d'autres termes MySQL n'a même pas l'esprit :
La requête ci-dessus a travaillé de la même façon pour les non-échappé et s'est échappé versions de ceux énumérés ci-dessus, les caractères comme ci-dessous :
Table de Test et les données utilisées dans le test simple :
OriginalL'auteur Uours
Il n'y a pas de tels caractères.
Il y a deux déclarations fausses dans votre question que vous conduire à confondre:
C'est faux énoncé. Pas de remplacement, mais mise en forme. C'est chose essentielle. Les remplacements ne protègent pas contre les injections, alors que le formatage n'. Notez que chaque partie distincte de la requête nécessite différents la mise en forme qui devient inutile de toute autre partie. Dire qu'il y a un autre personnage, essentiel pour l'injection de la protection backtick (`). Mais vous n'avez pas de liste parce qu'il n'a rien à voir avec les littéraux de chaîne.
C'est terriblement fausse déclaration. S'échapper pour ne pas empêcher les injections! Ces caractères doivent être échappés afin de chaînes de format et n'a absolument rien à voir avec les injections. S'il est vrai que les formater correctement la requête de la partie est invulnérable contre les injections. Mais la vérité est - il le format de la dynamique de la requête les pièces juste pour le plaisir de le faire, à suivre les règles de syntaxe - non pas à cause de ce que les injections. Et vous aurez votre requête impénétrable comme une conséquence.
Maintenant vous pouvez voir pourquoi votre dernier relevé,
est mal mis:
C'est une chaîne règles de mise en forme ont besoin de ces caractères, pas ce que la "vulnérabilité". Certains d'entre eux sont échappés juste pour des raisons de commodité, certains pour des raisons de lisibilité, certaines pour des raisons évidentes d'échapper à un délimiteur. C'est tout.
De répondre à des questions des commentaires:
Encore: bien que dans l'esprit de la moyenne de l'utilisateur PHP
mysql_real_escape_string()
est fortement connecté à quoi effrayer injection, en réalité il ne l'est pas. Il n'y a pas "dangereux" de caractères. Pas un seul. Il y a quelques service des caractères ayant une signification particulière. Ils ont échappé dans certaines circonstances, cela dépend du contexte.Ainsi, il n'y a pas de connexion entre les caractères d'échappement par cette fonction, et tout ce "danger". Le moment où vous commencez à penser que
mysql_real_escape_string()
'objectif est d'échapper à "dangereux" de personnages, vous êtes devenu, de fait, en danger. Alors que longtemps que vous utilisez cette fonction uniquement pour échapper à cordes (et de le faire sans condition) - vous pouvez vous considérer comme sûr (bien sûr, si vous n'oubliez pas de format tous les autres littéraux trop, à l'aide de leurs respectifs règles de mise en forme)Pas.
OriginalL'auteur Your Common Sense