mysql因爲字段太長插入時截斷插入但java後臺卻報錯

LengF:在看《PHP高級漏洞審覈技術》認真的看了這兩點,暫且記下。
對於不少web應用文件在不少功能是不允許重複數據的,好比用戶註冊功能等。通常的應用程序對於提交註冊的username和數據庫裏已有的username對比是否是已經有重複數據,然而咱們能夠經過「數據截斷」等來饒過這些判斷,數據庫在處理時候產生截斷致使插入重複數據。html

1) Mysql SQL Column Truncation Vulnerabilitiesmysql

這個漏洞又是大牛Stefan Esser發現的(Stefan Esser是個人偶像:)),這個是因爲mysql的sql_mode設置爲default的時候,即沒有開啓STRICT_ALL_TABLES選項時,MySQL對於插入超長的值只會提示warning,而不是error(若是是error就插入不成功),這樣可能會致使一些截斷問題。測試以下:web

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

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 vulnerabilityfetch

這個漏洞是80sec發現的,當mysql進行數據存儲處理utf8等數據時對某些字符致使數據截斷。測試以下:spa

mysql> insert into truncated_test(`username`,`password`) values(concat("admin",0xc1), "new_pass2");
Query OK, 1 row affected, 1 warning (0.00 sec)orm

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)htm


不少的web應用程序沒有考慮到這些問題,只是在數據存儲前簡單查詢數據是否包含相同數據,以下代碼:

$result = mysql_query("SELECT * from test_user where user='$user' ");  ....if(@mysql_fetch_array($result, MYSQL_NUM)) {        die("already exist");}

相關文章
相關標籤/搜索