代码脆弱性防范指引-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


你可能感兴趣的:(ASP.NET,C#)