Ce n'mysql_real_escape_string() ne sont que addslashes() ne l'est pas?
Pourquoi avons-nous besoin d'une base de fonctions spécifiques comme mysql_real_escape_string()? Que peut-il faire que addslashes() ne l'est pas?
Ignore pour le moment la meilleure alternative de requêtes paramétrées, est une webapp qui utilise addslashes() exclusivement toujours vulnérable à l'injection SQL, et si oui, comment?
Vous devez vous connecter pour publier un commentaire.
Addslashes est généralement pas assez bon quand vous traitez avec multibyte chaînes codées.
addslashes()
. Chris Shiflett a un excellent exemple sur son blog à l'aide de GBK. shiflett.org/blog/2006/jan/...Il ajoute des barres obliques pour:
Où addslashes ajoute des barres obliques pour
Ilias article est également assez détaillé sur sa fonctionnalité
gs durement downvoted réponse est en fait un peu à droite.
Standard SQL utilise doubler d'échapper à un littéral de l'apostrophe. MySQL est la non-utilisation standard des barres obliques inverses pour l'échappement est le paramètre par défaut, mais elle peut être désactivée et est souvent, en particulier dans sql_mode ANSI.
Dans ce cas, seul le doublé de la syntaxe du travail, et n'importe quelle application, vous devez utiliser addslashes (ou d'autres ad-hoc s'échapper de la méthode) rompre. mysql_real_escape_string utiliserons la échapper méthode est la meilleure pour la connexion sql_mode.
Le multi-octets problème de codage est également important si vous êtes toujours à l'aide de ces méchants de l'Asie de codages de ré-utiliser les 128 caractères, mais alors, vraiment, vous voulez être en UTF-8 à la place. \n-s'échapper, d'autre part, est d'aucun intérêt depuis MySQL peut parfaitement heureux de faire face à une crue de retour à la ligne dans une déclaration.
mysql_real_escape_string ne beaucoup plus que
addslashes
n'.addslashes fonctionne sur format ascii pur, sans rien connaître de la base de données. Il s'échappe:
'
→\'
"
→\"
\
→\\
0
→\0
.mysql_real_escape_strings'objectif est de "créer un cadre juridique chaîne SQL que vous pouvez utiliser dans une instruction SQL." mysql_real_escape_string prend en compte le jeu de caractères courant de la connexion (qui est pourquoi vous devez toujours passer un valide $mysql objet).
Il effectue les opérations suivantes (extrait de la documentation de l'API C de MySQL):
\
,'
,"
, ASCII0
,\n
,\r
, etControl+Z
de façon à ne pas causer des problèmes0
octet termine la chaîne (dans l'api C)Je ne sais pas vraiment comment PHP magasins de chaînes en interne, mais le point est que tout cela est disponible pour PHP lorsque vous utilisez
mysql_real_escape_string
. Je suppose que le principal point de différence estmysql_real_escape_string
considère le jeu de caractères de la connexion, oùaddslashes
ne peut pas (il ne sait même pas ce que DB vous êtes connecté).mysql_real_escape_string
C la fonction de l'API sous le capot.somedb_real_escape_string()
une base de données spécifique,addslashes()
ne l'est pas.Dans le cas de MySQL, ce qui signifie:
(À partir du manuel.)
En fait, la plupart du temps nous n'en avons pas.
Cette fonction est nécessaire pour quelques très rares de l'encodage et à embellir mysql journaux et les décharges un peu.
Tant que c'est à l'aide d'un seul octet charset ou utf8 - il est parfaitement en sécurité avec addslashes().
Il peut protéger SQL littéral de chaîne dans le cas de quelques rares encodages.
Toutefois, il ne peut pas le faire par lui-même. Un codage approprié doivent être définies à l'aide de
mysql_set_charset()
fonction première. Si cette fonction n'ont pas été utilisés,mysql_real_escape_string()
se comportent exactement de la même manière queaddslashes()
en termes de jeu de caractères de manutention - il n'y aurait pas de différence à tous les.addslashes
comme une pratique où vous avez soudainement de changer votre pratique dès que vous travaillez avec Unicode?mysqli_set_charset
. Ce n'est pas le cas de C.addslashes()
cas. Le bon sens!La seule vraie différence que je sais, c'est que mysql_real_escape_string() prendra la base de données du jeu de caractères en considération lors de l'évacuation de la chaîne d'entrée. Ni la fonction échapper les caractères jokers % " et " _ " qui laisse tout de même le script d'injection SQL.
Selon la Manuel PHP:
PHP mysql_real_escape_string fonction, plus ou moins, demander à mysql de ce personnage(s) doit être échappé, où la addslashses fonction il suffit d'ajouter une barre oblique inverse devant et tout le guillemet simple ('), guillemet double ( " ), (barre oblique inverse) ou NUL (NULL byte character).
Les deux effets pratiques sont, addslashes a tendance à ne pas bien fonctionner avec des caractères multioctets, et, plus important encore, en demandant à mysql quels caractères doivent être échappés, vous éviter une possible compatibilité future. À l'aide de assslashes est le genre de coder en dur les un couple de caractères spécifiques dans la séquence d'échappement.
Il est censé échapper chaînes de caractères pour MySQL dans une manière que d'autres en citant des installations de ne pas.
De beaucoup préférable, cependant, est de utiliser l'interface mysqli, et l'utilisation paramétrées, les requêtes préparées au lieu d'essayer de faire en sorte que tous vos chaînes sont échappées. À l'aide de requêtes paramétrées, élimine la nécessité d'un tel désordre de la chaîne de travail et de fortement réduire le risque d'injection SQL.
Edit: je vais préciser un peu sur pourquoi je considère citant une mauvaise idée: Il est facile d'oublier quand et où vous en avez besoin pour citer - si votre variable est une chaîne ou un nombre, si elle a déjà été citée, etc. Une requête paramétrée a aucune de ces questions, et le besoin de citer est complètement écartées.
Selon ma compréhension mysql_real_escape_string() faire le travail plus précisément, comme il communiquer avec db à vérifier d'abord que ce qui doit être codé et puis l'encoder en conséquence, n'est-ce pas? Il n'y a pour elle de travailler plus efficacement
pourquoi vous voulez d'abord faire addslashes et puis vous allez supprimer que des barres obliques, avant de montrer que les données et encore addslashes n'est pas aussi efficace que mysql_real_escape_string , utiliser mysql_real_escape_string si vous utilisez mysql_query comme db fonctions pour quering, ou je pense que PDO avec les préparer est de meilleure façon, comme mysql_real_escape_string est db spécifiques