溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQL_MODE為嚴格模式下的數(shù)據(jù)安全專題報告

發(fā)布時間:2020-08-03 11:42:20 來源:網(wǎng)絡(luò) 閱讀:516 作者:necther 欄目:數(shù)據(jù)庫
專題描述詳細描述SQL_MODE為嚴格模式下可能出現(xiàn)的數(shù)據(jù)錯誤風險。
問題提出1日期默認'0000-00-00 00:00:00'的,查詢時會直接報錯。
Caused by: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
URL需添加如下參數(shù):zeroDateTimeBehavior=convertToNull。
2OMS數(shù)據(jù)庫因UAT環(huán)境和性能測試環(huán)境的參數(shù)配置不同,導致性能測試環(huán)境下應用SQL執(zhí)行報錯,相關(guān)參數(shù)為STRICT_TRANS_TABLES與explicit_defaults_for_timestamp。
數(shù)據(jù)風險1整型類型數(shù)據(jù)值截斷風險

重點關(guān)注 TINYINT類型

,其他整數(shù)類型上線初期溢出概率低。

以“`payment_display_mode` tinyint(4) 

DEFAULT NULL COMMENT '付款到期日顯示方式: 

11-最晚匯款日 12-到期日',” 為例。

示例:在非嚴格模式下,應用程序為 

字段 payment_display_mode 設(shè)置一個值 

小于-128 或大于127 ,

則超過部分會被截斷(超過-128,則存儲為-128,例如 -200 會默認變成 -128;超過127,則存儲為127),例如 300 會默認變成127。

2浮點類型截斷

以“`longitude` DECIMAL(19,5) NULL

 DEFAULT '0.00000' COMMENT '經(jīng)度坐標'” 

為例。


示例:在非嚴格模式下,應用程序為 

字段 longitude 設(shè)置一個值 

超過 5位小數(shù)或者整數(shù)超過14位,

則超過部分會被截斷。

3字符串類型風險

以“`MODIFIER_USER` VARCHAR(30) NUL

L DEFAULT NULL COMMENT '更新者用戶賬號',”

 為例。


示例:在非嚴格模式下,

應用程序為 字段 MODIFIER_USER 

設(shè)置一個值 超過 30個字符,則超過部分會被截斷。

4時間類型風險由于JAVA代碼認為0000-00-00 00:00:00時間是非法的時間,JDBC中提供參數(shù)控制對它的處理, 故可通過添加zeroDateTimeBehavior=convertToNull使其轉(zhuǎn)化為null。 

連接字符串示例: 
jdbc:mysql://10.202.198.201:3319/oms6?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull 
5NOT NULL類型風險

非嚴格模式下,不給字段定義約束

NOT NULL字段賦值 或 給其一個NULL值,

在無定義約束無默認值的情況下:數(shù)據(jù)值類型的

字段值默認為0,字符串類型的字段值默認為空字符串''。從SQL語句和存儲過程處理分析,多數(shù)情況下都兼容處理了,但依然請研發(fā)團隊謹慎評估。

問題原因數(shù)據(jù)庫SQL_MODE設(shè)置為嚴格模式。
解決方案1建議DBA團隊設(shè)置SQL_MODE為嚴格模式,運行系統(tǒng)進行測試,將根據(jù)報錯定位存在的數(shù)據(jù)隱患,修改程序。
2設(shè)置服務器SQL_MODE為嚴格模式。
知識點1

數(shù)據(jù)庫SQL_MODE設(shè)置為嚴格模式將出現(xiàn)問題分為以下幾類

:1、日期默認'0000-00-00 00:00:00'的;查詢時會直接報錯,

2、字段類型設(shè)置為NOT NULL時,插入NULL值將報錯;

3、當插入超出數(shù)值字段類型范圍的值時,直接報錯;

2STRICT_TRANS_TABLES釋義:

官方文檔鏈接:

http://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sql-mode-strict

官方文檔解釋:For transactional tables, an error occurs for invalid or missing values in a data-change statement when either STRICT_ALL_TABLES or STRICT_TRANS_TABLES is enabled. The statement is aborted and rolled back.
使用該參數(shù)的主要目的還是使得數(shù)據(jù)庫面對錯誤的數(shù)據(jù)和操作時傾向于報錯,而不是給出警告。便于提早發(fā)現(xiàn)問題,與規(guī)范對數(shù)據(jù)庫的操作。
3

數(shù)據(jù)庫SQL_MODE設(shè)置為非嚴格模式時,系統(tǒng)上述情況傾向于警告

。插入超過數(shù)值類型范圍字段值時系統(tǒng)取最大值插入,

插入字符類型字段值超過長度范圍時會截斷。


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI