前段時間,有一個客戶給我們懸鏡工作人員打電話,大概意思是:我們公司打算開發一個網站,但是我們前期想諮詢一些關於網站開發安全相關的問題,網站開發需要注意哪些安全問題?網站開發從哪幾個方面來關注安全開發?
我們會分【上】、【下】來介紹下從安全工程師的角度上,來談談安全開發方面的事兒。
以下內容來自:先知安全技術論壇,已獲得先知技術論壇授權,如需轉載,請聯繫該論壇。
原文鏈接地址: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服務器進行系統漏洞掃描產品-雲鑑漏洞檢測平臺,只需在您的服務器中輸入一個執行命令,即可自動檢測系統漏洞,出具報告。操作簡單,使用方便,提前幫您發現系統中潛在的漏洞。
點擊“雲鑑”,立刻體驗。