Очистить пользовательский ввод, предназначенный для базы данных в PHP - PullRequest
0 голосов
/ 05 июня 2009

У меня есть этот код:

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

Я пробовал этот код для очистки:

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

но я получаю эту ошибку для строк 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

Я получил имя пользователя здесь, я не знаю, достаточно ли это безопасно:

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

Thx

Ответы [ 7 ]

8 голосов
/ 05 июня 2009

Прежде чем вы сможете использовать mysql_real_escape_string, вам нужно соединение mysql.

7 голосов
/ 05 июня 2009

Я бы предложил использовать для этого подготовленные заявления вместо sprintf

3 голосов
/ 05 июня 2009

Предупреждение: mysql_real_escape_string () [Function.mysql реального спусковой строка]: пользователю отказано в доступе 'mexautos' @ 'localhost' (используя пароль: НЕТ)

Предупреждение: mysql_real_escape_string () [function.mysql-real-escape-string]: A ссылка на сервер не может быть установлено

Вы проверили ссылку? Это активно? Прежде чем использовать mysql_real_escape_string () , вам необходимо подключиться Вы не забыли установить пароль?

Попробуйте:

mysql -u mexautos -p

(введите Enter, если нет пароля)

Также проверьте функцию sprintf () , вам нужно использовать% s для привязки вашей переменной

$a = 'Foo';
$b = 'Bar';
$foo = sprintf('Foo Bar %s %s', $a, $b);
3 голосов
/ 05 июня 2009

Не уверен, что именно это является причиной вашей проблемы, но я считаю, что переменные в вашем выражении sprintf не должны быть '$ user' и '$ this-> id', но они должны быть '% s'

http://us2.php.net/sprintf

2 голосов
/ 05 июня 2009

Чтобы использовать mysql_real_escape_string (), вам необходимо соединение, потому что оно использует тип кодировки сервера, чтобы помочь санации.

Также sprintf () должен выглядеть примерно так

$query = sprintf("SELECT id FROM votes WHERE username = '%s' and article_id = %d", 
    mysql_real_escape_string($user), 
    mysql_real_escape_string($password));
1 голос
/ 05 июня 2009

Я бы порекомендовал использовать зрелый слой абстракции БД, такой как Zend_Db (их множество). Реализация собственного решения для домашнего пивоварения я бы не рекомендовал для производственной системы.

0 голосов
/ 05 июня 2009

Как и другие, не '$ user', а '% s', и вам нужно открытое соединение.

@ Томалак sprintf работает быстрее - вот почему его следует использовать - это встроенная функция языка Си.

...