写在前面
目前处于互联网时代,任何信息的传播都离不开网络的环境。而Java又作为互联网时代的第一语言,如何更规范的编码,使在程序开发中更加安全的运用,就是老生常谈的互联网安全问题之一。
今天,笔者就为大家带来整理的Java开发中的安全编码问题,只是笔者个人见解,有哪里不完善的地方,请各位大佬多多指出,笔者和大家一起进步学习~~~
输入校验
编码原则:针对各种语言本身的保留字符,做到数据与代码相分离。
SQL 注入防范
严重性高,可能性低。
(1) 参数校验,拦截非法参数(推荐白名单):
public String sanitizeUser(String username) {
return Pattern.matches("[A-Za-z0-9_]+", username)
? username : "unauthorized user";
}
(2) 使用预编译:
String sql = "UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?";
PreparedStatement statement = conn.prepareStatement(sql);
statement.setBigDecimal(1, 285500.00);
statement.setInt(2, 30015800);
XSS防范
严重性中,可能性高。防范方法有:
(1) 输入输出校验(推荐白名单);
(2) org.apache.commons.lang 工具包处理;
(3) 富文本可用 owasp antisamp 或 java html sanitizer 处理;
(4) ESAPI 处理:
// HTML 实体
ESAPI.encoder().encodeForHTML(data);
// HTML 属性
ESAPI.encoder().encodeForHTMLAttribute(data);
// JavaScript
ESAPI.encoder().encodeForJavaSceipt(data);
// CSS
ESAPI.encoder().encodeForCSS(data);
// URL
ESAPI.encoder().encodeForURL(data);
代码注入/命令执行防范
严重性高,可能性低。
(1) 参数校验,拦截非法参数(推荐白名单);
(2) 不直接执行用户传入参数:
if("open".equals(request.getParameter("choice"))) {
Runtime.getRuntime().exec("your