sprintf и% подписываются в тексте - PullRequest
1 голос
/ 07 апреля 2010

Проблема, с которой я недавно столкнулся, заключалась в том, что при попытке обновить поле в моей базе данных с помощью этого кода не будет работать. Я проследил это до наличия знака% в обновляемом тексте ($ note, затем $ note_escaped) ... Вставка с помощью sprintf работала нормально.

Разве я не должен использовать sprintf для обновлений или он должен формироваться по-другому?

Я немного искал, но ничего не смог придумать.

$id = mysql_real_escape_string($id);
$note_escaped = mysql_real_escape_string($note);
$editedby = mysql_real_escape_string($author);
$editdate = mysql_real_escape_string($date);
//insert info from form into database
$query= sprintf("UPDATE notes_$suffix SET note='$note_escaped', editedby='$editedby', editdate='$editdate' WHERE id='$id' LIMIT 1");

Большое спасибо!

Ответы [ 5 ]

5 голосов
/ 07 апреля 2010

Вы используете sprintf совершенно неправильно. Удаление вызова функции в вашем коде все равно будет делать то же самое. Должно быть:

sprintf("UPDATE notes_%s SET note='%s', editedby='%s', editdate='%s' WHERE id=%d LIMIT 1", $suffix, $note_escaped, $editedby, $editdate, $id);

Вы должны прочитать руководство.

2 голосов
/ 07 апреля 2010

Прежде всего вы должны использовать подготовленные операторы вместо вызова sprintf

но если вам абсолютно необходимо сделать это таким образом, вы должны использовать:

$id = mysql_real_escape_string($id);
$note_escaped = mysql_real_escape_string($note);
$editedby = mysql_real_escape_string($author);
$editdate = mysql_real_escape_string($date);
//insert info from form into database
$query= sprintf("
  UPDATE notes_%s /* this is still open for injection, and cannot be properly escaped with mysql_real_escape_string */
  SET note='%s', 
  editedby='%s', 
  editdate='%s' 
  WHERE id='%d'
  LIMIT 1",
$suffix,
$note_escaped, $editedby, $editdate, $id);
1 голос
/ 07 апреля 2010

sprintf () мало используется в PHP, если вам не нужно как-то форматировать данные. Эти два оператора работают одинаково в PHP:

$num = 42;
$char = 'q';

$text = sprintf('The number is %d and the character is %s', $num, $char);
$text = "The number is $num and the character is $char";

sprintf больше использует в C для «печати» переменных данных в строку. Но PHP уже может делать это со строками в двойных кавычках, поэтому, если вам не нужно использовать специальные функции форматирования sprintf (например, %0.2f для плавающего числа с двумя десятичными знаками), проще использовать метод обычной строки.

1 голос
/ 07 апреля 2010

Вы можете экранировать % в исходном тексте, заменив его на \% в mysql.

0 голосов
/ 07 апреля 2010

С http://php.net/manual/en/function.mysql-real-escape-string.php:

Примечание: mysql_real_escape_string () не выходит за пределы% и _.Это подстановочные знаки в MySQL в сочетании с LIKE, GRANT или REVOKE.

Вам необходимо вручную экранировать% и _, если они есть, с \% и _.Я не рекомендую использовать sprintf, но просто улучшаю функцию escape.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...