黑马day10 预编译解决sql的注入攻击&PrepareStatement
2015-06-29 21:22
731 查看
SQL注入攻击:
由于dao中执行的SQL语句是拼接出来的,其中有一部分内容是由用户从客户端传入,所以当用户传入的数据中包含sql关键字时,就有可能通过这些关键字改变sql语句的语义,从而执行一些特殊的操作,这样的攻击方式就叫做sql注入攻击
PrepareStatement案例:
由于dao中执行的SQL语句是拼接出来的,其中有一部分内容是由用户从客户端传入,所以当用户传入的数据中包含sql关键字时,就有可能通过这些关键字改变sql语句的语义,从而执行一些特殊的操作,这样的攻击方式就叫做sql注入攻击
1.登陆的数据库实现代码:
public User findUserByUserNameAndPassword(String username, String password) { try { <span style="color:#ff0000;">String sql="select * from users where username='"+username+"'and password='"+password+"'"</span>; con=JDBCUtils.getConnection(); sta =con.createStatement(); rs=sta.executeQuery(sql); if(rs.next()){ User user=new User(); user.setId(rs.getInt("id")); user.setUsername(rs.getString("username")); user.setNickname(rs.getString("nickname")); user.setEmail(rs.getString("email")); return user; }else{ return null; } } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException(); }finally{ JDBCUtils.closeResource(rs, sta, con); } }
2.登陆界面:我的数据库中已经添加了dd的用户名和密码为dd的密码用户,但是我在用户名输入框中填写dd'#的时候不输入密码也能登陆。这是什么原因呢?我们找到数据库中影响这个的代码:String sql="select * from users where username='"+username+"'and password='"+password+"'";如果加上'#:相当于把后面的注释掉了。因此只需要判断用户名正确就可以了!
3.为了解决这种攻击我们可以采用使用PrepareStatement
PreparedStatement利用预编译的机制将sql语句的主干和参数分别传输给数据库服务器,从而使数据库分辨的出哪些是sql语句的主干哪些是参数,这样一来即使参数中带了sql的关键字,数据库服务器也仅仅将他当作参数值使用,关键字不会起作用,从而从原理上防止了sql注入的问题.PrepareStatement案例:
package cn.itheima.jdbc; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import cn.itheima.utils.JDBCUtils; public class JDBCDemo5 { public static void main(String[] args) { Connection con=null; PreparedStatement ps=null; ResultSet rs=null; try { con=JDBCUtils.getConnection(); ps=con.prepareStatement("select * from user where name=? "); ps.setString(1, "韩玮"); rs=ps.executeQuery(); //1.查询了数据形成一个表 //rs指向查询出的数据表的前一行 if(rs.next()){ String id = rs.getString("id"); String name=rs.getString("name"); String birthday=rs.getString("birthday"); System.out.println(id+":"+name+":"+birthday); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); }finally{ JDBCUtils.closeResource(rs, ps, con); } } }语句中的参数部分全部使用?然后使用ps.setXXX方法来设置参数
相关文章推荐
- 深入浅出Symfony2 - 结合MongoDB开发LBS应用
- SQL TRANSACTION 事物
- 黑马day10 增加&删除&更新到数据库mysql
- MongoDB导入导出数据
- sqlserver监控sql执行
- Wireshark 抓包---诊断数据库
- MySql索引原理与使用大全
- 黑马day10 jdbc入门&mysql
- MSSQL - 多表查询
- 进击的java(8):springmvc+redis实现登录与拦截器
- Redis 笔记与总结7 PHP + Redis 信息管理系统(用户信息的增删改查)
- mysql安装及odbc配置相关
- 利用sqoop将hive数据导入导出数据到mysql
- ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql连不上
- Oracle基础(三)数据库管理
- Java向Oracle数据库插入时间
- linux操作系统-memcache安装
- Slave SQL_THREAD如何重放Relay log
- Oracle基础(二)---操作命令
- redis cluster 搭建