a、命名規(guī)約
變量:不知道類型的用大寫字母開頭则北。否則:
? ? 字符串 = $sMyName
? ? 數(shù)組 = $aMyCard 二維數(shù)組 = $aaMyCard
? ? 對象 = $oMyObject
? ? 資源 = $resource
? ? 布爾值 = $flag
? ? 整型 = $iMyNumber
? ? 浮點(diǎn)型 = $fMyMoney
類名命名規(guī)則 = ‘i’ + 接口命名規(guī)則? 例如:MyClass iMyInterface
數(shù)據(jù)庫中的所有內(nèi)容命名不得有大寫字母。表名和字段用下劃線連接單詞,例如:blog_user_info辈毯。
部分縮寫:
image = img
string = str
database = db
count = cnt
temporary = tmp
password = pwd
message = msg
代碼注釋應(yīng)該描述為什么,而不是做什么搜贤。
SQL盡量不要寫在函數(shù)里面谆沃,而是先賦給變量,再交給函數(shù)仪芒。
1.代碼中的命名均不能以下劃線或美元符號開始唁影,也不能以下劃線或美元符號結(jié)束。
反例: name / __name / $Object / name / name$ / Object$
2.代碼中的命名嚴(yán)禁使用拼音與英文混合的方式掂名。
正例: alibaba / taobao / youku / hangzhou 等國際通用的名稱据沈,可視同英文。
3. 【強(qiáng)制】類名使用 UpperCamelCase 風(fēng)格饺蔑,必須遵從駝峰形式锌介,但以下情形例外:(領(lǐng)域模型
的相關(guān)命名)PDO 等。
正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion
4.【強(qiáng)制】方法名猾警、參數(shù)名孔祸、成員變量、局部變量都統(tǒng)一使用 lowerCamelCase 風(fēng)格发皿,必須遵從
駝峰形式崔慧。
5. 【強(qiáng)制】常量命名全部大寫,單詞間用下劃線隔開穴墅,力求語義表達(dá)完整清楚惶室,不要嫌名字長。
正例: MAX_STOCK_COUNT
6. 【強(qiáng)制】類名特性應(yīng)在結(jié)尾出表明:異常類命名使用 Exception 結(jié)尾玄货;測試類
命名以它要測試的類的名稱開始皇钞,以 Test 結(jié)尾。
7. 【強(qiáng)制】杜絕完全不規(guī)范的縮寫誉结,避免望文不知義鹅士。
反例: AbstractClass“縮寫”命名成 AbsClass;condition“縮寫”命名成 condi惩坑,此類
隨意縮寫嚴(yán)重降低了代碼的可閱讀性掉盅。
. 【推薦】如果使用到了設(shè)計(jì)模式也拜,建議在類名中體現(xiàn)出具體模式。
正例:public class OrderFactory;
public class LoginProxy;
public class ResourceObserver;
b趾痘、格式規(guī)約
1. 【強(qiáng)制】大括號的使用約定慢哈。如果是大括號內(nèi)為空,則簡潔地寫成{}即可永票,不需要換行卵贱;如果
是非空代碼塊則:
1) 左大括號前不換行。
2) 左大括號后換行侣集。
3) 右大括號前換行键俱。
4) 右大括號后還有 else 等代碼則不換行;表示終止右大括號后必須換行世分。
2. 【強(qiáng)制】 左括號和后一個字符之間不出現(xiàn)空格编振;同樣,右括號和前一個字符之間也不出現(xiàn)空
格臭埋。詳見第 5 條下方正例提示踪央。
3. 【強(qiáng)制】if/for/while/switch/do 等保留字與左右括號之間都必須加空格。
4. 【強(qiáng)制】任何運(yùn)算符左右必須加一個空格。
說明:運(yùn)算符包括賦值運(yùn)算符=、邏輯運(yùn)算符&&童漩、加減乘除符號、三目運(yùn)行符等液斜。
5. 【強(qiáng)制】縮進(jìn)采用 4 個空格,禁止使用 tab 字符叠穆。
說明:如果使用 tab 縮進(jìn)旗唁,必須設(shè)置 1 個 tab 為 4 個空格。IDEA 設(shè)置 tab 為 4 個空格時痹束,
請勿勾選 Use tab character;而在 eclipse 中讶请,必須勾選 insert spaces for tabs祷嘶。
正例: (涉及 1-5 點(diǎn))
public static function student($id){
? ? //四個空格
? ? $id = 12;
? ? if ( $id == 1 ){
? ? ? ? echo 'no';
? ? } else {
? ? ? ? echo 'yes';
? ? }
}
6. 【強(qiáng)制】單行字符數(shù)限制不超過 120 個,超出需要換行夺溢,換行時遵循如下原則:
1) 第二行相對第一行縮進(jìn) 4 個空格论巍,從第三行開始,不再繼續(xù)縮進(jìn)风响,參考示例嘉汰。
2) 運(yùn)算符與下文一起換行。
3) 方法調(diào)用的符號與下文一起換行状勤。
4) 在多個參數(shù)超長鞋怀,逗號后進(jìn)行換行双泪。
5) 在括號前不要換行,見反例密似。
正例:
if ($a == $b || $c == $b
? ? || $b != $d && in_array($s,
? ? $arr))
7. 【強(qiáng)制】方法參數(shù)在定義和傳入時焙矛,多個參數(shù)逗號后邊必須加空格。
正例:下例中實(shí)參的"a",后邊必須要有一個空格残腌。
method("a", "b", "c");
8. 【強(qiáng)制】IDE 的 text file encoding 設(shè)置為 UTF-8; IDE 中文件的換行符使用 Unix 格式村斟,
不要使用 windows 格式。
9. 【推薦】沒有必要增加若干空格來使某一行的字符與上一行的相應(yīng)字符對齊抛猫。
正例:
int a = 3;
long b = 4L;
float c = 5F;
StringBuffer sb = new StringBuffer();
10. 【推薦】方法體內(nèi)的執(zhí)行語句組蟆盹、變量的定義語句組、不同的業(yè)務(wù)邏輯之間或者不同的語義
之間插入一個空行闺金。相同業(yè)務(wù)邏輯和語義之間不需要插入空行逾滥。
說明:沒有必要插入多行空格進(jìn)行隔開。
c掖看、OOP
1. 【強(qiáng)制】避免通過一個類的對象引用訪問此類的靜態(tài)變量或靜態(tài)方法匣距,直接用類名來訪問即可。
2. 【強(qiáng)制】所有的覆寫方法哎壳,必須加@Override 注解毅待。
反例:getObject()與 get0bject()的問題。一個是字母的 O归榕,一個是數(shù)字的 0尸红,加@Override
可以準(zhǔn)確判斷是否覆蓋成功。另外刹泄,如果在抽象類中對方法簽名進(jìn)行修改外里,其實(shí)現(xiàn)類會馬上編
譯報錯。
3. 【強(qiáng)制】構(gòu)造方法里面禁止加入任何業(yè)務(wù)邏輯特石。
4. 【推薦】 類內(nèi)方法定義順序依次是:公有方法或保護(hù)方法 > 私有方法 > 魔術(shù)方法盅蝗。
5. 【推薦】final 可提高程序響應(yīng)效率,聲明成 final 的情況:
1) 不需要重新賦值的變量姆蘸,包括類屬性墩莫、局部變量。
2) 對象參數(shù)前加 final逞敷,表示不允許修改引用的指向狂秦。
3) 類方法確定不允許被重寫。
6. 【推薦】類成員與方法訪問控制從嚴(yán):
1) 如果不允許外部直接通過 new 來創(chuàng)建對象推捐,那么構(gòu)造方法必須是 private裂问。
2) 工具類不允許有 public 構(gòu)造方法。
3) 類非 static 成員變量并且與子類共享,必須是 protected堪簿。
4) 類非 static 成員變量并且僅在本類使用痊乾,必須是 private。
5) 類 static 成員變量如果僅在本類使用戴甩,必須是 private符喝。
6) 若是 static 成員變量,必須考慮是否為 final甜孤。
7) 類成員方法只供類內(nèi)部調(diào)用协饲,必須是 private。
8) 類成員方法只對繼承類公開缴川,那么限制為 protected茉稠。
說明:任何類、方法把夸、參數(shù)而线、變量,嚴(yán)控訪問范圍恋日。過寬泛的訪問范圍膀篮,不利于模塊解耦。思
考:如果是一個 private 的方法岂膳,想刪除就刪除誓竿,可是一個 public 的 Service 方法,或者一
個 public 的成員變量谈截,刪除一下筷屡,不得手心冒點(diǎn)汗嗎?變量像自己的小孩簸喂,盡量在自己的視
線內(nèi)毙死,變量作用域太大,如果無限制的到處跑喻鳄,那么你會擔(dān)心的扼倘。
d、控制語句
1. 【強(qiáng)制】在一個 switch 塊內(nèi)除呵,每個 case 要么通過 break/return 等來終止唉锌,要么注釋說明程
序?qū)⒗^續(xù)執(zhí)行到哪一個 case 為止;在一個 switch 塊內(nèi)竿奏,都必須包含一個 default 語句并且
放在最后,即使它什么代碼也沒有腥放。
2. 【強(qiáng)制】在 if/else/for/while/do 語句中必須使用大括號泛啸,即使只有一行代碼,避免使用
下面的形式:if (condition) statements;
3. 【推薦】推薦盡量少用 else秃症, if-else 的方式可以改寫成:
if(condition){
...
return obj;
}
// 接著寫 else 的業(yè)務(wù)邏輯代碼;
說明:如果非得使用 if()...else if()...else...方式表達(dá)邏輯候址,【強(qiáng)制】請勿超過 3 層吕粹,
超過請使用狀態(tài)設(shè)計(jì)模式。
正例:邏輯上超過 3 層的 if-else 代碼可以使用衛(wèi)語句岗仑,或者狀態(tài)模式來實(shí)現(xiàn)匹耕。
4. 【推薦】除常用方法(如 getXxx/isXxx)等外,不要在條件判斷中執(zhí)行其它復(fù)雜的語句荠雕,將復(fù)
雜邏輯判斷的結(jié)果賦值給一個有意義的布爾變量名稳其,以提高可讀性。
說明:很多 if 語句內(nèi)的邏輯相當(dāng)復(fù)雜炸卑,閱讀者需要分析條件表達(dá)式的最終結(jié)果既鞠,才能明確什么
樣的條件執(zhí)行什么樣的語句,那么盖文,如果閱讀者分析邏輯表達(dá)式錯誤呢嘱蛋?
正例:
//偽代碼如下
boolean existed = (file.open(fileName, "w") != null) && (...) || (...);
if (existed) {
...
}
反例:
if ((file.open(fileName, "w") != null) && (...) || (...)) {
...
}
5. 【推薦】循環(huán)體中的語句要考量性能,以下操作盡量移至循環(huán)體外處理五续,如定義對象洒敏、變量、
獲取數(shù)據(jù)庫連接疙驾,進(jìn)行不必要的 try-catch 操作(這個 try-catch 是否可以移至循環(huán)體外)凶伙。
e、MySQL規(guī)約
1. 【強(qiáng)制】表達(dá)是與否概念的字段荆萤,必須使用 is_xxx 的方式命名镊靴,數(shù)據(jù)類型是 unsigned tinyint
( 1 表示是,0 表示否)链韭,此規(guī)則同樣適用于 odps 建表偏竟。
說明:任何字段如果為非負(fù)數(shù),必須是 unsigned敞峭。
2. 【強(qiáng)制】表名踊谋、字段名必須使用小寫字母或數(shù)字;禁止出現(xiàn)數(shù)字開頭旋讹,禁止兩個下劃線中間只
出現(xiàn)數(shù)字殖蚕。數(shù)據(jù)庫字段名的修改代價很大,因?yàn)闊o法進(jìn)行預(yù)發(fā)布沉迹,所以字段名稱需要慎重考慮睦疫。
正例:getter_admin,task_config鞭呕,level3_name
反例:GetterAdmin蛤育,taskConfig,level_3_name
3. 【強(qiáng)制】表名不使用復(fù)數(shù)名詞。
說明:表名應(yīng)該僅僅表示表里面的實(shí)體內(nèi)容瓦糕,不應(yīng)該表示實(shí)體數(shù)量底洗,對應(yīng)于 DO 類名也是單數(shù)
形式,符合表達(dá)習(xí)慣咕娄。
4. 【強(qiáng)制】禁用保留字亥揖,如 desc、range圣勒、match费变、delayed 等,請參考 MySQL 官方保留字灾而。
5. 【強(qiáng)制】唯一索引名為 uk_字段名胡控;普通索引名則為 idx_字段名。
說明:uk_ 即 unique key旁趟;idx_ 即 index 的簡稱昼激。
6. 【強(qiáng)制】小數(shù)類型為 decimal,禁止使用 float 和 double锡搜。
說明:float 和 double 在存儲的時候橙困,存在精度損失的問題,很可能在值的比較時耕餐,得到不
正確的結(jié)果凡傅。如果存儲的數(shù)據(jù)范圍超過 decimal 的范圍,建議將數(shù)據(jù)拆成整數(shù)和小數(shù)分開存儲肠缔。
7. 【強(qiáng)制】如果存儲的字符串長度幾乎相等夏跷,使用 char 定長字符串類型。
8. 【強(qiáng)制】varchar 是可變長字符串明未,不預(yù)先分配存儲空間槽华,長度不要超過 5000,如果存儲長
度大于此值趟妥,定義字段類型為 text猫态,獨(dú)立出來一張表,用主鍵來對應(yīng)披摄,避免影響其它字段索
引效率亲雪。
9. 【強(qiáng)制】表必備三字段:id, gmt_create, gmt_modified。
說明:其中 id 必為主鍵疚膊,類型為 unsigned bigint义辕、單表時自增、步長為 1寓盗。gmt_create,
gmt_modified 的類型均為 date_time 類型终息。
10. 【推薦】表的命名最好是加上“業(yè)務(wù)名稱_表的作用”夺巩。
正例:tiger_task / tiger_reader / mpp_config
11. 【推薦】庫名與應(yīng)用名稱盡量一致。
12. 【推薦】如果修改字段含義或?qū)ψ侄伪硎镜臓顟B(tài)追加時周崭,需要及時更新字段注釋。
13. 【推薦】字段允許適當(dāng)冗余喳张,以提高性能续镇,但是必須考慮數(shù)據(jù)同步的情況。冗余字段應(yīng)遵循:
1)不是頻繁修改的字段销部。
2)不是 varchar 超長字段摸航,更不能是 text 字段。
正例:商品類目名稱使用頻率高舅桩,字段長度短酱虎,名稱基本一成不變,可在相關(guān)聯(lián)的表中冗余存
儲類目名稱擂涛,避免關(guān)聯(lián)查詢读串。
14. 【推薦】單表行數(shù)超過 500 萬行或者單表容量超過 2GB,才推薦進(jìn)行分庫分表撒妈。
說明:如果預(yù)計(jì)三年后的數(shù)據(jù)量根本達(dá)不到這個級別恢暖,請不要在創(chuàng)建表時就分庫分表。
15. 【參考】合適的字符存儲長度狰右,不但節(jié)約數(shù)據(jù)庫表空間杰捂、節(jié)約索引存儲,更重要的是提升檢
索速度棋蚌。
正例:人的年齡用 unsigned tinyint(表示范圍 0-255嫁佳,人的壽命不會超過 255 歲);海龜
就必須是 smallint谷暮,但如果是太陽的年齡蒿往,就必須是 int;如果是所有恒星的年齡都加起來坷备,
那么就必須使用 bigint熄浓。
16. 【強(qiáng)制】業(yè)務(wù)上具有唯一特性的字段,即使是組合字段省撑,也必須建成唯一索引赌蔑。
說明:不要以為唯一索引影響了 insert 速度,這個速度損耗可以忽略竟秫,但提高查找速度是明
顯的娃惯;另外,即使在應(yīng)用層做了非常完善的校驗(yàn)和控制肥败,只要沒有唯一索引趾浅,根據(jù)墨菲定律愕提,
必然有臟數(shù)據(jù)產(chǎn)生。
17. 【強(qiáng)制】 超過三個表禁止 join皿哨。需要 join 的字段浅侨,數(shù)據(jù)類型保持絕對一致;多表關(guān)聯(lián)查詢
時证膨,保證被關(guān)聯(lián)的字段需要有索引如输。
說明:即使雙表 join 也要注意表索引、SQL 性能央勒。
18. 【強(qiáng)制】在 varchar 字段上建立索引時不见,必須指定索引長度,沒必要對全字段建立索引崔步,根據(jù)
實(shí)際文本區(qū)分度決定索引長度稳吮。
說明:索引的長度與區(qū)分度是一對矛盾體,一般對字符串類型數(shù)據(jù)井濒,長度為 20 的索引灶似,區(qū)分
度會高達(dá) 90%以上,可以使用 count(distinct left(列名, 索引長度))/count(*)的區(qū)分度
來確定眼虱。
19. 【強(qiáng)制】頁面搜索嚴(yán)禁左模糊或者全模糊喻奥,如果需要請走搜索引擎來解決。
說明:索引文件具有 B-Tree 的最左前綴匹配特性捏悬,如果左邊的值未確定撞蚕,那么無法使用此索
引。
20. 【推薦】如果有 order by 的場景过牙,請注意利用索引的有序性甥厦。order by 最后的字段是組合
索引的一部分,并且放在索引組合順序的最后寇钉,避免出現(xiàn) file_sort 的情況刀疙,影響查詢性能。
正例:where a=? and b=? order by c; 索引:a_b_c
反例:索引中有范圍查找扫倡,那么索引有序性無法利用谦秧,如:WHERE a>10 ORDER BY b; 索引
a_b 無法排序。
21. 【推薦】利用覆蓋索引來進(jìn)行查詢操作撵溃,來避免回表操作疚鲤。
說明:如果一本書需要知道第 11 章是什么標(biāo)題,會翻開第 11 章對應(yīng)的那一頁嗎缘挑?目錄瀏覽
一下就好集歇,這個目錄就是起到覆蓋索引的作用。
正例:能夠建立索引的種類:主鍵索引语淘、唯一索引诲宇、普通索引际歼,而覆蓋索引是一種查詢的一種
效果,用 explain 的結(jié)果姑蓝,extra 列會出現(xiàn):using index鹅心。
22. 【推薦】利用延遲關(guān)聯(lián)或者子查詢優(yōu)化超多分頁場景。
說明:MySQL 并不是跳過 offset 行纺荧,而是取 offset+N 行巴帮,然后返回放棄前 offset 行,返回
N 行虐秋,那當(dāng) offset 特別大的時候,效率就非常的低下垃沦,要么控制返回的總頁數(shù)客给,要么對超過
特定閾值的頁數(shù)進(jìn)行 SQL 改寫。
正例:先快速定位需要獲取的 id 段肢簿,然后再關(guān)聯(lián):
SELECT a.* FROM 表 1 a, (select id from 表 1 where 條件 LIMIT 100000,20 ) b where a.id=b.id
23. 【推薦】SQL 性能優(yōu)化的目標(biāo):至少要達(dá)到 range 級別靶剑,要求是 ref 級別,如果可以是 consts
最好池充。
說明:
1)consts 單表中最多只有一個匹配行(主鍵或者唯一索引)桩引,在優(yōu)化階段即可讀取到數(shù)據(jù)。
2)ref 指的是使用普通的索引(normal index)收夸。
3)range 對索引進(jìn)行范圍檢索坑匠。
反例:explain 表的結(jié)果,type=index卧惜,索引物理文件全掃描厘灼,速度非常慢,這個 index 級
別比較 range 還低咽瓷,與全表掃描是小巫見大巫设凹。
24. 【推薦】建組合索引的時候,區(qū)分度最高的在最左邊茅姜。
正例:如果 where a=? and b=? 闪朱,a 列的幾乎接近于唯一值,那么只需要單建 idx_a 索引即
可钻洒。
說明:存在非等號和等號混合判斷條件時奋姿,在建索引時,請把等號條件的列前置航唆。如:where a>?
and b=? 那么即使 a 的區(qū)分度更高胀蛮,也必須把 b 放在索引的最前列。
25. 【參考】創(chuàng)建索引時避免有如下極端誤解:
1)誤認(rèn)為一個查詢就需要建一個索引糯钙。
2)誤認(rèn)為索引會消耗空間粪狼、嚴(yán)重拖慢更新和新增速度退腥。
3)誤認(rèn)為唯一索引一律需要在應(yīng)用層通過“先查后插”方式解決。
26. 【強(qiáng)制】不要使用 count(列名)或 count(常量)來替代 count(*)再榄,count(*)就是 SQL92 定義
的標(biāo)準(zhǔn)統(tǒng)計(jì)行數(shù)的語法狡刘,跟數(shù)據(jù)庫無關(guān),跟 NULL 和非 NULL 無關(guān)困鸥。
說明:count(*)會統(tǒng)計(jì)值為 NULL 的行嗅蔬,而 count(列名)不會統(tǒng)計(jì)此列為 NULL 值的行。
27. 【強(qiáng)制】count(distinct col) 計(jì)算該列除 NULL 之外的不重復(fù)數(shù)量疾就。注意 count(distinct
col1, col2) 如果其中一列全為 NULL澜术,那么即使另一列有不同的值,也返回為 0猬腰。
28. 【強(qiáng)制】當(dāng)某一列的值全是 NULL 時鸟废,count(col)的返回結(jié)果為 0,但 sum(col)的返回結(jié)果為
NULL姑荷,因此使用 sum()時需注意 NPE 問題盒延。
正例:可以使用如下方式來避免 sum 的 NPE 問題:SELECT IF(ISNULL(SUM(g)),0,SUM(g))
FROM table;
29. 【強(qiáng)制】使用 ISNULL()來判斷是否為 NULL 值。注意:NULL 與任何值的直接比較都為 NULL鼠冕。
說明:
1) NULL<>NULL 的返回結(jié)果是 NULL添寺,而不是 false。
2) NULL=NULL 的返回結(jié)果是 NULL懈费,而不是 true计露。
3) NULL<>1 的返回結(jié)果是 NULL,而不是 true楞捂。
30. 【強(qiáng)制】在代碼中寫分頁查詢邏輯時薄坏,若 count 為 0 應(yīng)直接返回,避免執(zhí)行后面的分頁語句寨闹。
31. 【強(qiáng)制】不得使用外鍵與級聯(lián)胶坠,一切外鍵概念必須在應(yīng)用層解決。
說明:(概念解釋)學(xué)生表中的 student_id 是主鍵繁堡,那么成績表中的 student_id 則為外鍵沈善。
如果更新學(xué)生表中的 student_id,同時觸發(fā)成績表中的 student_id 更新椭蹄,則為級聯(lián)更新闻牡。
外鍵與級聯(lián)更新適用于單機(jī)低并發(fā),不適合分布式绳矩、高并發(fā)集群罩润;級聯(lián)更新是強(qiáng)阻塞,存在數(shù)
據(jù)庫更新風(fēng)暴的風(fēng)險翼馆;外鍵影響數(shù)據(jù)庫的插入速度割以。
32. 【強(qiáng)制】禁止使用存儲過程金度,存儲過程難以調(diào)試和擴(kuò)展,更沒有移植性严沥。
33. 【強(qiáng)制】數(shù)據(jù)訂正時猜极,刪除和修改記錄時,要先 select消玄,避免出現(xiàn)誤刪除跟伏,確認(rèn)無誤才能執(zhí)
行更新語句。
34. 【推薦】in 操作能避免則避免翩瓜,若實(shí)在避免不了受扳,需要仔細(xì)評估 in 后邊的集合元素數(shù)量,控
制在 1000 個之內(nèi)兔跌。
35. 【參考】如果有全球化需要辞色,所有的字符存儲與表示,均以 utf-8 編碼浮定,那么字符計(jì)數(shù)方法
注意:
說明:
SELECT LENGTH("輕松工作"); 返回為 12
SELECT CHARACTER_LENGTH("輕松工作")层亿; 返回為 4
如果要使用表情桦卒,那么使用 utfmb4 來進(jìn)行存儲,注意它與 utf-8 編碼的區(qū)別匿又。
36. 【參考】TRUNCATE TABLE 比 DELETE 速度快方灾,且使用的系統(tǒng)和事務(wù)日志資源少,但 TRUNCATE
無事務(wù)且不觸發(fā) trigger碌更,有可能造成事故裕偿,故不建議在開發(fā)代碼中使用此語句。
說明:TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同痛单。
f嘿棘、安全規(guī)約
1. 【強(qiáng)制】隸屬于用戶個人的頁面或者功能必須進(jìn)行權(quán)限控制校驗(yàn)。
說明:防止沒有做水平權(quán)限校驗(yàn)就可隨意訪問旭绒、操作別人的數(shù)據(jù)鸟妙,比如查看、修改別人的訂單挥吵。
2. 【強(qiáng)制】用戶敏感數(shù)據(jù)禁止直接展示重父,必須對展示數(shù)據(jù)脫敏。
說明:查看個人手機(jī)號碼會顯示成:158****9119忽匈,隱藏中間 4 位房午,防止隱私泄露。
3. 【強(qiáng)制】用戶輸入的 SQL 參數(shù)嚴(yán)格使用參數(shù)綁定或者 METADATA 字段值限定丹允,防止 SQL 注入郭厌,
禁止字符串拼接 SQL 訪問數(shù)據(jù)庫袋倔。
4. 【強(qiáng)制】用戶請求傳入的任何參數(shù)必須做有效性驗(yàn)證。
說明:忽略參數(shù)校驗(yàn)可能導(dǎo)致:
? ? page size 過大導(dǎo)致內(nèi)存溢出
? ? 惡意 order by 導(dǎo)致數(shù)據(jù)庫慢查詢
? ? 任意重定向
? ? SQL 注入
? ? 反序列化注入
? ? 正則輸入源串拒絕服務(wù) ReDoS
說明:Java 代碼用正則來驗(yàn)證客戶端的輸入沪曙,有些正則寫法驗(yàn)證普通用戶輸入沒有問題奕污,
但是如果攻擊人員使用的是特殊構(gòu)造的字符串來驗(yàn)證,有可能導(dǎo)致死循環(huán)的效果液走。
5. 【強(qiáng)制】禁止向 HTML 頁面輸出未經(jīng)安全過濾或未正確轉(zhuǎn)義的用戶數(shù)據(jù)碳默。
6. 【強(qiáng)制】表單、AJAX 提交必須執(zhí)行 CSRF 安全過濾缘眶。
說明:CSRF(Cross-site request forgery)跨站請求偽造是一類常見編程漏洞嘱根。對于存在
CSRF 漏洞的應(yīng)用/網(wǎng)站,攻擊者可以事先構(gòu)造好 URL巷懈,只要受害者用戶一訪問该抒,后臺便在用戶
不知情情況下對數(shù)據(jù)庫中用戶參數(shù)進(jìn)行相應(yīng)修改。
7. 【強(qiáng)制】在使用平臺資源顶燕,譬如短信凑保、郵件、電話涌攻、下單欧引、支付,必須實(shí)現(xiàn)正確的防重放限制恳谎,
如數(shù)量限制芝此、疲勞度控制、驗(yàn)證碼校驗(yàn)因痛,避免被濫刷婚苹、資損。
說明:如注冊時發(fā)送驗(yàn)證碼到手機(jī)鸵膏,如果沒有限制次數(shù)和頻率舌劳,那么可以利用此功能騷擾到其
它用戶捌议,并造成短信平臺資源浪費(fèi)。
8. 【推薦】發(fā)貼、評論肛走、發(fā)送即時消息等用戶生成內(nèi)容的場景必須實(shí)現(xiàn)防刷隧出、文本內(nèi)容違禁詞過
濾等風(fēng)控策略饵隙。