2010-10-12 10 views
1

Donc, je reçois cet avertissement lors de l'utilisation mysql_real_escape_stringImpossible d'utiliser mysql_real_escape_string

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'username'@'localhost' (using password: NO) in /home/path/php/functions.php on line 11 

Le reste du site fonctionne très bien, se connecte à la DB et tout, mais je reçois une erreur lors de l'utilisation de cette fonction .

Cela fonctionne parfaitement sur mon serveur de test localhost.

Des idées?

-je utiliser la fonction ci-dessus dans ma propre fonction d'assainissement chaîne homebrew:

function sani($string){  
    $string = strip_tags($string); 
    $string = htmlspecialchars($string); 
    $string = trim(rtrim(ltrim($string))); 
    $string = mysql_real_escape_string($string); 
    return $string; 
} 

Et j'utiliser cette fonction chaque fois que je fais des requêtes ...

function mm_mysqlquery($query) { 
if (MM_DEBUG == true) { echo "Query: $query <br>"; mm_log("Query: $query"); } //print query if MM_DEBUG 
$link = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die ("mysql_error: " . mysql_error()); 
$db_selected = mysql_select_db(DB_NAME); 
return mysql_query($query, $link); 
} 

Merci à l'avance!

Répondre

8

Premier point: Si vous obtenez une erreur de mysql_real_escape_string(), c'est parce que vous appelez la fonction avant d'être connecté à la base de données.

Il semble que vous vous connectiez à la base de données juste avant d'exécuter une requête. Donc tout ce que vous faites avant d'appeler votre mm_mysqlquery() fonction n'aura pas de connexion.

La fonction mysql_real_escape_string() nécessite une connexion en direct à la base de données, ce qui lui permet de faire le bon type d'échappement par rapport au jeu de caractères de la connexion. Donc, vous devez vous connecter avant vous échapper.

Il est préférable de le faire de toute façon, car si vous effectuez plusieurs requêtes au cours d'une seule requête PHP, il est moins nécessaire de connecter une fois et d'utiliser la même connexion pour toutes vos requêtes. Deuxièmement, ne prenez pas de suggestions pour utiliser addslashes() - il ne fait pas la même chose que mysql_real_escape_string(). Les deux ne sont pas interchangeables. Vous devriez prendre l'habitude d'utiliser mysql_real_escape_string(). Troisièmement, votre fonction sani() montre une idée fausse commune. L'idée fausse commune est que vous avez besoin de toutes ces fonctions pour rendre une chaîne sûre dans une instruction SQL. Vous ne le faites pas. Seulement mysql_real_escape_string() est nécessaire. Toutes les autres fonctions de cet exemple ne protègent pas contre l'injection SQL.

Ces fonctions sont utiles si vous générez une chaîne dans une présentation HTML et que vous voulez réduire le risque d'attaques XSS, mais que mysql_real_escape_string() n'est pas pertinent.

Utilisez chaque type de méthode de désinfection dans son contexte approprié.

+0

+1 il est question de contexte – alex

0

chaîne mysql_real_escape_string (chaîne de unescaped_string de $ [, resource $ link_identifier])

Où unescaped_string de $ est votre chaîne et link_identifier $ est votre ressource db.

La connexion MySQL.Si le lien n'est pas spécifié, le dernier lien ouvert par mysql_connect() est supposé. Si aucun lien de ce type n'est trouvé, va essayer d'en créer un comme si mysql_connect() a été appelé sans arguments . Si aucune connexion n'est trouvée ou établie, une erreur E_WARNING niveau est générée.

PHP.NET mysql_real_escape_string resource