天天看點

mysql資料太長無法插入_mysql由于字段太長插入時截斷插入但java背景卻報錯

LengF:在看《PHP進階漏洞稽核技術》認真的看了這兩點,暫且記下。

對于很多web應用檔案在很多功能是不容許重複資料的,比如使用者注冊功能等。一般的應用程式對于送出注冊的username和資料庫裡已有的username對比是不是已經有重複資料,然而我們可以通過“資料截斷”等來饒過這些判斷,資料庫在處理時候産生截斷導緻插入重複資料。

1) Mysql SQL Column Truncation Vulnerabilities

這個漏洞又是大牛Stefan Esser發現的(Stefan Esser是我的偶像:)),這個是由于mysql的sql_mode設定為default的時候,即沒有開啟STRICT_ALL_TABLES選項時,MySQL對于插入超長的值隻會提示warning,而不是error(如果是error就插入不成功),這樣可能會導緻一些截斷問題。測試如下:

mysql> insert into truncated_test(`username`,`password`) values("admin","pass");

mysql> insert into truncated_test(`username`,`password`) values("admin           x", "new_pass");

Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> select * from truncated_test;

+----+------------+----------+

| id | username   | password |

+----+------------+----------+

| 1 | admin      | pass     |

| 2 | admin      | new_pass |

+----+------------+----------+

2 rows in set (0.00 sec)

2) Mysql charset Truncation vulnerability

這個漏洞是80sec發現的,當mysql進行資料存儲處理utf8等資料時對某些字元導緻資料截斷。測試如下:

mysql> insert into truncated_test(`username`,`password`) values(concat("admin",0xc1), "new_pass2");

Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from truncated_test;www.2cto.com

+----+------------+----------+

| id | username   | password |

+----+------------+----------+

| 1 | admin      | pass      |

| 2 | admin      | new_pass  |

| 3 | admin      | new_pass2 |

+----+------------+----------+

2 rows in set (0.00 sec)

很多的web應用程式沒有考慮到這些問題,隻是在資料存儲前簡單查詢資料是否包含相同資料,如下代碼:

$result = mysql_query("SELECT * from test_user where user='$user' ");

....

if(@mysql_fetch_array($result, MYSQL_NUM)) {

die("already exist");

}