開發過程中常見的安全問題
必要系統參數需要加密
java 開發,一般都使用spring,比如jdbc等系統參數參數我們通常會抽出一個jdbc.properites,大部分情況 jdbc.properties 中的數據都是明文展示的。這樣假如我們的服務器被攻破那麼數據庫相關數據也基本可被攻擊者完全查看到。
解決方法
- 對
jdbc.properties
中的必要數據做加密,不要在jdbc.properties
顯示重要的明文信息。 - 在
spring.xml
中需要引入jdbc.properties
並對相關信息進行解密。這樣就無法通過<context:property-placeholder location="classpath*:conf/*.properties" ignore-unresolvable="true"/>
通過這種方式來引入相關配置文件。而需要通過配置bean
,並在bean
對相關數據進行解密。
spring.xml
<bean class="com.adups.dbencrypt.EncryptPropertyPlaceholderConfigure" p:locations="classpath*:conf/*.properties" p:ignoreUnresolvablePlaceholders="true">
</bean>
EncryptPropertyPlaceholderConfigure.java
public class EncryptPropertyPlaceholderConfigure extends PropertyPlaceholderConfigurer {
private String[] encryptPropNames = {"jdbc_url", "jdbc_username","jdbc_password"};
protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props)
throws BeansException {
try {
for (String prop : encryptPropNames) {
String url = props.getProperty(prop);
if (url != null) {
props.setProperty(prop, DbEncryptUtils.getDecryptString(url));
}
}
super.processProperties(beanFactoryToProcess, props);
} catch (Exception e) {
e.printStackTrace();
}
}
}
文件上傳限制
文件上傳必須對文件格式做限制,防止用戶上傳腳本木馬。針對文件上傳後展示最好使用nginx,針對tomcat不能讓用戶上傳jsp文件。假如用戶上傳jsp文件,並調取上傳的這個jsp,如果這個jsp經過tomcat解析,那麼用戶就可以通過上傳jsp腳本木馬獲取到部署代碼,並獲得服務器。
java 執行shell 需要對特殊字符做過濾
如果在java 程序中需要調取liunx shell 命令,那麼在執行命令之前對用戶傳入的參數中的特殊字符(" ' | )等做限制和替換。
XSS漏洞
java web 一般使用 filter (XSSRequestWrapper)對請求參數進行參數格式化,過濾可能存在xss漏洞的參數。但是這個方法對 form 表單類型爲multipart/form-data
是沒有效果的。所以針對form爲multipart/form-data
時,需要單獨進行XSS處理。
獲取IP
我們從網上找java獲取ip的代碼,會發現很多代碼都是從 request 的頭中解析ip。但是這種方式很不安全,用戶可以手動設置這些值導致ip獲取不準確。
使用request.getRemoteAddr();
獲取實際IP。
服務器權限
針對一個服務器可能需要部署很多應用比如tomcat mysql nginx 等。針對不同的應用我們最好配置不同的用戶,並嚴重控制每種用戶的權限。