在web开发中如何避免sql注入
1、第一步:sql注入产生原因。
1、说起sql注入就要说一下java与数据库连接的问题那就是java.sql.Statement对象;
2、java.sql.Statement对象执行的是拼接的sql也就是说它直接执行sql。此时当你传入的参数是一个sql语句的时候就会造成sql操作安全问题。
如下图:不管入参是什么它都会将其当做一个语句执行
3、也是用户web前台输入的参数未限制。

2、第二步:创建表和自段。
1、创建一个库如果已经存放用已有的也可以
2、创建一个表test字段如下图所示;



3、第三步:问题演示。
1、创建一个javaweb工程。
2、引入mysql数据库驱动包
3、编写代码
3.1编写数据库连接
3.2 编写测试代码(使用更新删除或者其它注入危害为更大,如在后面拼接一条删除语句)
public static void testStatement(){
String name = "'zhan' or 1=1";
String sql = "select * from test where name = "+name;
Connection conn = getConnection();
try {
st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
System.out.println("id:"+rs.getString("id")+" name:"+rs.getString("name")+" age"+rs.getString("age")+" sex:"+rs.getString("name"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
3.3 main方法调用查询




4、第三步:使用PreparedStatement。
1、总结第一次出现本不应该查出数据却获得所有数据的原因是Statement对象会将整个sql当作原生语句执行它没有区分变量和sql的能力。
2、借助于java.sql.PreparedStatement填充变量,其会将变量当做值去执行sql,而不会将其当做sql执行,并且有预编译功能查询效率更高。
public static void testPreparedStatement(){
String name = "'zhan' or 1=1";
String sql = "select * from test where name = ?";
Connection conn = getConnection();
try {
pst = conn.prepareStatement(sql);
pst.setObject(1, name);
ResultSet rs = pst.executeQuery();
while(rs.next()){
System.out.println("id:"+rs.getString("id")+" name:"+rs.getString("name")+" age"+rs.getString("age")+" sex:"+rs.getString("name"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
3、执行测试,查询结果为空




5、第三步:查询之前校验数据。
1、web前端使用js的正则表达式在前台文本中做输入校验
2、在java后台做输入校验,如使用过滤器统一校验。或者自己单独在controller中校验。