■鐵生
電子商務網站互聯網安全防御攻略
■鐵生

在電子商務網站,互聯網的安全防御相當重要,尤其是牽扯到支付這一塊的。本文總結了一些比較通用的web安全防御常識,供大家參考一下。
https使用對稱加密還是非對稱加密?
對稱加密使用DES還是AES?
非對稱加密使用RSA還是DSA?
使用什么加密算法,對于java web來講是由keytool工具在生成秘鑰庫的時候指定,生成秘鑰庫之后,再將購買的證書進行導入。一般使用RSA加密算法。
SSL證書需要不需要購買?
不需要購買的理由-我們使用HTTPS的目的就是希望服務器與客戶端之間傳輸內容是加密的,防止中間監聽泄漏信息,去證書服務商那里申請證書不劃算,因為使用服務的都是固定客戶和自己內部人士,所以我們自己給自己頒發證書,忽略掉瀏覽器的不信任警報即可;
需要購買的理由-用戶體驗好、專業性強。
雙向驗證還是單向驗證?
單向驗證驗證的是服務器;雙向驗證服務器客戶端互相驗證。
對于服務器來講,單向驗證能夠保證傳輸的數據加密過了;雙向驗證能夠保證客戶端來源的安全性。
如果使用雙向驗證的話,需要客戶端瀏覽器導入證書。
證書是和域名綁定的,服務開放之前,域名確定、購買,https證書的購買需要先搞定。
非對稱加密使用什么加密算法,RSA還是DSA?
非對稱加解密的話,加解密比較慢,實現上使用java實現還是c?
服務前臺客戶端,對用戶輸入進行js表單驗證;
目前,我們服務前臺的客戶端的表單驗證也要交互一下后臺,增加了后臺負載,而且還留下了XSS攻擊隱患;
應該是接受指定長度范圍內、采用適當格式、采用所預期的字符的內容提交;
對于對其他的特別是javascript相關的特殊字符一律過濾;
對于某些html危險字符進行轉義,比如>轉義為>,<轉義為<;
對于存放敏感信息的Cookie,對該Cookie添加HttpOnly屬性,避免被攻擊腳本竊取;
服務前臺服務器端,對用戶輸入再次驗證;
進行服務器端表單級驗證,防止惡意用戶模擬瀏覽器繞過js代碼進行攻擊;
建議對于服務器端表單驗證統一系統異常碼,結合系統異常處理機制。客戶端根據服務器端返回異常碼顯示相應信息,而不是將異常報告赤裸裸地展現給客戶:一是用戶體驗不好,二者給惡意用戶帶來可趁之機;
程序中使用ESAPI庫預防XSS:

同3防御XSS攻擊中"建議對于服務器端表單驗證統一系統異常碼"條;
服務前臺客戶端在進行表單級驗證的需要對drop、update、delete等SQL進行消毒;
服務前臺服務器端再次進行服務器表單級驗證的時候,需要再次對drop、update、delete等SQL進行消毒,防止惡意用戶繞過js進行攻擊;
對敏感字符進行轉義,比如'轉義為';
傳統jdbc進行參數綁定,如

iBATIS/MyBatis進行參數綁定,在SQL語句的節點中,設置parameterClass="java.util.Map"即可,程序里把參數封裝到Map中。
5.防御CSRF攻擊
使用Struts2的表單標簽,其中需要增加token標簽;
重要的節點如復核,加一個驗證碼驗證;
檢查HTTP請求頭的Referer域,驗證是否合法;
6.設定限額等風險規則,超過就預警,需額外人工授權才能審核通過
7.避免表單重復提交
使用Struts2的表單標簽,其中需要增加token標簽;
對上傳文件進行哈希庫記錄驗證,如有重復詢問客戶是否繼續;
8.nginx反向代理
nginx是我們服務器對外的第一層屏障;
通過它我們可以輕松進行各種安全設定,比如禁止IP、限制IP并發數(這個可以預防DOS攻擊)、設置timeout時間(這個也可以預防DOS攻擊)、限制用戶帶寬等等;
nginx還能對外屏蔽服務器接口路徑、靜態文件真實路徑,避免路徑遍歷攻擊;
nginx有個專門預防XSS、注入攻擊的模塊naxsi;
動靜分離,加快響應速度,降低tomcat負載;
負載均衡;
9.及時更新Struts2框架
10.設置文件上傳白名單,或者干脆限制為xls、xlsx,以避免上傳文件攻擊
11.nginx漏洞利用和安全加固
nginx配置錯誤而導致目錄遍歷漏洞
比如


當訪問http://192.168.1.103/test/這個URL時,正常情況應該遍歷html/test/這個目錄,但是如果訪問http://192. 168.1.103/test../這個URL時,則會遍歷上一級目錄html/了。
應該改為

或者直接禁用autoindex模塊。
nginx版本的選擇
關于nginx的安全漏洞可以關注nginx官方發布的安全公告或到其他一些漏洞發布平臺上查找。
在安裝nginx時建議使用自定義安裝路徑,如果采用默認安裝路徑,很容易被攻擊者和一些自動化攻擊工具猜測到,為其進行下一步的攻擊提供便利。
在選擇nginx版本時,需要關注是否存在安全漏洞和版本的穩定性。一般選擇最新的穩定版本,這樣可以在穩定性和安全之間取得一個平衡。
修改/隱藏Nginx Banner信息
日志安全
修改日志的默認保存路徑,然后設置只允許管理員有日志存放目錄的安全控制權限。
nginx權限設置
給nginx一個權限比較低的身份運行,可以通過修改nginx.conf進行調整。應用服務器、數據庫也應該遵循這個原則。
關閉服務器標記
如果開啟的話(默認為開啟),所有錯誤頁面都會顯示服務器的版本和信息。
設置自定義緩存以預防緩存區溢出攻擊
12.web服務器和應用服務器目錄權限設置原則
如果目錄有寫入權限,一定不要分配執行權限;
比如網站上傳目錄和數據庫目錄一般需要分配寫入權限,但一定不要分配執行權限。
如果目錄有執行權限,一定不要分配寫入權限;
一般目錄只需分配讀取權限即可;
應用服務器和數據庫部署在不同的服務器上;
文件屬主與應用服務器進程屬主不同(一般設置文件屬主為root);
控制腳本只運行訪問應用項目目錄下的文件。