2010-09-08 94 views
2

也許我對這方面還沒有足夠的瞭解,所以我正在尋找一個小方向。安全問題/ SQL注入與MySQL整理?

我們所有的表格都顯示latin1_swedish_ci的排序規則。下面是我在MySQL變量看:

collation connection utf8_general_ci 
(Global value) latin1_swedish_ci 
collation database latin1_swedish_ci 
collation server latin1_swedish_ci 

現在,我們看到的UTF8(或者,至少,外語內容)存儲在DB漂亮頻繁,它正確呈現。排序規則對此無關緊要嗎?

在用戶輸入中使用類似於php的addslashes()這樣就足夠了嗎?或者,這是否留下了一個注入機會?

編輯: 所以,看的全套整理/字符集設置,至少在phpMyAdmin,我看到:

character set client utf8 
(Global value) latin1 
character set connection utf8 
(Global value) latin1 
character set database latin1 
character set filesystem binary 
character set results utf8 
(Global value) latin1 
character set server latin1 
character set system utf8 
character sets dir /usr/share/mysql/charsets/ 
collation connection utf8_general_ci 
(Global value) latin1_swedish_ci 
collation database latin1_swedish_ci 
collation server latin1_swedish_ci 
+0

這些設置意味着什麼。他們都被覆蓋。它只是默認值。檢查特定的表字符集。 SHOW CREATE TABLE查詢可以顯示它 – 2010-09-08 22:10:46

+0

在我們的各種表上運行「show create table」顯示默認字符集= latin1。在我們的php方面,我們將輸出內容類型設置爲utf-8。所以,這裏可能會有不匹配的情況,但是事情可以正確顯示。 。 。 – Neil 2010-09-08 22:43:03

回答

2

collation不會只描述規則比較某個字符集的字符。一個規則可以是a等於Ab等於B等或ß等於ssä等於ae

而對於字符串爲MySQL明確的轉義,使用mysql_real_escape_string。該功能與addslashesmysql_escape_string相反,將連接的實際字符編碼考慮在內。

但是,您需要使用mysql_set_charset來設置連接的字符編碼。因爲否則的改變將不被認可(見C API Functions Description – mysql_real_escape_string()):

如果您需要更改字符集的連接,你應該使用mysql_set_character_set()功能,而不是執行SET NAMES(或SET CHARACTER SET)語句。 mysql_set_character_set()的作品類似SET NAMES,但也會影響mysql_real_escape_string()所使用的字符集,而SET NAMES則不會。

+0

+1這是正確的答案。雖然adodb和pdo使用mysql_escape_string(),並且每個人都喜歡參數化查詢... – rook 2010-09-08 19:36:42

+1

mysql_real_escape_string只有在使用了mysql_set_charset()的情況下才會執行它。否則它將作爲mysql_escape_string – 2010-09-08 19:39:49

+0

@Col。彈片:不知道。但是你是對的,請參閱http://dev.mysql.com/doc/refman/5.0/en/mysql-real-escape-string.html。 – Gumbo 2010-09-08 20:38:00

0

我們的表的所有顯示的latin1_swedish_ci
外語內容的歸類正確呈現

也有一些是錯誤的數據庫。
它將無法存儲非拉丁字符或無法正確地排序/過濾數據庫內容。

要存儲外來字符,應該爲表設置utf8字符集。以及連接字符集。

在用戶輸入上使用類似php addslashes()這樣就足夠了嗎?

addslashes是足夠的,如果你的字符集latin1和utf8只。 但其餘的是錯誤的。

  1. addslashes()或其他轉義函數不能幫助孤單!它僅適用於圍繞轉義數據的引號。因此,它不應該只是「使用諸如addslashes()之類的東西」,而是「對引用的字符串使用諸如addslashes()之類的東西並對數字進行類型轉換」
  2. 不適合用戶輸入!逃跑不是爲了消毒!這只是爲了正確的查詢格式。任何查詢。用任何數據。不僅用戶輸入,正如在這個貧窮世界中的每個人都認爲的那樣,而且對於任何數據(即以查詢字符串形式進行查詢)。
+0

感謝您的反饋。我在上面列出了我的完整字符集/整理設置,不確定哪些不正確。另外,不知道我的php進程中的設置會是什麼,會看看我能否弄清楚。 – Neil 2010-09-08 21:57:31