2013-06-05 4 views
0

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

include('Crypt/RSA.php'); 

$rsa = new Crypt_RSA(); 

extract($rsa->createKey()); 

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

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

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

При печати запроса для отладки, я вижу зашифрованную строку «ï¿½ï¿½y�6u�������2�N���Ī� : ������7�����Bï¿ ½ï¿½ï¿½ï¿½ < ����� ��7�;[�N\�����y/�X��߭֟*��� = �- �����Z�EI) ß�'�cy/� I�� #? ��1Gh�� $ �d�

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

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

+0

Прежде чем использовать его в запросе, вы должны закодировать его как base64 или hex. Запросам не разрешается содержать двоичные данные, они должны быть доступны для печати, хотя в базе данных вам разрешено хранить двоичные данные для самого запроса, она должна быть «дезинфицирована» и «печататься». – Patashu

+0

Входная санитария, которую вы не делаете в своем запросе, должна выполняться везде во всех запросах, чтобы обеспечить безопасность ваших сценариев. Специальные символы на вашем входе не должны влиять на ваши запросы. – Paulpro

+1

Возможный дубликат [Как предотвратить SQL-инъекцию в PHP?] (Http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php). До сих пор вы явно вводите исходный ввод в свой SQL. –

ответ

0

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

+0

Вы должны рассматривать двоичные данные как двоичные данные! Храните его в столбце BLOB, ** убегайте ** правильно или используйте соответствующие API баз данных, чтобы передавать двоичные данные в виде BLOB (в зависимости от вашего соединителя базы данных). Кодирование Base64 - это один из способов исправить симптом, но он не делает это правильно. – deceze

+0

@deceze Я обычно избегаю ввода форм, но я всегда опасался, что экранирование зашифрованных данных может привести к его повреждению. И есть ли причина, по которой Base64-кодирование и хранение MEDIUMTEXT хуже, чем хранение экранированных двоичных данных как MEDIUMBLOB? Благодарим вас за терпение, я прилагаю все усилия, чтобы научиться правильному пути. –

+1

См. Http://stackoverflow.com/questions/7550030/mysql-insert-binary-data-to-db-without-errors. Обработка данных в виде двоичных данных, по крайней мере, дает вам преимущество по размеру, данные с кодировкой base64 занимают на ~ 33% больше места, чем двоичные данные. Он также позволяет базе данных обрабатывать данные так, как они есть, что позволяет использовать функции, которые действуют на двоичные данные в самой базе данных (это может быть скорее теоретическое, чем практическое преимущество, если вы не делаете ничего * ничего с данными в базе данных). – deceze

Смежные вопросы