2009-06-05 15 views
0

Ich habe diesen Code:Sanitize Benutzereingabe für Datenbank bestimmt in PHP

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

ich diesen Code versucht, es zu sanieren:

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

aber ich habe diesen Fehler für die mysql_real_escape Linien:

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 

Ich bekomme den Benutzernamen hier, ich weiß nicht, ob es sicher genug ist:

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

Thx

Antwort

7

würde ich vorschlagen, prepared statements dafür statt sprintf

+0

Großartige Idee, wenn die MySQL-Schnittstelle sie unterstützt. Er müsste zu mysqli oder PDO wechseln, um vorbereitete Anweisungen zu verwenden. – jmucchiello

+0

Wenn er PHP 5 oder höher verwendet, ist mysqli enthalten –

8

Sie benötigen eine MySQL-Verbindung, bevor Sie mysql_real_escape_string verwenden können.

+0

Ich habe Verbindung, ich meine die Website funktioniert und verbindet sich mit der db, bevor Sie diese Zeilen einfügen. Danke. – jcslzr

+0

Das ist nicht was der Fehler sagt! Verwenden Sie Ihren Link-Bezeichner als zweites Argument für Ihre mysql_real_escape_strings und sehen Sie, ob das hilft. – whichdan

3

nicht sicher, ob dies ist, was Ihr Problem verursacht, aber ich glaube, dass die Variablen in der sprintf Anweisung nicht ‚$ user‘ sein sollte und ‚$ this-> id‘, aber sie sollten ‚% s‘

sein

http://us2.php.net/sprintf

+0

Ganz zu schweigen davon, dass er versucht, eine article_id durch eine Variable namens $ password zu ersetzen. – Abinadi

+0

Warum sprintf() überhaupt - PHP hat variable Interpolation in Strings. OTOH, eine mit sprintf() erstellte SQL-Anweisung ist genauso unsicher wie eine interpolierte ... Beide Methoden sollten vermieden werden. – Tomalak

+0

@Tomalak - Ich weiß, aber hat nur einen Fehler in seinem Code hervorgehoben, nicht eine bessere Methode vorgeschlagen. – JasonV

1

ich würde empfehlen, eine reife DB-Abstraktionsschicht wie Zend_Db mit (es gibt Tonnen von ihnen gibt). Die Implementierung Ihrer eigenen Homebrew-Lösung würde ich nicht für ein Produktionssystem empfehlen.

2

Sie benötigen eine Verbindung, um mysql_real_escape_string() zu verwenden, da sie den Verschlüsselungstyp des Servers verwendet, um die Analyse zu vereinfachen.

Auch die sprintf() sollte

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

In meiner war ich nicht sicher, ob die ID notwendigerweise eine ganze Zahl war, also ging ich einfach mit einem String-Format. – JasonV

3

Warnung mit: mysql_real_escape_string() [function.mysql-Echt Escape-String]: Zugriff verweigert für Benutzer 'mexautos' @ 'localhost' (mit Passwort: NO)

Warnung: mysql_real_escape_string() [function.mysql-real-escape-string]: Eine Verbindung zum Server nicht

hergestellt werden kann

Haben Sie den Link überprüfen? Ist es aktiv? Sie müssen vor der Verwendung verbunden sein mysql_real_escape_string() Vergessen Sie nicht, das Passwort zu setzen?

Versuchen:

mysql -u mexautos -p 

(Typ, wenn kein Passwort eingeben)

Überprüfen Sie auch, Ihre sprintf() Funktion, müssen Sie die% s verwenden Ihre Variable

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

Der Fehler scheint Zugriff bezogen zu sein. –

+0

Der Versuch, sich über die Konsole zu verbinden, ist eine Möglichkeit, das Privileg auf rohe Weise zu prüfen! –

0

Wie der andere sagte, nicht '$ user', sondern '% s' und Sie brauchen eine offene Verbindung.

@Tomalak Sprintf ist schneller - das ist der Grund warum man es benutzt - es ist eine native C-Funktion.

+0

sprintf ist schneller als was? Bei der Interaktion mit der Datenbank ist das kein besonders guter Grund ... –

+0

sprintf ist schneller als PHP-String-Interpolation, und es war nicht verwandt mit dem Datenbank-Thema, sondern mit Tomalaks Kommentar. – shazarre