在java web编程中,要注意一些安全问题,sql注入、任意文件上传、文件下载漏洞、数据库密码泄露等,可以多参考owasp top 10的常见漏洞,结合fortify白盒测试工具中漏扫结果,养成一个良好的编程习惯!下面分享一下开发的一些小习惯:
防范sql注入:
在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。一定要做到:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(PreparedStatement);
小习惯:1.StringEscapeUtils.escapeSql(request.getParameter("id"))//StringEscapeUtil是common-lang包中的一个类,其中escapseSql方法可以起到对参数的sql注入有效过滤;
2.在进行sql语句执行时,要对sql语句进行示例话,避免进行sql拼接:
PreparedStatement pstmt = null;// 定义数据库操作对象
ResultSet rs = null;
sql = "select * from user where id=?";
pstmt = conn.prepareStatement(sql);// 实例化操作
pstmt.setString(1, id);
rs=pstmt.executeQuery();// 取得结果
因为sql注入只对sql语句的准备(编译)过程有破坏作用,而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理;而不再对sql语句进行解析,准备,因此也就避免了sql注入!
防范文件上传漏洞:
文件下载链接是程序员经常遇到的情景,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:
--验证文件类型、大小;
--对文件进行一定复杂的重命名;
--不要暴露文件上传后的路径;
小习惯:
String[] strArray = fileName.split("\\.");
intsuffixIndex = strArray.length -1;
strArray[suffixIndex];获取到文件名后缀进行白名单判断;
upload.setFileSizeMax(30*1024*1024);//单文件30M
upload.setSizeMax(50*1024*1024);//设置总文件大小50M,
String uuid = UUID.randomUUID().toString();//将文件进行复杂重命名,使用uuid可以避免文件覆盖.
String savePath = this.getServletContext().getRealPath("/WEB-INF/upload/" + uuid);//放到/WEB-INF/upload/安全目录下。
防范文件下载漏洞:
例如,先向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后会开始执行下载方法,最后将该文件名对应的文件response给浏览器完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞,如localhost:8080/XX/filedown?filename=../../web.xml,../这些特殊字符就可能造成文件信息泄露!
小习惯:
// 过滤特殊字符
public static String StringFilter(String str) throws PatternSyntaxException {
// 只允许字母和数字 // String regEx ="[^a-zA-Z0-9]";
// 清除掉所有特殊字符
String regEx = "[`~!@#$%^&*()+=|{}':;',\\[\\]<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
return m.replaceAll("").trim();
}
数据库密码泄露:
很多程序员喜欢把数据库密码写在代码中,存在反编译被攻击者窃取的风险,我们可以将代码写在配置文件中!
好了,今天的编程小习惯就分享到这里,让我们做一名具有安全编程思想的快乐码农呗!!!
网友评论