要想知道怎么防SQL注入攻击,就要先了解什么是SQL注入攻击。SQL注入攻击是网络中一种常见的攻击方式,
它利用程序中的疏忽,在参数中加入一些关键字对SQL语句进行更改,将密码验证部分的功能架空,从而实现无需
密码进行登录,甚至是对数据库进行破坏。在另一篇文章里提到的statement语句就有可能出现这样的情况。
那么怎么防止SQL注入攻击呢,方式其实有很多。这里介绍两种:
一、正则表达式
既然攻击是通过参数对关键字进行修改的,那么我们就可以用一个正则表达式对传入的参数进行限制,如果参数
中含有能对SQL语句造成影响的特殊符号或关键字,就退出程序,返回输入不合法的提示。
二、PreparedStatement
PreparedStatement语句是预编译的语句对象,他可以先将语句中的参数用占位符 ?代替,形成一个语句骨架发送
到服务器上,让服务器编译确定下来,这样,后面传进来的参数即使有特殊符号和关键字,也不会再对SQL产生影响了。
下面是例子:
/**
* 根据用户名和密码查询用户信息
* 通过PreparedStatement对象防止SQL注入攻击问题
* @param username
* @param password
*/
private static void login(String username, String password) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//注册驱动并获取连接
conn = JdbcUtil.getConn();
//获取传输器并发送sql到服务器执行
String sql = "select * from user where username=? and password=?";
//将sql骨架发送给服务器,让服务器编译并确定下来(防止篡改)
ps = conn.prepareStatement( sql );
//将参数值传过去替换占位符
ps.setString( 1 , username );
ps.setString( 2 , password );
//执行sql语句,返回执行结果
rs = ps.executeQuery();
//处理结果
if( rs.next() ) {//用户名密码正确
System.out.println("恭喜您登录成功!");
}else {//用户名密码不正确
System.out.println("登录失败,用户名或密码错误!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//释放资源
JdbcUtil.close(conn, ps, rs);
}
}