您好,登錄后才能下訂單哦!
代碼優(yōu)化
代碼結(jié)構(gòu)層次的優(yōu)化(目的:更加方便代碼的維護(hù)--可維護(hù)性,可讀性)
1.代碼注釋(代碼規(guī)范)
2.工具類(lèi)的封裝(方便代碼的維護(hù),使代碼結(jié)構(gòu)更加清晰不臃腫,保證團(tuán)隊(duì)里代碼 質(zhì)量一致性)
3.公共部分的提取
代碼性能的優(yōu)化(目的:使程序的性能最優(yōu)化)
1.使用一些性能比較高的類(lèi)(bufferInputStream)
2.緩沖區(qū)塊的大小(4k或者8k)
3.公共部分的提取
4.通常要用stringbuffer替代string加號(hào)拼接
業(yè)務(wù)優(yōu)化
我們做項(xiàng)目的時(shí)候業(yè)務(wù)優(yōu)化這方面最主要是從用戶(hù)體驗(yàn)度角度進(jìn)行考慮,減少用戶(hù)操 作的步驟提高工作效率,通常有以下幾種:
1.可以通過(guò)tabindex屬性來(lái)改變tab鍵盤(pán)的操作順序
2.可以通過(guò)回車(chē)鍵來(lái)進(jìn)行搜索或者提交操作
3.對(duì)于單選按鈕和復(fù)選按鈕可以通過(guò)操作后面的文本來(lái)選擇前面的單選按鈕以及復(fù)選 按鈕
4.添加的信息要按照id倒序進(jìn)行排列
5.進(jìn)行搜索操作時(shí)加入js loading操作(不僅告訴用戶(hù)所進(jìn)行的請(qǐng)求正在被處理,而 且防止用戶(hù)多次點(diǎn)擊提交操作)
6.當(dāng)進(jìn)行刪除操作的時(shí)候要彈出提示框,警告用戶(hù)要進(jìn)行刪除操作,是否確認(rèn)。
7.根據(jù)returnURL在用戶(hù)登錄成功后直接跳到想要訪(fǎng)問(wèn)的資源。
8.進(jìn)行刪除操作時(shí)通過(guò)confirm提示用戶(hù)是否確認(rèn)刪除操作,操作完后提示操作是否 成功。
9.減少用戶(hù)操作的步驟
10.使用autocomplete插件快速進(jìn)行搜索
必背,必做:
1.可以通過(guò)回車(chē)鍵來(lái)進(jìn)行搜索或者提交操作
2.添加的信息要按照id倒序進(jìn)行排列
3.進(jìn)行搜索操作時(shí)加入js loading操作(不僅告訴用戶(hù)所進(jìn)行的請(qǐng)求正在被處理,而且防止用戶(hù)多次點(diǎn)擊提交操作)
4.當(dāng)進(jìn)行刪除操作的時(shí)候要彈出提示框,警告用戶(hù)要進(jìn)行刪除操作,是否確認(rèn),如果刪除成功則彈出提示框告訴用戶(hù)。
5.減少用戶(hù)操作的步驟
6.通過(guò)ztree,以及kindeiditor來(lái)提高用戶(hù)的體驗(yàn)度
sql優(yōu)化
1、SELECT子句中避免使用 *, 盡量應(yīng)該根據(jù)業(yè)務(wù)需求按字段進(jìn)行查詢(xún)
2、盡量多使用COMMIT如對(duì)大數(shù)據(jù)量的分段批量提交釋放了資源,減輕了服務(wù)器壓力
3、在寫(xiě)sql語(yǔ)句的話(huà),盡量保持每次查詢(xún)的sql語(yǔ)句字段用大寫(xiě),因?yàn)閛racle總是先解析 sql語(yǔ)句,把小寫(xiě)的字母轉(zhuǎn)換成大寫(xiě)的再執(zhí)行
4、用UNION-ALL 替換UNION,因?yàn)閁NION-ALL不會(huì)過(guò)濾重復(fù)數(shù)據(jù),所執(zhí)行效率 要快于UNION,并且UNION可以自動(dòng)排序,而UNION-ALL不會(huì)
5、避免在索引列上使用計(jì)算和函數(shù),這樣索引就不能使用
Sql優(yōu)化精簡(jiǎn)版:
1.(重點(diǎn))(必須說(shuō)) SELECT語(yǔ)句中避免使用 *,盡量應(yīng)該根據(jù)業(yè)務(wù)需求按字段進(jìn)行查詢(xún)
舉例:如果表中有個(gè)字段用的是clob或者是blob這種大數(shù)據(jù)字段的話(huà),他們的查詢(xún)應(yīng)該根據(jù)業(yè)務(wù)需要來(lái)進(jìn)行指定字段的查詢(xún),切記勿直接用*
2.(重點(diǎn)) 刪除重復(fù)記錄(oracle):
最高效的刪除重復(fù)記錄方法(因?yàn)槭褂昧薘OWID)例子:
DELETE FROM EMP E WHERE E.ROWID >
(SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
3.用>=替換>
如一個(gè)表有100萬(wàn)記錄,一個(gè)數(shù)值型字段A,
A=0時(shí),有30萬(wàn)條;
A=1時(shí),有30萬(wàn)條;
A=2時(shí),有39萬(wàn)條;
A=3時(shí),有1萬(wàn)記錄。
那么執(zhí)行A>2與 A>=3 的效果就有很大的區(qū)別了,因?yàn)?A>2 時(shí),ORACLE會(huì)先找出為2的記錄索引再進(jìn)行比較,而A>=3時(shí)ORACLE則直接找到=3的記錄索引。
4.(重點(diǎn))盡量多使用COMMIT如對(duì)大數(shù)據(jù)量的分段批量提交
5. (重點(diǎn))用NOT EXISTS 或(外連接+判斷為空)方案 替換 NOT IN操作符此操作是強(qiáng)列推薦不使用的,因?yàn)樗荒軕?yīng)用表的索引。推薦方案:用NOT EXISTS或(外連接+判斷為空)方案代替
6.(重點(diǎn) 必須說(shuō))LIKE操作符(大數(shù)據(jù)的全文檢索使用luncene)(solr)因?yàn)槭褂胠ike不當(dāng),會(huì)導(dǎo)致性能問(wèn)題,原因是like在左右兩邊都有%的時(shí)候,不會(huì)使用索引。
如LIKE '%5400%'這種查詢(xún)不會(huì)引用索引,而LIKE 'X5400%'則會(huì)引用范圍索引。
一個(gè)實(shí)際例子:
查詢(xún)營(yíng)業(yè)編號(hào)YY_BH LIKE '%5400%'這個(gè)條件會(huì)產(chǎn)生全表掃描,如果改成YY_BH LIKE 'X5400%' OR YY_BH LIKE 'B5400%'則會(huì)利用YY_BH的索引進(jìn)行兩個(gè)范圍的查詢(xún),性能肯定大大提高。
7.(重點(diǎn),必須說(shuō))避免在索引列上使用計(jì)算和函數(shù),這樣索引就不能使用
舉例:
低效:
SELECT… FROM DEPT WHERE SAL * 12 > 25000;
高效:
SELECT… FROM DEPT WHERE SAL > 25000/12;
8.(重點(diǎn) 必須說(shuō))用UNION-ALL 替換UNION,
因?yàn)閁NION-ALL不會(huì)過(guò)濾重復(fù)數(shù)據(jù)而且不會(huì)自動(dòng)排序,所執(zhí)行效率要快于UNION。
9.(優(yōu)化,重點(diǎn),3個(gè)方面 a.緩存 b.分段批量 c.存儲(chǔ)過(guò)程)減少訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的次數(shù)
舉例:如果批量刪除多條數(shù)據(jù),可以用 delete from tableName where id
in (1,2,3)
而不要用多條delete語(yǔ)句進(jìn)行刪除
10.(重點(diǎn) 必須說(shuō))用TRUNCATE替代DELETE
TRUNCATE不記錄日志,DELETE記錄日志,所以TRUNCATE要快于DELETE但是一旦用TRUNCATE進(jìn)行刪除就不能進(jìn)行恢復(fù),TRUNCATE是刪除整張表的數(shù)據(jù)不能加where條件。
==================================================================
mysql,sqlserver中如果
id為自增類(lèi)型,那么如果用TRUNCATE刪除,則id字段再插入數(shù)據(jù)時(shí)從1開(kāi)始,如果delete刪除的話(huà),則從刪除之前的id的值繼續(xù)增長(zhǎng)。
防sql注入
針對(duì)防sql注入,我們通常是這樣做的:
首先在前臺(tái)頁(yè)面對(duì)用戶(hù)輸入信息進(jìn)行js驗(yàn)證,對(duì)一些特殊字符進(jìn)行屏蔽,比如:or ,單引號(hào),--,= ,還有就是限制用戶(hù)名輸入的長(zhǎng)度,我們一般將其限制在6---13位。另外,對(duì)于用戶(hù)的敏感信息我們進(jìn)行Md5加密,還有,為了增加用戶(hù)體驗(yàn)度和用戶(hù)友好度,為了不使用戶(hù)看到一些詳細(xì)的異常信息我們會(huì)進(jìn)行錯(cuò)誤信息頁(yè)面的定制,像404,500錯(cuò)誤。另一個(gè)我層面講,這樣做也是為了保護(hù)我們的一些重要信息。此外,我們會(huì)給特定的人分配定定的權(quán)限,而不是給其分配管理員權(quán)限!
sql注入
所謂SQL注入,就是通過(guò)一些含有特殊字符的sql語(yǔ)句發(fā)送到服務(wù)器欺騙服務(wù)器并進(jìn)行攻擊。(特殊字符:or, 單引號(hào),--,空格)
Sql注入的 防護(hù)
1.永遠(yuǎn)不要信任用戶(hù)的輸入。對(duì)用戶(hù)的輸入進(jìn)行校驗(yàn),可以通過(guò)正則表達(dá)式(js正則或者java后臺(tái)正則),或限制長(zhǎng)度;對(duì)單引號(hào)和雙"-"進(jìn)行轉(zhuǎn)換等。
2.永遠(yuǎn)不要使用動(dòng)態(tài)拼裝sql,使用參數(shù)化的sql。(永遠(yuǎn)不要使用+號(hào)拼接sql字符串,而是使用?傳參的方式進(jìn)行)
3.不要給用戶(hù)太高的權(quán)限而根據(jù)需求進(jìn)行賦權(quán)
4.對(duì)敏感信息進(jìn)行加密 如md5(單向加密不可逆轉(zhuǎn))。
5.自定義錯(cuò)誤頁(yè)面。目的是為了不把我們的程序的bug暴露在別有用心的人的面前。而去不會(huì)讓用戶(hù)看到報(bào)錯(cuò)的頁(yè)面,也提高了用戶(hù)的體驗(yàn)度。
SQL注入防范
使用參數(shù)化的過(guò)濾性語(yǔ)句 要防御SQL注入,用戶(hù)的輸入就絕對(duì)不能直接被嵌入到SQL語(yǔ)句中。恰恰相反,用戶(hù)的輸入必須進(jìn)行過(guò)濾,或者使用參數(shù)化的語(yǔ)句。參數(shù)化的語(yǔ)句使用參數(shù)而不是將用戶(hù)輸入嵌入到語(yǔ)句中。在多數(shù)情況中,SQL語(yǔ)句就得以修正。然后,用戶(hù)輸入就被限于一個(gè)參數(shù)。
輸入驗(yàn)證
檢查用戶(hù)輸入的合法性,確信輸入的內(nèi)容只包含合法的數(shù)據(jù)。數(shù)據(jù)檢查應(yīng)當(dāng)在客戶(hù)端和服務(wù)器端(java代碼)都執(zhí)行之所以要執(zhí)行服務(wù)器端驗(yàn)證,是為了彌補(bǔ)客戶(hù)端驗(yàn)證機(jī)制脆弱的安全性。 在客戶(hù)端,攻擊者完全有可能獲得網(wǎng)頁(yè)的源代碼,修改驗(yàn)證合法性的腳本(或者直接刪除腳本),然后將非法內(nèi)容通過(guò)修改后的表單提交給服務(wù)器。因此,要保證驗(yàn)證操作確實(shí)已經(jīng)執(zhí)行,唯一的辦法就是在服務(wù)器端也執(zhí)行驗(yàn)證。你可以使用許多內(nèi)建的驗(yàn)證對(duì)象,例如Regular Expression Validator,它們能夠自動(dòng)生成驗(yàn)證用的客戶(hù)端腳本,當(dāng)然你也可以插入服務(wù)器端的方法調(diào)用。如果找不到現(xiàn)成的驗(yàn)證對(duì)象,你可以通過(guò)Custom Validator自己創(chuàng)建一個(gè)。
錯(cuò)誤消息處理
防范SQL注入,還要避免出現(xiàn)一些詳細(xì)的錯(cuò)誤消息,因?yàn)楹诳蛡兛梢岳眠@些消息。要使用一種標(biāo)準(zhǔn)的輸入確認(rèn)機(jī)制來(lái)驗(yàn)證所有的輸入數(shù)據(jù)的長(zhǎng)度、類(lèi)型、語(yǔ)句、企業(yè)規(guī)則等。
加密處理
將用戶(hù)登錄名稱(chēng)、密碼等數(shù)據(jù)加密保存。加密用戶(hù)輸入的數(shù)據(jù),然后再將它與數(shù)據(jù)庫(kù)中保存的數(shù)據(jù)比較,這相當(dāng)于對(duì)用戶(hù)輸入的數(shù)據(jù)進(jìn)行了“消毒”處理,用戶(hù)輸入的數(shù)據(jù)不再對(duì)數(shù)據(jù)庫(kù)有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。
存儲(chǔ)過(guò)程來(lái)執(zhí)行所有的查詢(xún)
SQL參數(shù)的傳遞方式將防止攻擊者利用單引號(hào)和連字符實(shí)施攻擊。此外,它還使得數(shù)據(jù)庫(kù)權(quán)限可以限制到只允許特定的存儲(chǔ)過(guò)程執(zhí)行,所有的用戶(hù)輸入必須遵從被調(diào)用的存儲(chǔ)過(guò)程的安全上下文,這樣就很難再發(fā)生注入式攻擊了。
使用專(zhuān)業(yè)的漏洞掃描工具
攻擊者們目前正在自動(dòng)搜索攻擊目標(biāo)并實(shí)施攻擊,其技術(shù)甚至可以輕易地被應(yīng)用于其它的Web架構(gòu)中的漏洞。企業(yè)應(yīng)當(dāng)投資于一些專(zhuān)業(yè)的漏洞掃描工具,如大名鼎鼎的Acunetix的Web漏洞掃描程序等。一個(gè)完善的漏洞掃描程序不同于網(wǎng)絡(luò)掃描程序,它專(zhuān)門(mén)查找網(wǎng)站上的SQL注入式漏洞。最新的漏洞掃描程序可以查找最新發(fā)現(xiàn)的漏洞。
確保數(shù)據(jù)庫(kù)安全
鎖定你的數(shù)據(jù)庫(kù)的安全,只給訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的web應(yīng)用功能所需的最低的權(quán)限,撤銷(xiāo)不必要的公共許可,使用強(qiáng)大的加密技術(shù)來(lái)保護(hù)敏感數(shù)據(jù)并維護(hù)審查跟蹤。如果web應(yīng)用不需要訪(fǎng)問(wèn)某些表,那么確認(rèn)它沒(méi)有訪(fǎng)問(wèn)這些表的權(quán)限。如果web應(yīng)用只需要只讀的權(quán)限,那么就禁止它對(duì)此表的 drop 、insert、update、delete 的權(quán)限,并確保數(shù)據(jù)庫(kù)打了最新補(bǔ)丁。
安全審評(píng)
在部署應(yīng)用系統(tǒng)前,始終要做安全審評(píng)。建立一個(gè)正式的安全過(guò)程,并且每次做更新時(shí),要對(duì)所有的編碼做審評(píng)。開(kāi)發(fā)隊(duì)伍在正式上線(xiàn)前會(huì)做很詳細(xì)的安全審評(píng),然后在幾周或幾個(gè)月之后他們做一些很小的更新時(shí),他們會(huì)跳過(guò)安全審評(píng)這關(guān),“就是一個(gè)小小的更新,我們以后再做編碼審評(píng)好了”。請(qǐng)始終堅(jiān)持做安全審評(píng)。
數(shù)據(jù)庫(kù)中常用術(shù)語(yǔ):
ddl:數(shù)據(jù)定義語(yǔ)言 Create Drop Alter
dml:數(shù)據(jù)操縱語(yǔ)言 insert update delete select
dcl:數(shù)據(jù)控制語(yǔ)言 grant revoke
tcl:事務(wù)控制語(yǔ)言 commit rollback
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。