Шифрование ломает запрос MySQL?

Что ж, как новичок в шифровании, я наконец разработал отличную систему. Проблема в том, что я почти уверен, что это нарушает мои SQL-запросы. Если бы кто-нибудь из вас мог мне помочь, я уверен, что это то, что я легко упустил из виду. Это код, который я использовал для генерации ключей:

include('Crypt/RSA.php');

$rsa = new Crypt_RSA();

extract($rsa->createKey());

А это код для шифрования:

openssl_public_encrypt($data, $encrypted, $publickey);
return $encrypted;

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

Когда я печатаю запрос для отладки, я вижу зашифрованную строку ... ½ï¿½ï¿½Z�EI)ß�'�cy/� I��#?��1Gh���$�d�

что иногда преждевременно завершает строку запроса. Мне интересно, есть ли конкретная кодировка, которую я должен указать, или мне нужно изменить тип данных MySQL (он был установлен на LONGTEXT, а затем на LONGBLOB).

Еще раз спасибо заранее!


person Elie Zeitouni    schedule 05.06.2013    source источник
comment
Вам нужно закодировать его как base64 или hex, прежде чем использовать его в запросе. Запросы не могут содержать двоичные данные, они должны быть доступны для печати, даже если в базе данных вам разрешено хранить двоичные данные для самого запроса, они должны быть «очищены» и «доступны для печати».   -  person Patashu    schedule 06.06.2013
comment
Очистка ввода, которую вы не выполняете в своем запросе, должна выполняться везде во всех запросах, чтобы сделать ваши сценарии безопасными. Специальные символы в вашем вводе не должны влиять на ваши запросы.   -  person Paul    schedule 06.06.2013
comment
Возможный дубликат Как предотвратить внедрение SQL в PHP?. До сих пор вы явно вводили необработанные данные в свой SQL.   -  person Álvaro González    schedule 06.06.2013


Ответы (1)


Комментарий Паташу решил мою проблему. Использование base64_encode() и base64_decode() предотвратило ошибки в запросе, которые, очевидно, были вызваны отправкой двоичного кода в запросе. Спасибо Паташу!!!

person Elie Zeitouni    schedule 06.06.2013
comment
Вы должны относиться к двоичным данным как к двоичным данным! Сохраните его в столбце BLOB, правильно экранируйте или используйте соответствующие API базы данных для передачи двоичных данных в виде больших двоичных объектов (в зависимости от вашего коннектора базы данных). Кодирование Base64 - это один из способов исправить симптом, но он не делает этого должным образом. - person deceze♦; 06.06.2013
comment
@deceze Обычно я избегаю ввода формы, но я всегда беспокоился, что избегание зашифрованных данных может их повредить. И есть ли причина, по которой кодирование и сохранение MEDIUMTEXT в Base64 является худшим методом, чем сохранение экранированных двоичных данных в виде MEDIUMBLOB? Спасибо за ваше терпение, я делаю все возможное, чтобы учиться правильно. - person Elie Zeitouni; 06.06.2013
comment
См. stackoverflow.com /вопросы/7550030/. Обработка данных как двоичных данных, по крайней мере, дает вам преимущество в размере, данные в кодировке base64 занимают примерно на 33% больше места, чем двоичные данные. Это также позволяет базе данных обрабатывать данные такими, какие они есть, позволяя вам использовать функции, которые воздействуют на двоичные данные в самой базе данных (это может быть скорее теоретическим, чем практическим преимуществом, если вы не делаете все, что связано с данными в базе данных). - person deceze♦; 06.06.2013
comment
Большое спасибо, я сделаю, как вы предложили. Кроме того, ссылка, которую вы разместили, кажется, является точным вопросом, который я пытался задать (думаю, я пропустил его, так как не искал двоичный код). Есть ли способ перечислить мой как дубликат? Я знаю, что задавать уже отвеченный вопрос не одобряют. - person Elie Zeitouni; 06.06.2013