开发过程中常见的安全问题
必要系统参数需要加密
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
对相关数据进行解密。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21spring.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 等。针对不同的应用我们最好配置不同的用户,并严重控制每种用户的权限。