Java安全與質(zhì)量編碼規(guī)范_第1頁
Java安全與質(zhì)量編碼規(guī)范_第2頁
Java安全與質(zhì)量編碼規(guī)范_第3頁
Java安全與質(zhì)量編碼規(guī)范_第4頁
Java安全與質(zhì)量編碼規(guī)范_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1.引言

為提高Java應(yīng)用系統(tǒng)的整體質(zhì)量與安全水平,特制定本編碼規(guī)范,用于指

導(dǎo)本行開發(fā)團隊編寫更優(yōu)質(zhì)的代碼編碼,在軟件開發(fā)生命周期的早期為Java應(yīng)

用系統(tǒng)提供質(zhì)量和安全保障。

2.參考文獻(xiàn)

JAVA語言編碼規(guī)范《JavaCodingStyleGuide》

開放式Web應(yīng)用程序安全項目標(biāo)準(zhǔn)十大安全問題《OWASPTop10-2017》

3.術(shù)語

?“正例”

指正確的代碼編寫示例,可作為對應(yīng)漏洞的修復(fù)或規(guī)避的參考示例(不是唯

一的代碼安全編寫方式)。

?“反例”

指錯誤的代碼編寫方式,這些示例會產(chǎn)生對應(yīng)的質(zhì)量或安全問題,同時會被

代碼掃描檢測出來。

■“強制”

指必須按照對應(yīng)規(guī)范條目要求編碼,否則無法通過代碼審計。

?“推薦”

指推薦按照對應(yīng)的規(guī)范條目要求編碼,對不同類型的系統(tǒng)或者不同的場景有

著不同的要求,詳見具體規(guī)范條目內(nèi)容加粗說明。

?“建議”

指建議規(guī)范的代碼編寫要求,按照對應(yīng)要求編寫代碼可提高代碼的性能、健

壯性或安全性等等,但不做強制要求。

4.適用范圍

3.1適用代碼

本規(guī)范適用于本行所有采用Java語言開發(fā)的應(yīng)用系統(tǒng)擁有源代碼的部分。

本規(guī)范由開發(fā)中心修訂,依據(jù)應(yīng)用系統(tǒng)質(zhì)量與安全形勢、管理要求的變化適

時修訂和更新。

3.2系統(tǒng)分類及規(guī)范約束要求

序號系統(tǒng)分類特征規(guī)范約束

1外網(wǎng)系統(tǒng)用于外網(wǎng)用戶使用的Browser/Server架構(gòu)的系強制、推薦

統(tǒng),如網(wǎng)銀系統(tǒng)

2內(nèi)網(wǎng)系統(tǒng)用于內(nèi)網(wǎng)業(yè)務(wù)人員使用的系統(tǒng),如客服系統(tǒng)強制、推薦

(6.3.1除外)

3后臺系統(tǒng)沒有用戶界面,或者有用戶界面但僅供開發(fā)運維強制

人員作為數(shù)據(jù)維護(hù)的內(nèi)網(wǎng)系統(tǒng),如新核心系統(tǒng)

說明:“規(guī)范約束”是指對應(yīng)分類的系統(tǒng),強制要求遵守的規(guī)范類別

5.規(guī)范格式

5.1注釋規(guī)范

1、類、類屬性、類方法的注釋使用Javadoc規(guī)范,使用/**內(nèi)容*/格式,不

得使用〃XXX方式。

說明:在IDE編輯窗口中,Javadoc方式會提示相關(guān)注釋,生成Javadoc

可以正確輸出相應(yīng)注釋;在IDE中,工程調(diào)用方法時,不進(jìn)入方法即可懸浮提

示方法、參數(shù)、返回值的意義,提高閱讀效率。

2、抽象方法(包括接口中的方法)用Javadoc注釋,除了返回值、參數(shù)、

異常說明外,還必須指出該方法做什么事情,實現(xiàn)什么功能。

說明:對子類的實現(xiàn)要求,或者調(diào)用注意事項,清一并說明。

3、類應(yīng)添加創(chuàng)建者和創(chuàng)建日期;

4、方法內(nèi)部單行注釋在被注釋語句上方另起一行,使用〃注釋。方法內(nèi)部

多行注釋使用/**/注釋,注意與代碼對齊。

5、枚舉類型字段要有注釋,并說明每個數(shù)據(jù)項的用途。

6、注釋要具有較好的可讀性;

反例:“TCP連接超時〃解釋成〃傳輸控制協(xié)議連接超時〃,理解反而費腦筋。

7、代碼修改的同時,注釋也要進(jìn)行相應(yīng)的修改,尤其是參數(shù)、返回值、異

常、核心邏輯等的修改。

8、代碼應(yīng)當(dāng)有20%以上的注釋率,適當(dāng)?shù)淖⑨屄誓軌虼蟠筇岣叽a的可讀

性,便于維護(hù)。

5.2命名規(guī)范

1,類的命名應(yīng)遵守駝峰法則:所有組合單詞首字母大寫。

示例:publicclassTestClass{……}。

2、方法的命名應(yīng)遵守駝峰法則:方法首字母小寫,其余組合單詞首字母大

寫。

示例:publicStringgetllserName(){}

3、包名統(tǒng)一使用小寫,點分隔符之間有且僅有一個自然語義的英語單詞。

包名統(tǒng)一使用單數(shù)形式,但是類名如果有復(fù)數(shù)含義,類名可以使用復(fù)數(shù)形式。

示仞J:com.zzbank.ai.util

4、靜態(tài)常量的命名應(yīng):字母全部大寫,單詞間通過下劃線連接。

示例:publicstaticfinalStringSYSTEM_TYPE=〃abc”;

5、方法的命名應(yīng)遵守駝峰法則:方法首字母小寫,其余組合單詞首字母大

寫。

示彳列:StringuserName;

6.安全性

5.1認(rèn)證與授權(quán)

5.1.1密碼管理

禁止將密碼硬編碼在代碼中。應(yīng)以以下方式使用:

1、用戶密碼應(yīng)以密文方式存儲到數(shù)據(jù)庫中;

2、與外部通訊的接口密碼應(yīng)加密存儲到服務(wù)器的配置文件中。

反例

Stringpassword=〃123456〃;

5.1.2密碼具有足夠的強度

口令長度至少8位且應(yīng)由數(shù)字、字母(區(qū)分大小寫)和特殊字符組成。

說明:較短的口令與復(fù)雜度不充分的口令容易在較短時間(較低成本)下被

破解。需要在程序中對密碼字符串的長度和字符復(fù)雜度作檢查。

5.1.3密碼定期更新

應(yīng)定期提示用戶更換口令。

說明:更換時需注意提示用戶不能再次使用最近使用過的口令,同時可降低

系統(tǒng)被撞庫攻擊的成功率。

5.1.4密碼分級使用

安全等級不同的系統(tǒng)間,同一個體的賬戶不應(yīng)使用相同的口令。

說明:防止因安全等級低的系統(tǒng)導(dǎo)致口令泄露導(dǎo)致安全等級高的系統(tǒng)受到撞

庫攻擊。

5.1.5密碼加密建議

建議使用非對稱加密方式加密密碼,如果一定要使用MD5等單向哈希算法,

必須添加隨機的鹽值。

正例

publicvoidUse_of_a_One_Way_Hash_without_a_Salt_Fix(){

Stringtext=

Stringdtext=

MessageDigestmd=MessageDigest.getlnstancef'SHA");

md.update((""+newRandom)).nextDouble()).getBytes());

byte[]dbts=md.digest(text.getBytes());

dtext=newString(dbts);

)

反例

publicvoidUse_of_a_One_Way_Hash_without_a_Salt(){

Stringtext="H;

Stringdtext=

MessageDigestmd=MessageDigest.getlnstancef'SHA");

byte[]dbts=md.digest(text.getBytes());

dtext=newString(dbts);

)

5.2數(shù)據(jù)庫安全

5.1.6關(guān)鍵數(shù)據(jù)管理

1、數(shù)據(jù)庫連接字符串應(yīng)以密文方式存儲到服務(wù)器的配置文件中。

2、數(shù)據(jù)庫服務(wù)器地址、數(shù)據(jù)庫名、用戶名、密碼(強制)及其他關(guān)鍵參數(shù)

應(yīng)加密存儲。

反例

connection=DriverManager.getConnectionf

"jdbc:oracle:thin:@3:8001:orcl;"admin","admin");

5.1.7防止SQL注入

1、外來字符串不應(yīng)動態(tài)拼接到SQL語句中。

正例

Stringusername=request.getParameter("username");

Stringpassword=request.getParameter("password");

StringencryptedPass=Passwordlltil.encrypt(password);

Stringsql="selecttop1*fromuserswhere"

+"username=?andpassword=?";

PreparedStatements=c.prepareStatement(sql);

s.setString(l,username);

s.setString(2,encryptedPass);

ResultSetrs=s.executeQuery();

反例

Stringusername=request.getParameterf'username");

Stringpassword=request.getParameter("password");

StringencryptedPass=PasswordUtiLencrypt(password);

Stringsql="selecttop1*fromuserswhereusername=

+username+andpassword=

+encryptedPass+

Statements=c.createStatement();

ResultSetrs=s.executeQuery(sql);

2、ibatis和1\/^^次中$的實際作用為字符串拼接,而#的實際作用是變量替

換,因此,使用ibatis和Mybatis時動態(tài)參數(shù)應(yīng)使用#而不是$。

正例

<dynamicprepend="where">

<isParameterPresent>

<isNotEmptyprepend="and"property="onShelves">

p.onshelves=#onShelves#

</isNotEmpty>

</isParameterPresent>

</dynamic>

反例

<dynamicprepend="where">

<isParameterPresent>

<isNotEmptyprepend="and"property="onShelves">

p.onshelves=$onShelves$

</isNotEmpty>

</isParameterPresent>

</dynamic>

5.1.8數(shù)據(jù)庫數(shù)據(jù)分級存儲管理

分級分權(quán)限管理數(shù)據(jù)中存儲的數(shù)據(jù),同時在關(guān)鍵數(shù)據(jù)查詢、修改、刪除等操

作時,應(yīng)同時驗證身份和權(quán)限。

5.3敏感信息泄露

5.2.1不要在注釋中寫敏感信息

不要在代碼注釋中標(biāo)注如:用戶名、密碼、機器名或敏感文件位置等信息,

可使用JSP注釋代替HTML注釋。

反例

//Defaultusernamefordatabaseconnectionis"scott"

//Defaultpasswordfordatabaseconnectionis"tiger"

5.2.2不要直接明文顯示敏感信息

避免在頁面顯示隱私數(shù)據(jù),需要顯示時可根據(jù)實際業(yè)務(wù)場景,在服務(wù)端對可

做隱藏處理的隱私數(shù)據(jù)隱藏后再顯示。如,將密碼處理為******。

5.2.3不要明文輸出敏感信息

隱私數(shù)據(jù)原則上不應(yīng)明文導(dǎo)出到系統(tǒng)外部文件中,系統(tǒng)間交互的文件接口若

包含隱私數(shù)據(jù),應(yīng)不寫入或加密后再寫入防范隱私泄露。

5.2.4防止異常泄露信息

1、JSP頁面應(yīng)指定錯誤處理頁面。

正例

<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"

errorPage="error.html"%>

注意:需確保錯誤頁在任何情況下都不會發(fā)生異常。

2、Servlet層應(yīng)捕獲所有異常。

正例

publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,lOException{

try(

//……

}catch(Exceptione){

response.sendRedirect("error.html?"+SecureRandom.nextDoubleO);

)

3、應(yīng)用程序應(yīng)配置為所有頁面異常配置跳轉(zhuǎn)錯誤頁。

4、不應(yīng)在程序中直接拋出異常的詳細(xì)信息,其中可能會包含系統(tǒng)相關(guān)的重

要信息。

說明:不應(yīng)直接使用語言自有的異常處理類進(jìn)行異常處理,應(yīng)使用應(yīng)用程序

自定義的異常類進(jìn)行異常處理,不應(yīng)在程序中直接拋出過于詳細(xì)的異常信息。

語言自有的異常處理類的命名往往可以明確指出與該異常相關(guān)的技術(shù)和接

口,這些信息都是完全公開的。當(dāng)應(yīng)用程序?qū)⑦@樣的異常名稱暴露后就會暴露程

序結(jié)構(gòu)甚至異常源所包含的數(shù)據(jù)。

5.2.5防止日志泄露信息

日志內(nèi)容應(yīng)分類處理,密碼等敏感信息不要明文寫入日志。

正例

Stringpassword=getPasswordf);

dbmsLog.println(id+":"+":"+type+":"+tstamp);

反例

Stringpassword=getPasswordf);

dbmsLog.println(id+":"+password+":"+type+":"+tstamp);

5.2.6不推薦用于加密的算法

不推薦使用DES、MD5、SHA1處理敏感信息,如密碼、秘鑰等。

5.4輸入驗證

5.2.7輸入驗證要求

不要完全依賴客戶端的驗證,任何客戶端的驗證機制(數(shù)據(jù)校驗、身份認(rèn)證

等)都可以被繞過,應(yīng)當(dāng)在服務(wù)端再次驗證;

5.2.8防止代碼注入

1、外部輸入不應(yīng)參與類的動態(tài)加載,如果必須這樣做時,應(yīng)對外部輸入做

白名單驗證。

正例

Map<String,Class<??whiteClassList=DynamicUtil.getClassListf);

StringclassName=request.getParameterl^typeName^);

Objectobj=null;

if(whiteClassList.containsKey(className)){

obj=whiteClassList.get(className).newlnstance();

}

反例

StringclassName=request.getParameter(//typeName/,);

Objectobj=Class.forName(className).newlnstance();

2、外部輸入不應(yīng)參與方法的動態(tài)執(zhí)行,如果必須這樣做時,應(yīng)對外部輸入

做白名單驗證。

正例

Map<String,Method>whiteMethodList=DynamicUtil.getMethodList();

StringclassName=request.getParameter("typeName〃);

StringmethodName=request.getParameter(//method/,);

methodName=className++methodName;

Methodmethod=null;

if(whiteMethodList.containsKey(methodName)){

method=whiteMethodList.get(methodName);

)

反例

StringclassName=request.getParameter("typeName〃);

StringmethodName=request.getParameter(z/method/,);

Methodmethod=Class.forName(className).getMethod(methodName,null);

說明:動態(tài)執(zhí)行相當(dāng)于直接編程,當(dāng)非預(yù)期的字符串進(jìn)入動態(tài)執(zhí)行接口時,

可能導(dǎo)致事先存在的木馬程序(由運行環(huán)境問題、第三方庫來源不當(dāng)?shù)葘?dǎo)致被植

入惡意代碼,這些代碼通常情況下不會被使用)被激活,從而導(dǎo)致程序被攻擊者

操控造成極大損失。

因此,對有動態(tài)執(zhí)行需求的程序應(yīng)嚴(yán)格限制其執(zhí)行范圍,可使用沙箱、自定

義ClassLoader>自定義動態(tài)資源集合(Key-Value集合)或代理池的方式來控制

執(zhí)行范圍以規(guī)避該漏洞的產(chǎn)生,以防止非預(yù)期的程序被執(zhí)行C

5.2.9防止命令注入

1、外來數(shù)據(jù)作為Command命令的程序名時應(yīng)作嚴(yán)格的可執(zhí)行范圍控制。

即:外來數(shù)據(jù)僅作為執(zhí)行命令的文件名(不包含路徑及參數(shù));程序指定固

定的文件夾作為執(zhí)行命令程序的路徑并自動補充到Command命令字符串中。

正例

StringexeName=request.getParameter("cmd〃);

StringexeDir=ConfigUtiLgetExedirf);

exeName=CommandUtil.forName(exeDir);〃去除路徑分隔符、危險字符、空格和

引號

Runtime.getRuntime().exec(exedir+exeName);

2、外來數(shù)據(jù)作為Command命令的參數(shù)時應(yīng)作嚴(yán)格的字符處理。

即:參數(shù)為字符串的應(yīng)去除字符串中的引號并在構(gòu)造Command命令字符串

時將其放入一對雙引號之間;參數(shù)值不為字符串的應(yīng)使用對應(yīng)的類型進(jìn)行轉(zhuǎn)換校

驗或格式校驗;最終的Command命令應(yīng)該在程序中重構(gòu),不要讓外來數(shù)據(jù)控制

命令的結(jié)構(gòu)。

正例

Stringarg=request.getParameter(z/argNamew);

arg=CommandUtil.forArg(arg);〃字符串類參數(shù)應(yīng)去除引號

Runtime.getRuntime().exec(exedir+exeName+"+arg+

說明:默認(rèn)情況下,命令行環(huán)境中允許執(zhí)行一些比較危險的命令(如,關(guān)機、

創(chuàng)建賬戶、開放端口、刪改文件等)。當(dāng)程序執(zhí)行構(gòu)造命令行命令包含外來數(shù)據(jù)

時,外來數(shù)據(jù)可以通過分號等特殊字符改變命令結(jié)構(gòu),額外執(zhí)行其他命令。

因此,當(dāng)外來數(shù)據(jù)參與命令行命令字符串時,應(yīng)作字符過濾或執(zhí)行權(quán)限控制。

需要特別注意的危險字符如下:

A、重定向操作符

例如:<,?,>(不含全角逗號)

這些運算符是把結(jié)果輸出到服務(wù)器的其他地方,〈是從文件中而不是從鍵盤

中讀入命令輸入,可能被用來繞過過濾。>是把結(jié)果重定向到文件中,而不是寫

在命令提示符窗口中?!卑呀Y(jié)果追加到別的文本當(dāng)中,而不改變原來的內(nèi)容。

B、管道符

例如:I

管道符可以把一個命令的輸出重定向到下一個命令的輸入,如:catfilel|

grep"string"

C>inline命令

例如:;,,,$(不含全角逗號)

用來結(jié)束之前的命令,直接執(zhí)行新的命令。

D、邏輯運算符

例如:$,&&,||(不含全角逗號)

這些運算符用來對數(shù)據(jù)進(jìn)行邏輯上的運算。

5.2.10防止LDAP注入

外部輸入不應(yīng)參與LDAP語句結(jié)構(gòu)的組成,參與LDAP語句拼接時應(yīng)過濾危

險字符。

正例

LdapContextcontext=LdapUtil.getDefaultContext();

//……

Stringusr=request.getParameterf'usr");

Stringpwd=request.getParameter("pwd");

usr=LdapUtiLforValue(usr);〃去除危險字符

pwd=LdapUtil.torValue(pwd);〃去除危險字符

StringsearchFilter="(&(USER="+usr+")(PASSWORD="+pwd+

context.search(searchBase,searchFilter,searchcontrols);

反例

LdapContextcontext=LdapUtil.getDefaultContext();

//……

Stringusr=request.getParameterf'usr");

Stringpwd=request.getParameter("pwd");

StringsearchFilter="(&(USER-"+usr+")(PASSWORD=U+pwd+

context.search(searchBasezsearchFilter;searchcontrols);

說明:LDAP(LightweightDirectoryAccessProtocol)輕量級目錄訪問協(xié)議,是一

種在線目錄訪問協(xié)議,主要用于目錄中資源的搜索和查詢,是X.500的一種簡便

的實現(xiàn)。

LDAP注入是在LDAP語句包含外來字符串的情況下借助LDAP定義的格式字

符及運算字符篡改原有語意構(gòu)成注入以達(dá)到權(quán)限提升和盜取信息的目的。

外來數(shù)據(jù)必須被轉(zhuǎn)義的危險字符如下:

顯示結(jié)果描述轉(zhuǎn)義或替換

(左括號\28

)右括號\29

\反斜杠\5c

*星號\2a

/正斜杠\2f

NULL空\00

5.2.11防止XPath注入

XPath中的外來數(shù)據(jù)應(yīng)去除特殊字符。

正例

StringloginlD-request.getParameter(wloginNamew);

Stringpassword=request.getParameter("loginPass〃);

loginlD=XPathUtil.forText(loginlD);〃去除特殊字符(正則:/A"*A;&<>()/)

password=XPathUtil.forText(password);〃去除特殊字符(正則:/A"*A;&<>()/)

StringxpathExp=7/users/user[loginlD/text()="+loginlD

+"andpassword/text()="+password

+"]/firstname/text()";

XPathFactoryfactory=XPathFactory.newlnstance();

XPathxpath=factory.newXPathf);

XPathExpressionexpr=pile(xpathExp);

反例

StringloginlD=request.getParameter(zzloginName/,);

Stringpassword=request.getParameter(/zloginPassw);

〃若loginlD和password實際輸入為or1=1or=

〃則表達(dá)式將始終為true且打印所有用戶的firstname

StringxpathExp='7/users/user[loginlD/text()="+loginlD

+"andpassword/text()="+password

+"]/firstname/text()";

XPathFactoryfactory=XPathFactory.newlnstance();

XPathxpath=factory.newXPath();

XPathExpressionexpr=pile(xpathExp);

說明:XPath(XmlPathLanguage)為解析XML數(shù)據(jù)的查詢語言(類似SQL語言)。

當(dāng)外來字符串直接拼接到XPath查詢字符串中時,可能導(dǎo)致原有查詢語句的語意

被篡改,造成無效的驗證、數(shù)據(jù)泄露、數(shù)據(jù)丟失等后果。

需注意的字符集的正則表達(dá)式為/仙*勺&<>()/

5.2.12防止資源注入

1,Socket通訊端口不應(yīng)使用外來數(shù)據(jù)。

正例

intport=ConfigUtiLgetlnteger(/zsocket.root.portw);

ServerSocketsrvr=newServerSocket(port);

反例

intport=lnteger.parselnt(request.getParameter(z/portw));

ServerSocketsrvr=newServerSocket(port);

2、獲取服務(wù)器文件資源時不應(yīng)使用外來數(shù)據(jù)作為資源路徑,應(yīng)使用白名單

或資源路徑池的方式限制可動態(tài)獲取的范圍。

正例

Stringpath=request.getParameterf'path");

Inputstreamins=null;

if(ResourceUtil.access(path))(//不在白名單或資源池范圍內(nèi)時返回false

ServletContextcontext=session.getServletContext();

Ins=context.getResourceAsStream(path);

)

反例

Stringpath=request.getParameterf'path");

ServletContextcontext=session.getServletContext();

Inputstreamins=context.getResourceAsStream(path);

說明:當(dāng)程序定義的資源類型或位置來源與于外來數(shù)據(jù)(如文件路徑或端口

號)時,則會在這個外來數(shù)據(jù)的控制下執(zhí)行或訪問非預(yù)期的資源,從而導(dǎo)致邏輯

問題或數(shù)據(jù)泄露問題。如在文件系統(tǒng)環(huán)境中,外來數(shù)據(jù)中包含.,/,\(小數(shù)點,

斜杠,反斜杠)這些特殊字符時就會導(dǎo)致路徑遍歷問題。而若Socket的端口由

外來數(shù)據(jù)控制時則直接導(dǎo)致通訊端口被篡改。

5.2.13防止路徑遍歷

1、外來數(shù)據(jù)不應(yīng)作為文件訪問的絕對路徑。

2、外來數(shù)據(jù)作為文件訪問的相對路徑時,應(yīng)去除“%00”及、0'。

說明:或的出現(xiàn)會提高目錄層級,當(dāng)提高到根目錄時,相當(dāng)于

外來數(shù)據(jù)直接作為絕對路徑;

“%00”或i\0,的出現(xiàn)(即,null字符)會中斷文件名,導(dǎo)致操作系統(tǒng)丟

棄該字符之后的字符串,從而使代碼中根據(jù)文件名判斷文件類型的邏輯失效。

3、上傳文件應(yīng)對其類型進(jìn)行驗證,且外來數(shù)據(jù)作為文件名時,應(yīng)去除

“%00”及"\0\

說明:構(gòu)成文件路徑的字符串包含外來數(shù)據(jù)時,若外來數(shù)據(jù)包含特殊字符,

則會造成文件路徑被篡改到其他位置或非授權(quán)類型文件被上傳或下載??赡茉斐?/p>

系統(tǒng)文件被損壞、篡改、竊取。

外來數(shù)據(jù)可以通過字符串中的“可造成目錄次序的改變從而改變目錄結(jié)

構(gòu),或被直接用作絕對路徑時就可以訪問任意文件和目錄,包括應(yīng)用程序文件、

配置文件及操作系統(tǒng)關(guān)鍵文件。當(dāng)沒有在操作系統(tǒng)中對應(yīng)用的執(zhí)行賬戶權(quán)限及關(guān)

鍵目錄權(quán)限作控制時,就會造成義件篡改、信息泄露等問題。路徑遍歷(Path

Traversal)也叫"dot-dot-slash〃、/'directorytraversal"、/"directoryclimbing”或

“backtracking”。

5.2.14防止參數(shù)篡改

盡量避免使用頁面隱藏域及頁面緩存保存關(guān)鍵數(shù)據(jù)。

1、避免濫用頁面隱藏域:頁面隱藏域中的數(shù)據(jù)在被提交到服務(wù)端時需重新

驗證。

說明:如下拉選擇框等方式傳入的數(shù)據(jù)可做白名單驗證,重要參數(shù)如價格等

不要使用隱藏表單字段的方式從客戶端獲取。

2、頁面不需要的數(shù)據(jù)不應(yīng)傳遞到頁面請求響應(yīng)中。

說明:特別需要避免直接將所有數(shù)據(jù)封裝到j(luò)son并傳遞到前端。

參數(shù)篡改攻擊是基于網(wǎng)絡(luò)數(shù)據(jù)交換的客戶端和服務(wù)器之間以修改應(yīng)用程序

數(shù)據(jù)的操作參數(shù),如用戶認(rèn)證和權(quán)限,產(chǎn)品的價格和數(shù)量,等。通常,這些信息

存儲在cookies,隱藏的表單字段,或URL查詢字符串,并用于提高應(yīng)用程序的

功能和控制。

5.5輸出驗證

5.2.15防止跨站腳本

1、${}表達(dá)式的默認(rèn)實現(xiàn)不能防止XSS攻擊,因此在使用時應(yīng)對其默認(rèn)實現(xiàn)

進(jìn)行修改,使其具有XSS轉(zhuǎn)義功能。

注意,修改此默認(rèn)實現(xiàn)會導(dǎo)致需要輸出HTML時無法正常輸出,故需與jstl、

struts等標(biāo)簽配合使用。

正例

<c:outvalue="${outerStringKey}"/>

2、<%=%>在使用時應(yīng)使用XSS過濾函數(shù)對輸出字符串作XSS轉(zhuǎn)義處理。

正例

<%=XSSFilter.forText(outerStringValue)%>

3、明確不需要輸出HTML時應(yīng)保持struts的property標(biāo)簽的escape屬性為

true。

說明:escape屬性默認(rèn)為true即不論是什么格式的數(shù)據(jù)都作為HTML普通

顯示文本輸出,當(dāng)設(shè)置為false時則會識別HTML字符。

4、Servlet中自行構(gòu)造頁面輸出時,應(yīng)對參與HTML文本構(gòu)造的外部輸入字

符串作對應(yīng)的處理。

正例

StringBufferhtml-newStringBuffer();

//……

html.append(XSSFilter.forText(userlnputString_Text));

//……

html.append(XSSFilter.forHTML(userlnputString_HTML));

//……

response.getWriter().print(html.toString());

5.2.16防止HTTP響應(yīng)折斷

在操作HTTP報頭(即Head部分)時,所有寫入該區(qū)域的外部數(shù)據(jù)必須去

除V和\n字符。

正例

publicvoidsplittingFix(HttpServletRequestrequest,HttpServletResponseresponse){

Stringtext=request.getParameterf'text");

text=text.replace("\n",

text=text.replace("\r",

response.setHeader("text",text);

}

反例

publicvoidsplittingRes(HttpServletRequestrequest,HttpServletResponseresponse){

Stringtext=request.getParameter("text");

response.setHeaderC'texf',text);

}

5.2.17避免開放式跳轉(zhuǎn)

外部獲取的字符串作為URL或URL的一部分時應(yīng)對最終的URL進(jìn)行安全校

驗。

當(dāng)外來數(shù)據(jù)被用作跳轉(zhuǎn)地址時,可能會發(fā)生網(wǎng)絡(luò)釣魚甚至注入類攻擊。

可編寫名為checkUrl或testUrl函數(shù)對最終url進(jìn)行安全校驗。

說明:校驗規(guī)則按程序設(shè)計自行制定,校驗策略需以白名單為主。

正例

Stringurl=checkUrl(request.getParameter(/,url,/));

response.sendRedirect(url);

反例

Stringurl=request.getParameter(^urK);

response.sendRedirect(url);

5.6配置問題

5.2.18Proxy設(shè)置建議

對每個需要轉(zhuǎn)發(fā)的請求分別設(shè)置代理,而不是將所有http\https請求都轉(zhuǎn)發(fā)

到代理服務(wù)器上;

正例

publicstaticvoidmain(String[]args){

try{

URLurl=newURL("http://www.baidu.com");

InetSocketAddressaddr=newInetSocketAddress("54",8080);

Proxyproxy=newProxy(Proxy.Type.HTTP,addr);

URLConnectionconn=url.openConnection(proxy);

Inputstreamin=conn.getlnputstream();

Strings=lOUtils.toString(in);

System.out.println(s);

}catch(Exceptione){

e?printStackTrace();

}

}

反例

publicstaticvoidmain(String[]args){

Propertiesprop=System.getProperties();

prop?setProperty("xyHost">"192.168.0.254");

prop.setProperty("http.proxyPort"8080");

prop.setProperty("http.nonProxyHosts","localhost|192,168.0.*");

prop?setProperty("xyHost","54");

prop.setProperty("xyPort","443");

prop.setProperty("xyHost","54");

prop.setProperty("xyPort","2121");

prop.setProperty("ftp.nonProxyHosts","localhost|192,168.0.?");

prop.setProperty("socksProxyHosf^"54");

prop.setPropertyCsocksProxyPort">"8000");

}

5.2.19不要設(shè)置setAccessible為true

不要使用setAccessible為true,它讓程序員能夠允許反映對象繞過Java

accesscontrol,并反過來更改私有字段或調(diào)用私有方法、行為;

5.2.20spring的defaultHtmlEscape設(shè)置

使用spring,要設(shè)置defaultHtmlEscape屬性為true;

說明:默認(rèn)defaultHtmlEscape是設(shè)置為false的,此時接收到的外部數(shù)據(jù)可

能不會轉(zhuǎn)義,潛在地將應(yīng)用暴露給跨站腳本攻擊,設(shè)置為true會降低此風(fēng)險。

5.2.21Cookie安全配置

使用Cookie應(yīng)全面評估并最大限度降低可能存在的安全風(fēng)險。建議按如下

要求使用:

1、使用Cookie時應(yīng)啟用Cookie的安全特性。

說明:可通過設(shè)置Secure屬性為true來啟用Cookie的安全特性。

2^使用Cookie時應(yīng)指定合適的生命周期。

說明:可通過Expire屬性設(shè)置Cookie的生命周期,當(dāng)該值為。則關(guān)閉頁面

時Cookie就會被自動清除。

3、使用Cookie時應(yīng)設(shè)置httpOnlyCookies/httpOnly屬性為true。

說明:可在web.xml中設(shè)置該屬性,當(dāng)該屬性為true時客戶端腳本(如

JavaScript)將無法讀取Cookie。

正例

<session-config>

<cookie-config>

<http-only>true</http-only>

</cookie-config>

</session-config>

注:該配置可以在應(yīng)用服務(wù)器進(jìn)行全局配置,具體方法請查詢各應(yīng)用服務(wù)器

官網(wǎng)。

4、關(guān)鍵程序邏輯不應(yīng)過分依賴于Cookie提供的數(shù)據(jù)。

說明:如金額、數(shù)量、賬號、密碼、憑據(jù)等安全數(shù)據(jù)和敏感數(shù)據(jù)不應(yīng)以Cookie

為唯一來源。

5、使用Cookie時應(yīng)對Cookie進(jìn)行加密。

說明:Cookie是由服務(wù)器端生成,發(fā)送給User-Agent(一般是瀏覽器),瀏

覽器會將Cookie的key/value保存到某個目錄卜的文本文件內(nèi),卜次請求同一網(wǎng)

站時就發(fā)送該Cookie給服務(wù)器(前提是瀏覽器設(shè)置為啟用cookie)。Cookie名稱

和值可以由服務(wù)器端開發(fā)自己定義,對于JSP而言也可以直接寫入jsessionid,這

樣服務(wù)器可以知道該用戶是否是合法用戶以及是否需要重新登錄等,服務(wù)器可以

設(shè)置或讀取Cookies中包含信息,借此維護(hù)用戶跟服務(wù)器會話中的狀態(tài)。

由于Cookie存儲于客戶端用戶本地,因此其安全性無法得到有效保障,一

旦被篡改,所有依賴于Cookie的程序都會受到影響,這些影響可能會形成任何

注入類安全漏洞。

5.7日志問題

5.2.22日志分級分類

日志內(nèi)容應(yīng)在已劃分嚴(yán)重等級后再進(jìn)行類別劃分,并且,不同類別的日志應(yīng)

分別輸出存儲到不同的位置。

5.2.23明確區(qū)分安全和業(yè)務(wù)類日志

安全類日志和業(yè)務(wù)類日志中應(yīng)盡量避免出現(xiàn)程序元素。

說明:此二類日志若結(jié)合明確的程序或代碼元素(類名、方法名等),一旦

泄露則會極大提升系統(tǒng)被二次攻擊的可能性。攻擊者可結(jié)合第一次攻擊反饋和業(yè)

務(wù)接口對應(yīng)的程序元素制定更明確的技術(shù)攻擊手段來提高攻擊成功率。

5.2.24明確區(qū)分安全和性能類日志

安全類日志和性能類日志中應(yīng)盡量避免出現(xiàn)具體的業(yè)務(wù)數(shù)據(jù)。

說明:此二類日志一般會涉及第三方產(chǎn)品,即日志會在一定范圍內(nèi)擴散。

5.2.25防止日志偽造

寫入日志中的用戶輸入,應(yīng)進(jìn)行特殊字符過濾處理。

正例

if(loginSuccessful){

logger.severe("Userloginsucceededfor:"+replaceLog(username));

}else{

logger.severe("Userloginfailedfor:"+replaceLog(username));

)

〃過濾特殊字符

publicstaticStringreplaceLog(Stringstr){

Stringdest=

if(str!=null){

Patternp=Ppile("\\s*|\t|\r|\n");

Matcherm=p.matcher(str);

dest=m.replaceAII("");

)

returndest;

)

反例

if(loginSuccessful){

logger.severef'Userloginsucceededfor:"+username);

}else{

logger.severe("Userloginfailedfor:"+username);

)

5.2.26Logger對象應(yīng)聲明為staticfinal

類中定義的Logger對象盡量聲明為staticfinalo

說明:隨著所在類實例的創(chuàng)建被多次實例化,內(nèi)存中存在多個當(dāng)前類的日志

實例可能會導(dǎo)致當(dāng)前類實例在處理不同業(yè)務(wù)過程中輸出的日志發(fā)生混亂,不便于

日志審查工作。

5.8會話管理

5.3.1sessionid的構(gòu)造應(yīng)由程序來生成

sessionid的構(gòu)造應(yīng)由程序自身來構(gòu)造生成,不要采用外部數(shù)據(jù)構(gòu)造。

5.3.2session銷毀過期建議

1、登錄系統(tǒng)驗證成功后重置session;

2、退出系統(tǒng)后銷毀session;

3、session應(yīng)根據(jù)場景設(shè)置合理的過期時間;

正例

〃用戶身份驗證成功后應(yīng)重構(gòu)會話。

Useruser=UserUtil.getUser(request);〃根據(jù)request傳參構(gòu)造user對象

if(LoginUtil.access(user)){〃當(dāng)?shù)卿涷炞C成功時返Fltrue

session.invalidated;

//……再完善新的session

5.3.3防范跨站請求偽造

CSRF(Cross-siterequestforgery)跨站請求偽造是一類常見編程漏洞。對于存在

CSRF漏洞的應(yīng)用/網(wǎng)站,攻擊者可以事先構(gòu)造好URL,只要受害者用戶訪問,后

臺便在用戶不知情的情況下充數(shù)據(jù)庫中用戶參數(shù)進(jìn)行相應(yīng)修改。

業(yè)界普遍使用的三種有效防護(hù)方案供選擇。

1)驗證HTTPReferer字段

說明:通過獲取HTTP中的Referer屬性判斷請求來源,非同源請求則判斷為

非法請求。

優(yōu)點:Referer屬性無法被篡改;實施成本較低,只需在服務(wù)端程序部署。

缺點:由于Referer屬性記錄了請求的來源,即用戶的網(wǎng)絡(luò)位置。一旦該值

被泄露則可能導(dǎo)致隱私數(shù)據(jù)泄露(如組織內(nèi)網(wǎng)信息等)。

適用場景:存量項目修復(fù)。

示例:

Stringreferer=request.getHeader("Referer");

〃判斷Referer是否以bank.example開頭

iff(referer!=null)&&(referer.trim().startsWith(z/bank.examplez,))){

chain.doFilterfrequest,response);

}else{

request.getRequestDispatcherf^error.jsp/O-forwardlrequestresponse);

2)在請求地址中添加token并驗證

優(yōu)點:相對檢查Referer方式更加安全;不涉及隱私問題。

缺點:無法保證自身的安全,可通過Referer被竊?。粚嵤┏杀据^高,需雙

端配置。

適用場景:新項目開發(fā),存量項目修復(fù)。

3)在HTTP頭中自定義屬性并驗證

說明:類似token方式,不同點是該自定義屬性存儲于TTTP頭的自定義屬

性。

優(yōu)點:由于自定義,被作為攻擊目標(biāo)的概率較低。

缺點:實施成本極高,改動范圍較大。

適用場景:新項目開發(fā)。

5.3.4防范跨站歷史偽造

重定向的目標(biāo)地址必須追加充分的隨機值后綴。

正例

response.sendRedirectf'error.html?"+SecureRandom.nextDouble());

反例

response.sendRedirectf'error.html?");

說明:SOP(Same-originpolicy)是現(xiàn)代瀏覽器的最重要的安全概念。SOP是指

通過設(shè)計不能從不同來源的網(wǎng)頁互相交流?;赟OP規(guī)定,一個絕對URI來源包

含三個要素:協(xié)議、主機、端口,當(dāng)兩個絕對URI的這三個要素的任意一項不相

同時即表示這兩個URI非同源。瀏覽器的history對象正是按這個規(guī)則來判斷來

源。history對象是在一個瀏覽器選項卡中已訪問頁面的記錄,用戶可以通過瀏覽

器的"前進(jìn)〃和"后退〃按鈕通過history進(jìn)行跳轉(zhuǎn)。頁面包含的iframe內(nèi)發(fā)生的任何

地址變化也會被記錄到history中,但如果發(fā)生了重定向(Redirect),history只

會記錄重定向后指向的最終頁面,而相同的頁面只會在history中記錄一次。由

于SOP的限制,history中記錄的地址無法被外部獲取,但history.length屬性可

以被外部獲取。

歷史操控即跨站歷史操控(CrossSiteHistoryManipulation(XSHM)),正是由

history.length屬性的開放性造成的,從而可能導(dǎo)致SOP的妥協(xié),造成雙向CSRF

及其他風(fēng)險,如:侵犯用戶隱私,登錄狀態(tài)檢測、資源映射、敏感信息推測、活

動跟蹤和URL參數(shù)泄露。

7.框架及組件

5.9Struts使用

5.3.5生產(chǎn)環(huán)境關(guān)閉struts的devMode調(diào)試模式

Struts2.1.0-2.5.1版本,將devMode設(shè)置為true,會導(dǎo)致任意命令執(zhí)行的漏

洞。

反例

<constantname=wstruts.devModez,value=,,true,7>

5.3.6Struts2操作名稱禁止使用通配符(*)

使用*的話,允許將操作名稱作為OGNL表達(dá)式進(jìn)行評估,這允許攻擊者修

改會話等系統(tǒng)變量或者在服務(wù)器上執(zhí)行任意命令。

建議使用struts2.3.143以上版本,此版本修復(fù)了該問題

反例

<actionname="*"class=,,com.acme.actions.example,,>

<result>/example/{l}.jsp<result>

<action>

5.10其他組件及接口

5.3.7程序?qū)崿F(xiàn)不應(yīng)使用JNI

JNI,JavaNativeInterface,是nativecode的編程接口。JNI使Java代碼程

序可以與nativecode交互。如,在Java程序中調(diào)用nativecode;在nativecode

中嵌入Java虛擬機調(diào)用Java的代碼。

使用JNI可以利用nativecode的平臺相關(guān)性,在平臺相關(guān)的編程中更具優(yōu)勢;

可提高nativecode的復(fù)用率;nativecode可直接操作底層,提高程序執(zhí)行效率。

但川I的使用也會帶來以下問題:

一、從Java環(huán)境到nativecode的上下文切換效率較低;

二、由于nativecode自身問題,容易導(dǎo)致JVM崩潰;

三、nativecode中不恰當(dāng)?shù)膬?nèi)存使用容易導(dǎo)致內(nèi)存泄露。

在Java內(nèi)存定義中,nativecode的內(nèi)存操作在nativeheap中進(jìn)行,但native

heap依賴于nativecode進(jìn)行內(nèi)存釋放,java的gc機制并不會釋放nativeheap。

這樣就容易導(dǎo)致內(nèi)存泄露甚至JVM崩潰。

5.3.8避免定義和調(diào)用native成員

代碼應(yīng)盡量避免定義和調(diào)用native成員。

5.3.9避免使用己被棄用的接口

說明:即Java中聲明為@Deprecated的Interface>Class、Method>Fieldo

這些接口被調(diào)用時一般在IDE中會有明顯的提示,如在Eclipse中會被追加刪除

線。這些接口在被棄用的同時都會發(fā)布替代接口或替代實現(xiàn)方案。

當(dāng)接口(InterfaceClass、MethodField)存在性能問題或安全問題時,將

會在API文檔明確聲明已棄用或在代碼中聲明為@Deprecated。應(yīng)用程序使用這

樣的接口將會把這些接口本身存在的問題轉(zhuǎn)嫁到應(yīng)用程序中,從而影響程序的性

能及安全性。而且,某些接口可能會在較新的版本中被刪除,一旦升級這些組件

將導(dǎo)致程序不可用,嚴(yán)重影響程序更新、擴展。

5.3.10避免使用自定義Thread

Web應(yīng)用盡量避免使用使用自定義Thread,如果一定要用,不要在循環(huán)中

使用,盡量使用線程池。

說明:在Web應(yīng)用中,不正確的Thread使用可能會導(dǎo)致異步處理、異步響

應(yīng)等違背一致性的問題,容易造成數(shù)據(jù)混亂和邏輯混亂。

5.3.11WEB應(yīng)用避免使用System.exit

Web應(yīng)用盡量避免使用System.exit函數(shù)。

說明:System.exit會直接終止JVM,這會導(dǎo)致未提交的事務(wù)丟失、正在進(jìn)行

的事務(wù)中斷、緩存數(shù)據(jù)丟失等重大數(shù)據(jù)問題。因此,不推薦Web應(yīng)用和Server

端程序等一些比較復(fù)雜的程序使用該函數(shù)來終止程序。

5.3.12避免使用Socket

盡量避免使用自定義Socket通信。

說明:直接使用Socket就意味著要自己定義通信協(xié)議,自定義的通信協(xié)議

容易存在致命的設(shè)計缺陷,而且由于自定義其不能被普遍使月,會影響程序的通

用性,降低外部交互能力。

5.3.13避免使用finalize

盡量避免在代碼中調(diào)用finalize函數(shù)。

說明:finalize是專供gc機制調(diào)用的函數(shù),開發(fā)人員不應(yīng)自行調(diào)用該函數(shù),

以免誤解造成程序異常。

5.3.14避免使用系統(tǒng)輸出流

盡量避免在代碼中使用System.out、System.err流。

系統(tǒng)輸出流主要在測試的時候使用,在生產(chǎn)環(huán)境上,如果輸出的信息沒有價

值,那么應(yīng)當(dāng)注釋或者刪除,如果有價值,則應(yīng)改寫為日志記錄。

正例

publicclassMyClass

publicstaticvoidmain(String[]args){

Logger.logf'helloworld");

)

}

反例

publicclassMyClass

publicstaticvoidmain(String[]args){

System.out.println("helloworld");

)

}

8.編碼錯誤

5.3比較與賦值

5.3.15不要誤用二和二=

1、應(yīng)當(dāng)使用==進(jìn)行比較的時候,不要誤用為二;

2、應(yīng)當(dāng)使用;進(jìn)行賦值的時候,不要誤用為==;

正例

if(a==l){

b=0;

)

反例

if(a=l){〃錯誤1

b==0;〃錯誤2

)

5.3.16字符串比較應(yīng)使用equals

字符串比較應(yīng)當(dāng)使用equals。方法,而不能直接使用==;

正例

Stringstrl="hello";

Stringstr2=newString("hello");

if(strl.equals(str2))

)

反例

Stringstrl="hello";

Stringstr2=newString("hello");

if(strl==str2)〃永遠(yuǎn)是false

(

……〃死代碼

)

說明:用工或上來比較兩個字符串是否相等,其實質(zhì)比較的是兩個對象,

而不是字符串的值,在有些場景下結(jié)果永遠(yuǎn)是false的,可能導(dǎo)致邏輯錯誤。

5.3.17浮點型數(shù)據(jù)不要直接進(jìn)行相等性比較

float和double型數(shù)據(jù)不要直接進(jìn)行相等性比較,應(yīng)設(shè)置合理的誤差值,比

較其差值的絕對值,在誤差范圍內(nèi)即認(rèn)為相等;

正例

publicstaticfinaldoubleMAX=0.2;

publicStringtest(doubledl,doubled2){

doubled3=dl+d2;//

if(abs(d3-MAX)<=le-6){

return"OK";

)

)

反例

publicstaticfinaldoubleMAX=0.2;

publicstringtestfdoubledl,doubled2){

doubled3=dl+d2;//

if(d3<=MAX){

return"OK";

}

}

當(dāng)dl=d2=0.1時,d3=0.20000000149011612是>0.2的,程序員以為d3<=MAX是

成立的,進(jìn)行了錯誤的處理邏輯。

5.3.18字符串與“”比較

字符串判空與〃〃做比較時,應(yīng)對"〃調(diào)用equals。方法。

正例

Stringstr;

lf(/z/,.equals(str)){

)

反例

Stringstr;

lf(str.equals(/z//)){

)

5.4邏輯錯誤問題

5.4.1避免被0除

變量作為除數(shù)時,應(yīng)保證其值不會為0;

正例

publicintTEST(inttotal,intnum)throwsArithmeticException

(

if(numRequests!=0){

returntotal/num;

}else{

Logger.log("被0除!”);

throwArithmeticException;

}

)

反例

publicintTEST(inttotal,intnum)

{

returntotal/num;

}

5.4.2避免表達(dá)式恒為false

if和while語句的判斷條件,需要保證其值是根據(jù)業(yè)務(wù)場景動態(tài)變化的,而

不恒定為false,否則語句將永遠(yuǎn)不會被執(zhí)行;

正例

boolflag=false;

〃根據(jù)場景,為flag賦予新值。

If(flag)

(

....〃死代碼

)

else

(

〃永遠(yuǎn)只執(zhí)行這段代碼

)

反例

lf(flag=false)

{

....〃死代碼

)

else

{

〃永遠(yuǎn)只執(zhí)行這段代碼

)

5.4.3保證switch語句完整

1>每個switch語句都應(yīng)包含default塊,case語句為完全考慮的情況進(jìn)行處

理,否則可能由于未處理的情況導(dǎo)致程序異常,尤其是判斷變量來源于外部時;

2^每個case,都應(yīng)以break結(jié)束;

正例

switch(num)

{

case1:

str="a";

break;

case2:

str="b";

break;

default:

str=”請輸入正確的值/

break;

)

反例

switch(num)

(

case1:

str="a";〃缺失了treak

case2:

str="b";〃缺失了break

〃缺失了default

}

5.4.4不要在finally語句中return

finally語句中,不要寫return語句,否則可能導(dǎo)致異常未處理,甚至是邏輯

出錯;

反例

publicstaticinttestFinallyfinti)throwsException

(

try{

if(i<0){

thrownewD

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論