1. 概述
在程序部署时,我们可能会遇到一些网络的攻击,因此我们程序需要注意一些关于安全的问题。
2. 安全问题解决办法
2.1. 参数值溢出
这个问题是在模拟输入数据过长,会产生数据溢出,比如 一个用户对象的名称,在攻击时,客户端使用过长的字符串,解决办法是限制客户提交的长度。
我们使用在代码上增加注解的方法来限制客户输入数据的长度,当然也可以做其他的限制。
在我们的 BaseController 增加保存时对对象的验证。
import org.springframework.validation.annotation.Validated;
public JsonResult save(@Validated @ApiParam @RequestBody E entity, BindingResult validResult) throws Exception{
这里对提交的数据进行验证,当验证失败会向客户端抛出错误信息。
在需要验证的类中增加注解:
@Size(max = 8,message = "最大长度不能超过8")
@TableField(value = "ALIAS_")
private String alias;
注解列表如下:
这个问题需要在开发的时候进行解决。
2.2. SQL注入
SQL 注入的问题主要出现在列表中,这个问题出现在从URL传入参数时,出现了注入问题。
我们的修改方案是,在获取客户端提交的参数时,我们对参数进行了过滤,当参数中的数据出现了 SQL注入的代码时,我们检查参数,并抛出异常。
具体的修改代码为:
//StringUtils 增加检测是否有注入方法。
public static boolean isSqlInject(String injectStr) {
String injStr = "'|and|exec|create|insert|select|delete|update|count|*|%|chr|mid|master|truncate|drop|char|declare|;|or|-|+|,";
String injStrArr[] = injStr.split("\\|");
injectStr = injectStr.toLowerCase();
for (int i = 0; i < injStrArr.length; i++) {
if (injectStr.indexOf(injStrArr[i]) >= 0) {
throw new RuntimeException("参数有SQL注入问题");
}
}
return false;
}
这个方法在列表的被调用
public static Map<String,Object> getParameterValueMap(HttpServletRequest request, boolean remainArray)
在构建QueryFilter代码中使用。
private static void getSqlQueryParams(QueryData queryData,QueryFilter queryFilter){
if(BeanUtil.isEmpty(queryData.getParams())){
return;
}
Iterator<Map.Entry<String,String>> paramsIt=queryData.getParams().entrySet().iterator();
while (paramsIt.hasNext()){
Map.Entry<String,String> keyVals=paramsIt.next();
if(BeanUtil.isEmpty(keyVals.getValue())){
continue;
}
if(!keyVals.getKey().startsWith("Q_")){
if(!StringUtils.isSqlInject(keyVals.getValue()) ){
queryFilter.addParam(keyVals.getKey(),keyVals.getValue());
}
}else{
QueryParam queryParam= QueryFilter.getQueryParams(keyVals.getKey(),keyVals.getValue());
queryFilter.addQueryParam(queryParam);
}
}
}
文档更新时间: 2021-08-28 12:18 作者:zyg