2013-06-05 96 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或十六進制。查詢不允許包含二進制數據,它們必須是可打印的,即使在數據庫中允許爲查詢本身存儲二進制數據,它也必須被「消毒」和「可打印」。 – Patashu

+0

您在查詢中未執行的輸入清理需要在所有查詢中的任何地方完成,以確保您的腳本安全。輸入中的特殊字符不應影響您的查詢。 – Paulpro

+1

的可能的複製[如何防止在PHP中SQL注入?(http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php)。到目前爲止,您顯然將注入原始輸入到SQL中。 –

回答

0

Patashu的評論解決我的問題。使用base64_encode()和base64_decode()可以防止查詢中的錯誤,這顯然是由查詢中發送二進制文件引起的。感謝Patashu !!!

+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