MySQL сообщает об ошибках синтаксиса при вставке изображений .png как BLOB

0

Я разрабатываю редактор символов внутри игры, используя PHP для связи Unity с базой данных MySQL.

После того как игроки отредактируют свои персонажи, я обновляю БД новой текстурой для символа и его уникального идентификатора. Я собираю эти параметры из Unity С# следующим образом:

string idAlumno = GameManager.Instance.usuario.Id.ToString();
string idAvatar = args.json["id"];
BinaryDataField binary = new BinaryDataField();
binary.fieldName = "imagenAvatar";
binary.contents = character.finalTexture.EncodeToPNG();

Затем я отправляю запрос с этими idAlumno, idAvatar и binary файлом в PHP, который обрабатывает взаимодействие с базой данных следующим образом:

<?php
include ('conexion.php');

$idAlumno = $_POST['idAlumno'];
$idAvatar = $_POST['idAvatar'];
$imagenAvatar = file_get_contents($_FILES['imagenAvatar']['tmp_name']);

$query = "UPDATE alumnos SET idAvatar = {$idAvatar}, imagenAvatar = {$imagenAvatar} WHERE idAlumno = {$idAlumno}";

$return = array ();

if ( !$mysqli->query($query) ) {
    die("Error: {$mysqli->errno}; {$mysqli->error}; Query -> {$query}");
}

$return['id'] = $mysqli->insert_id;

echo json_encode($return);

Это сообщает:

Error: 1064; You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' ' at line 2

и запрос выглядит так:

UPDATE alumnos SET idAvatar = 69, imagenAvatar = �PNG  IHDR+� IDATx�y�$�}&��u]]}��=G3�$n�(J$�X���V+i�c-��^{�v��P����6$Y)-I��(�)�$H� ��'L�=}��u���UeuvOY�U�u��Lvfe����^���{�����jA@A@A@A��0Z�y�:A@A@A@A@ "�~ �� �� �� �"h��,MA@A@A@D }@A@A@A@hD�/Y�(�� �� �� �@�� �� �� �� ��� ^�4QA@A@A@��A@A@A@A� @�di� �� �� �� ��� �� �� �@ 

... и кучу лишних странных линий.

Это кажется странным для меня, поскольку я пытался редактировать blob из PhpMyAdmin, и полученный запрос выглядит намного более аккуратным:

UPDATE 'alumnos' SET 'imagenAvatar' = 0x89504e470d0a1a0a0000000d4948445200000400000004[...]

Я попытался сохранить изображение, возвращенное

file_get_contents($_FILES['imagenAvatar']['tmp_name']);

и он сохраняется и отображается правильно на моем жестком диске, поэтому это заставляет меня думать, что есть какая-то проблема с тем, как я обрабатываю файл до или во время запроса, но я не могу найти, что это такое.

Текущая сортировка в моей базе данных - utf8md4_unicode_ci, хотя я уже пробовал использовать utf8 с теми же или похожими результатами.


Я также пробовал использовать addslashes(), mysqli::real_escape_string() или их комбинацию и даже использовать функции fopen() и fread() после сохранения временного файла на моем жестком диске. Все они всегда приводят к одной и той же ошибке

  • 2
    Вы должны сохранить изображения на сервере и использовать путь к нему в своей базе данных. Хранение изображений в базе данных само по себе не рекомендуется.
  • 0
    ВНИМАНИЕ : При использовании mysqli вы должны использовать параметризованные запросы и bind_param для добавления пользовательских данных в ваш запрос. НЕ используйте интерполяцию или конкатенацию строк для достижения этой цели, поскольку вы создали серьезную ошибку внедрения SQL . НИКОГДА не помещайте $_POST , $_GET или любые пользовательские данные непосредственно в запрос, это может быть очень вредно, если кто-то попытается использовать вашу ошибку.
Теги:
mysqli

1 ответ

0

Увидеть ниже:

$idAlumno = $_POST['idAlumno']; // escape this or cast to int!
$idAvatar = $_POST['idAvatar']; // escape this or cast to int!
$imagenAvatar = file_get_contents($_FILES['imagenAvatar']['tmp_name']);
$imagenAvatar = bin2hex($imagenAvatar);
$query = "UPDATE alumnos SET idAvatar = {$idAvatar}, imagenAvatar = 0x{$imagenAvatar} WHERE idAlumno = {$idAlumno}";

Обратите внимание, что 0x добавляется к шестнадцатеричной строке.

Не связанный с вашим вопросом, но, возможно, имеющий отношение к вашему проекту, вы можете захотеть переосмыслить хранение изображений в базе данных. Возможно, вы можете сохранить их в каталоге и вместо этого сохранить путь.

Вы также можете переключиться на использование PDO или другой библиотеки DB. В любом случае, убедитесь, что каждое значение в запросе либо выведено из белого списка, либо экранировано.

  • 1
    Это полностью пропускает проблему, и эта проблема - неэкранированные данные .
  • 0
    Обратите внимание на комментарии в моем коде: escape this or cast to int! , Также обратите внимание на последнее предложение в моем посте: в Either way, make sure every value in a query is either pulled from a whitelist or escaped. Также обратите внимание, что изображение экранируется путем преобразования его в гекс. Что еще я должен сделать, чтобы направить ФП на санацию его данных?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню