安全開發應該注意哪些事?安全工程師說了6點【上】

前段時間,有一個客戶給我們懸鏡工作人員打電話,大概意思是:我們公司打算開發一個網站,但是我們前期想諮詢一些關於網站開發安全相關的問題,網站開發需要注意哪些安全問題?網站開發從哪幾個方面來關注安全開發?

我們會分【上】、【下】來介紹下從安全工程師的角度上,來談談安全開發方面的事兒。

以下內容來自:先知安全技術論壇,已獲得先知技術論壇授權,如需轉載,請聯繫該論壇。

原文鏈接地址:https://xianzhi.aliyun.com/forum/read/1752.html

很多技術研發不瞭解安全,也不重視安全,只有在自己的服務器被黑掉、被掛馬、被脫褲纔想起關注安全,但是這個時候,技術架構已經成型、代碼已經在線上穩定運行,再亡羊補牢,改代碼、改策略,往往成本巨大、而收效很低;所以,開發安全,從娃娃抓起……

一、什麼是信息安全?

信息安全是一個龐大的概念,包含大量不同方向的分支技術,但是都涉及幾個概念:

機密性(Confidentiality):即保證信息在產生、傳輸、存儲、使用等環節不會被泄漏、被惡意竊取。

在技術上典型的實現方式就是加密算法。加密算法主要分對稱加密和非對稱加密,對稱加密的加解密密鑰是一樣的,所以在密鑰在存儲、傳輸時會有一定泄漏的風險,但加解密效率會相對高一些。

非對稱加密的密鑰不同,各自不會互相影響,所以相對安全,但同樣的,效率會低一些。

因此,也隨之產生多種可變的方案,比如,使用對稱加密算法,密鑰通過非對稱加密算法進行加密,可以在效率和安全性上取得一定的平衡。加解密是一門很深的學科,也是信息安全領域一個方向。

完整性(Integrity):即保證信息在產生、傳輸、存儲、使用等環節是真實完整的,不會被惡意篡改。在技術上典型的應用有數字簽名、MD5、校驗和等。

其實在網絡協議誕生的初期就已經存在完整性校驗的概念,最典型的就是TCP/IP協議中各種報文的校驗和。

而現在互聯網產品,尤其是移動端APP產品很多也都採用簽名的策略,通過將接口傳參、時間戳等進行一次簽名,來防止業務數據在傳輸的過程中被篡改。

可用性(Availability):即保證信息在產生、傳輸、存儲、使用等環節不會被破壞損毀。在技術上典型的應用,安全方面當然就是防DDoS了,DDoS攻擊成本低,效果好,無論大小企業,現在儼然已成爲難題之一。DDoS又分很多種,防護起來十分複雜。

以上是信息安全的基本屬性,即CIA屬性。此外,後期還衍生出其他的屬性,如可控性、不可否認性等,總之都是對信息安全概念的補充。

而安全人員的工作,尤其是做企業安全建設的工作,就是圍繞保護數據安全的過程,在事前、事中、事後三個階段,技術上建立掃描、發現、監控、防禦、應急、加固等一系列措施,在管理上完善流程、制度、規範,從而使以上幾個安全屬性得到保障。

概念說了很多,落地到實際是什麼樣子呢,簡單總結了一個安全架構圖,比較全的涵蓋了企業安全建設的要點。

以上是宏觀層面,那具體到每個技術研發同學的身上,最常見的就是對各種安全漏洞、安全風險的處理修復。下面介紹開發過程中常見的安全風險點。

二、SQL注入

sql注入危害很大,也很常見,可以導致企業數據直接被泄漏出去。典型的sql注入漏洞是這樣產生的:

void doPost(HttpServletRequest request,

HttpServletResponse response){

JdbcConnection conn = new JdbcConnection();

final String sql = "select * from product where

pname like '%” + request.getParameter("name") +

"%'";

conn.execqueryResultSet(sql); }

在sql中直接拼接了字符串,導致用戶可以通過插入惡意代碼來控制sql執行。比如這樣:

select * from product where pname like '%name%';

如果name變量輸入 qudian';drop database;// 就變成了

select * from product where name like '%qudian';drop database;//%';

那麼怎麼防禦sql注入呢?最簡單正確的方式就是預編譯。 爲什麼用預編譯,首先要了解sql注入的原理:

sql注入產生在數據庫的編譯階段,拼接字符串時,sql和用戶可控的數據部分拼接到一起,一次發送到數據庫, 數據庫編譯時就會把sql指令和數據編譯到一起,如果用戶可控的數據部分有非法的命令,也會被數據庫編譯執行,這樣就產生了sql注入。

而預編譯的方式的簡單原理是:

sql和用戶可控的部分是分兩次發給數據庫的,第一次發sql指令,也就是上個例子的select * from product where pname like '%name%';,

數據庫收到後先進行編譯,第二次再發送數據qudian';drop database;//,此時數據庫不會重新編譯第一次收到的指令, 而是把指令和數據區分開,這樣不論用戶輸入的是什麼非法數據,數據庫都會認爲是數據部分,也就不會產生sql注入了。

上面的過程通過抓包可以看到。


預編譯的一般簡單寫法:

// 正常查詢

conn = createConnection();

String sql = "select name,password from manager

where name=? and password=?";

stat = conn.prepareStatement(sql);

stat.setString(1, name);

stat.setString(2, password);

stat.executeQuery(sql);

// 模糊查詢

conn = createConnection();

String sql = "select * from table where url

like ?";

stat = con.prepareStatement(sql);

String data="data";

stat.setString(1, "%"+data+"%");

stat.executeQuery(sql);

今天先分享到這裏,明天小編將繼續給大家分享:跨站腳本攻擊:XSS、跨站請求僞造CSRF、登錄註冊安全風險,以及在使用第三方系統時需要注意的一些安全因素。

目前懸鏡安全實驗室推廣一款針對Linux服務器進行系統漏洞掃描產品-雲鑑漏洞檢測平臺,只需在您的服務器中輸入一個執行命令,即可自動檢測系統漏洞,出具報告。操作簡單,使用方便,提前幫您發現系統中潛在的漏洞。


點擊“雲鑑”,立刻體驗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章