SQL注入问题及解决方案

SQL注入

用户输入的内容, 在SQL语句拼接过程中, 完成了一条逻辑发生变化的新的SQL语句 !

例如:

原SQL语句拼接为:

String sql = "select id from user15 where username='"+user.getUserName()+"' and password='"+user.getPassWord()+"'";

用户输入的帐号密码分别为:

请输入您的帐号:
suibian
请输入您的密码:
suibian' or '1'='1
组成的SQL语句:
select id from user15 where username='suibian' and password='suibian' or '1'='1'

解决SQL注入问题

使用预编译SQL语句 进行参数的传递

更改执行环境 Statement

使用新的环境: PreparedStatement

在通过连接对象 获取一个预编译的SQL环境(PreparedStatement)时, 需要传递 一个SQL语句 !
在这个语句中 可以出现? , ? 表示准备填充的参数值!

使用步骤:

1. 通过连接对象, 获得一个预编译的SQL执行环境

PreparedStatement state conn.prepareStatement(sql);

例如:
String sql = "select id from user15 where username=? and password=?";

PreparedStatement state = conn.prepareStatement(sql);

2. 向预编译参数列表中 传递值:

预编译的SQL语句中可以包含0-n个问号, 每一个问号表示一个需要传递的值
我们通过PreparedStatement它的setXXX方法,来完成参数的传递
在传递参数时, 需要指定问号的索引, 问号的索引从1开始

例如:
state.setString(1,user.getUserName());
state.setString(2,user.getPassWord());

3. 执行语句:
ResultSet result = state.executeQuery();

PreparedStatement

常用方法:

填充预编译的参数:

- setXXX(问号索引,值)
向预编译的SQL的?中传递值
参数1. 问号的索引 ,从1开始
参数2. 填充到? 中的值

- execute()
- executeUpdate();
- executeQuery();
上面的三个方法 与 Statement中方法的含义一致, 只不过不存在参数!

posted @ 2018-12-24 11:50  不服输的IT菜鸟  阅读(6637)  评论(0)    收藏  举报