代码脆弱性防范指引-SQL注入防范

SQL注入式攻击是指利用设计上的脆弱性,在目标服务器上运行Sql命令以及进行其他方式的攻击动态生成Sql命令。没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据。

Java程序也存在SQL注入问题,可以通过使用PreparedStatement类来阻止SQL注入。

一段可能产生SQL注入的代码如下:

String user = request.getParameter("username");
	String pass = request.getParameter("password");
	String query = "SELECT id FROM users WHERE username="+user+" AND password="+pass;
	Statement stmt = con.createStatement(query);
	ResultSet rs = con.executeQuery(query);
	if (rs.next())
	{
	// 登录成功
	int id = rs.getInt(1);
	...
	}
	else
	{
	// 登录失败
	...
	}

正确的做法如下:

	String user = request.getParameter("username");
	String pass = request.getParameter("password");
	String query = "SELECT id FROM users WHERE username=? AND password=?";
	PreparedStatement stmt = con.prepareStatement(query);
	stmt.setString(1, user);
	stmt.setString(2, pass);
	ResultSet rs = stmt.executeQuery();
if (rs.next())
	{
	// 登录成功
	int id = rs.getInt(1);
	...
	}
	else
	{
	// 登录失败
	...
	}

安全编码规范:

要使用参数化的查询、占位符、或者参数绑定来构造Sql语句;即使调用的是存储过程,也不要使用字符串链接来构造Sql语句,同时代码中尽量使用PreparedStatement类,如果没有使用就一定要对输入做特殊字符过滤,过滤的字符至少包括(大小写无关):

过滤字符

‘   (单引号)

And

Select

update

chr(

delete

insert

mid(

master.

--和;的组合

exec

backup

declare

char(

/*

代码检查关键词:java.sql, javax.sql,sql,select


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值