安全问题其实是很多程序员想了解又容易忽略的问题,但需要我们重视起来,提高应用程序的安全性。常出现的安全问题包括,程序接受数据可能来源于未经验证的用户,网络连接和其
安全问题其实是很多程序员想了解又容易忽略的问题,但需要我们重视起来,提高应用程序的安全性。常出现的安全问题包括,程序接受数据可能来源于未经验证的用户,网络连接和其他不受信任的来源,如果未对程序接受数据进行校验,则可能会引发安全问题等等,具体也可以分成以下几方面:
- 数据校验
- 敏感信息
- 加密算法
- 序列化与反序列化
- I/O操作
- 多线程安全
- 框架和组件
数据校验
数据校验-校验策略
1. 白名单策略 -接受已知好的数据( 任何时候,尽可能使用“白名单”的策略 )
下面的示例代码确保 name参数只包含字母、以及下划线
if (Pattern.matches("^[0 -9A -Za -z_]+$", name)){throw new IllegalArgumentException("Invalid name");
}
2. 黑名单策略 -拒绝已知好的数据
public String removeJavascript(String input){Pattern p = Pattern.compile("javascript", Pattern.CASE_INSENSITIVE );
Matcher m = p.matcher(input);
return (! m.matches()) ? input : "";
}
3. 白名单净化
对数据中任何不属于某个已验证的、合法字符列表进行删除编码或者替换,然后再使用这些净化的数据
4. 黑名单净化: 剔除或者转换某些字符(例如,删除引号、转换成HTML实体)
public static String quoteApostrophe(String input){if (input != null){
return input.replaceAll(" \'","’");
} else{
return null;
}
}
数据校验 -输入输出
规则1.1 校验跨信任边界传递的不可数据**
程序接受的不可信数据源跨越任边界传递必须经过内校验,包括输入和出校验。
不可信数据:用户、网络连接等源 不可信数据:用户、网络连接等源
数据入口:
信任边界:根据威胁建模划分的信任边 如 web 应用的服务端;
规则 1.2:禁止直接使用不可信数据来拼SQL语句
SQL 注入是指原始SQL查询被动态更改成一个与程序预期完全不同的查询。执行这样后可能导致信息泄露或者数据被篡改。防止 SQL注入的方式主要可以分为两类:
ResultSet rs= null;
try{
String userName= ctx.getAuthenticatedUserName(); //this is a constant
String sqlString= "SELECT * FROM t_item
WHERE owner='" + userName+ "' AND itemName='" + request.getParameter("itemName") + "'";
stmt= connection.createStatement();
rs= stmt.executeQuery(sqlString);// ... result set handling
}
添加 name' OR 'a' = 'a
SELECT * FROM t_item WHERE owner = 'wiley' AND itemname= 'name' OR 'a'='a';
预编译处理:
PreparedStatement stmt= nullResultSet rs=null
try
{
String userName= ctx.getAuthenticatedUserName(); //this is a constant
String itemName= request.getParameter("");
// ...Ensure that the length of userName and itemNameis legitimate
// ...
String sqlString= "SELECT * FROM t_item WHERE owner=? AND itemName=?";
stmt= connection.prepareStatement(sqlString);
stmt.setString(1, userName);
stmt.setString(2, itemName);
rs=stmt.executeQuery();
// ... result set handling
}catch(SQLExceptions e)
{
// ... logging and error handling
}
在存储过程中,通拼接参数值来构建查询字符串和应用序代码一样同是有SQL注入风险