☆軟件研發(fā)安全規(guī)范

1 安全編碼原則

  1. 保持簡單,程序只實現(xiàn)指定的功能于游。
  2. 堅持最小權(quán)限毁葱,把可能造成的危害降到最低。
  3. 默認不信任贰剥,采用白名單機制倾剿,只放行已知的操作。
  4. 永遠不要相信用戶的輸入蚌成,對所有輸入進行前臺和后臺兩次檢查前痘。

2 常見WEB潛在問題

輸入驗證:嵌入到查詢字符串、表單字段担忧、cookie 和 HTTP 頭中的惡意字符串的攻擊芹缔。這些攻擊包括命令執(zhí)行、跨站點腳本(XSS)瓶盛、SQL 注入和緩沖區(qū)溢出攻擊函筋。
身份驗證:標識欺騙、密碼破解净响、特權(quán)提升和未經(jīng)授權(quán)的訪問酵镜。
授權(quán)驗證:訪問保密數(shù)據(jù)或受限數(shù)據(jù)、篡改數(shù)據(jù)以及執(zhí)行未經(jīng)授權(quán)的操作够挂。
配置管理:對管理界面進行未經(jīng)授權(quán)的訪問、具有更新配置數(shù)據(jù)的能力以及對用戶帳戶和帳戶配置文件進行未經(jīng)授權(quán)的訪問。
敏感數(shù)據(jù):泄露保密信息以及篡改數(shù)據(jù)禽额。
會話管理:捕捉會話標識符,從而導(dǎo)致會話劫持及標識欺騙皮官。
加密管理:訪問保密數(shù)據(jù)或帳戶憑據(jù)脯倒,或二者均能訪問。
參數(shù)操作:路徑遍歷攻擊捺氢、命令執(zhí)行以及繞過訪問控制機制藻丢,從而導(dǎo)致信息泄漏、特權(quán)提升和拒絕服務(wù)摄乒。
異常管理:拒絕服務(wù)和敏感的系統(tǒng)級詳細信息的泄漏悠反。
審核和記錄:不能發(fā)現(xiàn)入侵跡象、不能驗證用戶操作馍佑,以及在診斷時出現(xiàn)困難斋否。

3 基本開發(fā)安全規(guī)范

3.1 跨站點腳本(XSS)防范

XSS的類型:反射型XSS、存儲型XSS拭荤、DOM型XSS茵臭。

跨站點腳本防范的基本原則:

  1. 一切的輸入/輸出都是有害的,不要信任任何輸入/輸出數(shù)據(jù)舅世。
  2. 所有傳遞過程都不能保障無侵入旦委,執(zhí)行前、存儲前雏亚、顯示前都要進行“數(shù)據(jù)清洗”缨硝。
  3. 所有的數(shù)據(jù)校驗、處理工作要在前端和服務(wù)器端兩次進行评凝。
  4. 目前所有的XSS通過com.keegoo.core.util.XSSUtil來過濾追葡。

DOM-based XSS的防范當操作頁面中DOM對象的時候,要對其輸入的參數(shù)進行處理奕短,防止XSS的注入宜肉。可采用escape翎碑、encodeURI谬返、encodeURIComponent或自定義方法進行處理。示例:

Window.location=encodeURI(”http://www.dhgate.com”);

對輸入/輸出進行Encode 將輸入/輸出進行轉(zhuǎn)義成HTML實體編碼(ISO 8859-1 Latin1)或其他編碼日杈,使得其在瀏覽器中不可自動執(zhí)行遣铝。

不要在html元素和屬性中使用未經(jīng)轉(zhuǎn)義的不安全內(nèi)容佑刷。如下面的示例:

<script>...NEVER PUT UNTRUSTED DATA HERE...</script>   
directly in a script 
<!--...NEVER PUT UNTRUSTED DATA HERE...-->             
inside an HTML comment 
<div ...NEVER PUT UNTRUSTED DATA HERE...=test />
in an attribute name 
<NEVER PUT UNTRUSTED DATA HERE... href="/test" />
in a tag name
<div attr=...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...>content</div>
inside UNquoted attribute 
<div attr='...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...'>content</div>
inside single quoted attribute
<div attr="...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...">content</div>
inside double quoted attribute

3.2 防SQL注入規(guī)范

  1. 防SQL注入基本原則:所有用戶輸入都必須進行合法性校驗。所有數(shù)據(jù)庫SQL操作必須參數(shù)化酿炸。
  2. 回收開發(fā)人員等操作生產(chǎn)庫權(quán)限:減少開發(fā)人員瘫絮、非DBA操作生產(chǎn)庫的權(quán)限;數(shù)據(jù)庫數(shù)據(jù)查詢要有權(quán)限分級和審核填硕。
  3. 盡量使用PreparedStatement代替Statement麦萤,一方面,在大多數(shù)情況下扁眯,使用PreparedStatement的性能將優(yōu)于使用Statement壮莹,另外一方面,可以最大限度的減少SQL注入發(fā)生的可能行姻檀。
  4. 用戶提交的數(shù)據(jù)都應(yīng)該做合法性校驗命满,避免用戶輸入‘,““绣版,-胶台,%,#,&,|僵娃,@概作,+等有可能導(dǎo)致SQL注入的危險字符給系統(tǒng)造成危害腋妙。

3.3 頁面組件安全防范

  1. 頁面標簽必須關(guān)閉默怨,屬性值必須加引號。在頁面中使用的標簽不關(guān)閉骤素,屬性值不加引號往往成為被攻擊點匙睹,攻擊者很容易的利用這些漏洞進行注入。避免這些漏洞的出現(xiàn)可以提高被攻擊的可能济竹。

  2. Form提交方式必須選用POST痕檬。Form默認的提交方式是Get,這種方式將表單中數(shù)據(jù)的按照variable=value的形式送浊,使用“?”添加至Action所指向的URL后面梦谜,各個變量之間使用“&”連接。所要傳遞的信息量除受URL長度限制之外袭景,信息內(nèi)容都顯示暴露唁桩。

    在使用Form的時候必須將提交方式置為POST。示例:

    <form action="…" method="post" target="_blank">…</form>
    
  3. 所有的非ASCII字符在URL中傳遞時都需要按照協(xié)商好的編碼方式做URL編碼耸棒。推薦使用encodeURI荒澡、encodeURIComponent或者自定義encode實現(xiàn)。encodeURI与殃、encodeURIComponent默認都返回UTF8編碼的URL单山,區(qū)別在于encodeURI方法不會對下列字符進行編碼: ":"碍现、"/"、";" 和 "?"米奸。而encodeURIComponent則會對這些字符進行編碼處理昼接。

  4. 盡量使用對象的innerText,不要使用innerHtml屬性悴晰。對象的innerText屬性默認會對輸入的數(shù)據(jù)進行encode辩棒,使得如果數(shù)據(jù)的數(shù)據(jù)還有html可執(zhí)行標記時不會直接執(zhí)行,而如果使用innerHtml屬性的話不會保障膨疏。

    <SPAN id=”Addr”></SPAN>
    <Script>
        // Using innerText renders the content safe.Addr.innerText=”…”;
        //Using innerHtml requires the use of HtmlEncode to make it 
        safe.Addr.innerHtml=””;
    </Script>
    
  5. 輸入框設(shè)置最大長度一睁、輸入數(shù)據(jù)類型限制。輸入框一般是攻擊者比較鐘意的攻擊對象佃却,攻擊者可以通過輸入框限制不足的弱點進行數(shù)據(jù)竊取(比如SQL注入)者吁、或者制造迫害(如比XSS)。我們可以通過對輸入框最大長度饲帅、輸入數(shù)據(jù)類型的限制复凳,從一定程度上防范這樣的攻擊。我們可以根據(jù)實際需求灶泵,對一些輸入框限定只允許輸入字母育八、數(shù)字等。同時對輸入的數(shù)據(jù)長度做限制赦邻。

  6. 關(guān)閉客戶端自動完成功能髓棋,減少駐留在客戶端數(shù)據(jù)

    <FORM … AUTOCOMPLETE=”O(jiān)FF”/>
    <INPUT … AUTOCOMPLETE=”O(jiān)FF”/>
    
  7. 設(shè)置<Frame>/<iFrame>受限惶洲,防止腳本執(zhí)行按声。將<Frame>/<iFrame>中security屬性設(shè)置為restricted后, Frame中的腳本將不能執(zhí)行(僅限于IE)恬吕。

3.4 敏感數(shù)據(jù)的安全防范

  1. 不能任意在Cookie签则、Session、ServletContext中存放數(shù)據(jù)铐料,對于這些對象中存放的數(shù)據(jù)渐裂,必須有統(tǒng)一定義、說明钠惩、Lifecycle的管理等柒凉。

  2. 對于敏感信息都必須保障其私密性。在頁面顯示妻柒、操作交互中不可避免的會有一些如用戶的標識信息扛拨、密碼、帳號信息举塔、涉及的金額信息等敏感數(shù)據(jù)(保密性的數(shù)據(jù))的存在绑警。為保障這些數(shù)據(jù)不被曝露而提高安全性求泰,我們要做到所有敏感信息必須進行加密處理,不能以明文的形式存在于任何網(wǎng)絡(luò)计盒、內(nèi)存及其它持久化介質(zhì)中(如:數(shù)據(jù)庫渴频、文件磁盤系統(tǒng)等)。

  3. 所有的密碼北启、key卜朗、帳號等機密信息都不能在URL中傳遞。

  4. 所有的密碼咕村、key场钉、銀行賬號等機密信息都不能存儲到Cookie,Session懈涛、ServletContext中逛万。

  5. 防止信息泄漏:

    1. 在系統(tǒng)上線使用的log level對應(yīng)的日志輸出中不允許包含任何密碼、key批钠、賬號等機密信息宇植。
    2. SVN集成分支上的代碼中不允許存留可用的system.out/err.print語句。
    3. 在測試/調(diào)試階段所使用的測試頁面埋心、單元測試模塊等不允許提交到SVN集成分支上指郁。
    4. 不允許將系統(tǒng)產(chǎn)生的錯誤異常信息直接顯示給用戶,需要有統(tǒng)一的錯誤處理拷呆。
  6. 盡量減少不必要的信息傳遞闲坎。在信息的傳遞過程中,如果當前Step中的對象洋腮、對象的屬性箫柳、參數(shù)等在下一個Step中不需要,則不要再做傳遞啥供,甚至可以顯式的銷毀。這樣可以有效的減少信息被截獲的機率库糠,特別是敏感數(shù)據(jù)(例如用戶密碼伙狐、賬戶信息等等)。

3.5 WEB安全防范

  1. Cookie的安全防范:

    1. 存儲于cookie中的敏感數(shù)據(jù)必須加密瞬欧。
    2. 沒有特殊要求下贷屎,盡量使用會話cookie(非持久化)。
    3. 如果使用持久化cookie應(yīng)該設(shè)置cookie超時艘虎。
    4. 激活cookie安全傳輸唉侄,表示創(chuàng)建的 cookie 只能在https連接中被瀏覽器傳遞到服務(wù)器端進行會話驗證,如果是http連接則不會傳遞該信息野建。
    Cookie[] cookies = request.getCookies();
    for(Cookie cookie : cookies) {
        if (…) {
            // 設(shè)置cookie不持久化到客戶端磁盤上
            cookie.setMaxAge(-1);
            // 設(shè)置cookie超時, 120秒
            cookie.setMaxAge(120);
            // 激活cookie安全傳輸
            cookie.setSecure(true);
            response.addCookie(cookie);
        }
    }
    
  2. 必須設(shè)置session的超時時間属划。web.xml中配置示例:

    …
    <session-config>
        <session-timeout>10</session-timeout>
    </session-config>
    …
    
  3. 必須構(gòu)建統(tǒng)一的錯誤處理頁面恬叹。web.xml示例:

    <error-page>
        <error-code>500</error-code>
        <location>/error.jsp</location>
    </error-page>
    
  4. 多線程中線程安全的防范:

    1. 盡量少用靜態(tài)(static)變量和static方法。(除了靜態(tài)常量:static final constants)同眯。
    2. 盡量多線程框架(java.util.concurrent)構(gòu)建多線程同步機制绽昼。
    3. 使用ThreadLocal避免多個線程之間類成員的共享沖突。
    4. 如非必要须蜗,不要使用synchronized關(guān)鍵字硅确。必須要使用synchronized時,應(yīng)將同步范圍最小化明肮,即將同步作用到最需要的地方菱农,避免大塊的同步塊或方法等。
  5. 增加Referer的檢查柿估,防止非法訪問大莫。Referer是HTTP Header中的一個字段,當瀏覽器想服務(wù)器發(fā)送請求時官份,Referer用來通知服務(wù)器請求發(fā)起的位置只厘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市舅巷,隨后出現(xiàn)的幾起案子羔味,更是在濱河造成了極大的恐慌,老刑警劉巖钠右,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赋元,死亡現(xiàn)場離奇詭異,居然都是意外死亡飒房,警方通過查閱死者的電腦和手機搁凸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狠毯,“玉大人护糖,你說我怎么就攤上這事〗浪桑” “怎么了嫡良?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長献酗。 經(jīng)常有香客問我寝受,道長,這世上最難降的妖魔是什么罕偎? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任很澄,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甩苛。我一直安慰自己蹂楣,他們只是感情好,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布浪藻。 她就那樣靜靜地躺著捐迫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爱葵。 梳的紋絲不亂的頭發(fā)上施戴,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音萌丈,去河邊找鬼赞哗。 笑死,一個胖子當著我的面吹牛辆雾,可吹牛的內(nèi)容都是我干的肪笋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼度迂,長吁一口氣:“原來是場噩夢啊……” “哼藤乙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惭墓,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤坛梁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腊凶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體划咐,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年钧萍,在試婚紗的時候發(fā)現(xiàn)自己被綠了褐缠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡风瘦,死狀恐怖队魏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弛秋,我是刑警寧澤器躏,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站蟹略,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏遏佣。R本人自食惡果不足惜挖炬,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望状婶。 院中可真熱鬧意敛,春花似錦馅巷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撩独,卻和暖如春敞曹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背综膀。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工澳迫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剧劝。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓橄登,卻偏偏與公主長得像,于是被迫代替她去往敵國和親讥此。 傳聞我的和親對象是個殘疾皇子拢锹,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容