Java服务器端编程安全必读
[[wiki]wiki[/wiki]][/wiki]所有对文件[wiki]系统[/wiki]的访问都是字符串可能被解释执行的地方。用Java访问文件系统时,我们应该注意文件的命名方式。Listing 7是一个可能带来危险的例子。这个[wiki]程序[/wiki]根据用户输入决定读取哪个文件,它的危险就在于攻击者能够输入“../../../etc/passwd”这样的文件名字并获得系统的密码文件。这可不是我们希望出现礫wiki]氖[/wiki]虑椤Tし莱鱿终庵諿wiki]安全[/wiki]漏洞最简单的方法是:除非绝对需要,否则不要使用平面文件(Flat File)。
(Listing 7)
public class Unsafe[wiki]Servlet[/wiki]
{
public void doGet(HttpServletReq[wiki]UE[/wiki]st request,
HttpServletResponse response)
{
String product = request.getAttribute("product");
Reader fin = new FileReader(
"/usr/unsafe/products/" product);
BufferedReader in = new BufferedReader(fin);
String cost = in.readLine();
// 其他处理过程
response.getWriter().println(cost);
}
}
大多数[wiki]服务器[/wiki]系统,包括Servlet、JSP和EJB,都支持不直接依赖文件系统访问的配置方法。使用定制的SecurityManager或者使用一个简单的检查脚本(检查程序是否直接操作文件系统以及是否使用映像API),我们就可以实施“无文件系统直接访问”策略。尽管大多数应用服务器允许使用文件系统,但一个好的EJB不会使用它。最后,请务必不要忘记保持数据充分分离、精确定义这一良好的[wiki]编程[/wiki][wiki]习惯[/wiki]。假设我们有一个用来保存用户[wiki]信息[/wiki]的[wiki]数据库[/wiki],现在需要增加一个字段标示用户是否具有超级用户权限。如果在原来的表中增加一个列实在过于复杂,采用下面这种方法就变得很有吸引力:在用户名字中加上一个特殊字符表示用户是否具有特殊权限,当用户登录时检查竅wiki]锰[/wiki]厥庾址员惴乐狗欠ㄓ没谱约河涤刑厥馊ㄏ蕖5率瞪希庵肿龇ㄊ欠浅S泻Φ摹K械氖萦颍还芩窃谑菘庵谢故亲魑植勘淞浚加Ω[wiki]镁[/wiki]范ㄒ迩抑槐4嬉