php
  • sql-injection
  • code-injection
  • sanitization
  • sanitize
  • 2009-06-05 8 views 0 likes 
    0

    J'ai ce code:entrée utilisateur Désinfecter destiné à la base de données en PHP

    $query = "select id from votes where username = '$user' and article_id = $this->id"; 
    

    J'ai essayé ce code pour le désinfecter:

    $query = sprintf("select id from votes where username = '$user' and article_id = $this->id", 
        mysql_real_escape_string($user), 
        mysql_real_escape_string($password)); 
    

    mais je reçois cette erreur pour les lignes mysql_real_escape:

    Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'mexautos'@'localhost' (using password: NO) in /home/mexautos/public_html/kiubbo/data/article.php on line 145 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/mexautos/public_html/kiubbo/data/article.php on line 145 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'mexautos'@'localhost' (using password: NO) in /home/mexautos/public_html/kiubbo/data/article.php on line 146 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/mexautos/public_html/kiubbo/data/article.php on line 146 
    

    Je reçois le nom d'utilisateur ici, je ne sais pas si c'est assez sûr:

    function getUsername(){ return $this->username; } 
    

    Thx

    Répondre

    7

    Je suggère d'utiliser pour ce prepared statements au lieu de sprintf

    +0

    Excellente idée si l'interface mysql les supportait. Il aurait besoin de passer à mysqli ou PDO pour utiliser des instructions préparées. – jmucchiello

    +0

    S'il utilise PHP 5 ou supérieur mysqli est inclus –

    8

    Vous avez besoin d'une connexion mysql avant de pouvoir utiliser mysql_real_escape_string.

    +0

    J'ai une connexion, je veux dire que le site fonctionne et se connecte à la base de données, avant d'insérer ces lignes. THX. – jcslzr

    +0

    Ce n'est pas ce que l'erreur dit! Essayez d'utiliser votre identifiant de lien comme deuxième argument pour votre mysql_real_escape_strings et voyez si cela aide. – whichdan

    3

    Je ne sais pas si c'est ce qui cause votre problème, mais je crois que les variables dans votre déclaration de sprintf ne doivent pas être « utilisateur $ » et « $ this-> id », mais ils devraient être « % s »

    http://us2.php.net/sprintf

    +0

    Sans oublier qu'il essaie de remplacer un article_id par une variable appelée $ password. – Abinadi

    +0

    Pourquoi utiliser sprintf() du tout - PHP a une interpolation de variable dans les chaînes. OTOH, une instruction SQL construite avec sprintf() est tout aussi dangereuse qu'une interpolation ... Les deux méthodes doivent être évitées. – Tomalak

    +0

    @Tomalak - Je sais, mais soulignait simplement un bug dans son code, ne proposant pas une meilleure méthode. – JasonV

    1

    Je vous recommande d'utiliser une couche d'abstraction DB mature comme Zend_Db (il y a là-bas sont des tonnes). L'implémentation de votre propre solution homebrew n'est pas quelque chose que je recommanderais pour un système de production.

    2

    Vous avez besoin d'une connexion pour utiliser mysql_real_escape_string() car elle utilise le type de codage du serveur pour faciliter la mise en place de santitize.

    aussi sprintf() devrait ressembler à ceci

    $query = sprintf("SELECT id FROM votes WHERE username = '%s' and article_id = %d", 
        mysql_real_escape_string($user), 
        mysql_real_escape_string($password)); 
    
    +0

    Dans le mien, je n'étais pas sûr si l'identifiant était nécessairement un nombre entier, donc je suis allé juste avec un format de chaîne. – JasonV

    3

    Attention: mysql_real_escape_string() [function.mysql-réel chaîne d'échappement]: Accès refusé pour l'utilisateur 'mexautos' @ 'localhost' (en utilisant mot de passe: NO)

    Attention: mysql_real_escape_string() [function.mysql-real escape-string]: Un lien sur le serveur n'a pas pu être établie

    Avez-vous vérifié le lien? Est-ce actif? Vous devez être connecté avant d'utiliser mysql_real_escape_string() Ne pas oublier de définir le mot de passe?

    Essayez:

    mysql -u mexautos -p 
    

    (Type Saisissez si aucun mot de passe)

    Aussi, consultez votre fonction sprintf(), vous devez utiliser% s pour lier votre variable

    $a = 'Foo'; 
    $b = 'Bar'; 
    $foo = sprintf('Foo Bar %s %s', $a, $b); 
    
    +0

    L'erreur semble liée à l'accès. –

    +0

    Essayer de se connecter via la console est un moyen de vérifier le privilège de manière brute! –

    0

    Comme l'autre dit, pas '$ user' mais '% s' et vous avez besoin d'une connexion ouverte.Sprintf est plus rapide - c'est la raison pour laquelle l'utiliser - c'est une fonction C native.

    +0

    sprintf est plus rapide que quoi? Lors de l'interaction avec la base de données, ce n'est pas une raison particulièrement bonne ... –

    +0

    sprintf est plus rapide que l'interpolation de chaîne de caractères PHP, et n'était pas lié à l'objet de la base de données, mais au commentaire de Tomalak. – shazarre

    Questions connexes