sqlInjection

1    sqlInjection

1.1       whatis sqlInjection

sql注入:由于没有对用户输入进行充分检查,而SQL又是拼接而成,在用户输入参数时,在参数中添加一些SQL 关键字,达到改变SQL运行结果的目的,也可以完成恶意攻击。

1.2       howto inject

String sql = select * from user where username =' zhangsan' -- ' and password =' ' ;

例如:

恶意注入方式一:输入username: 随意  password: ' or '1'='1

select * from user where username ='xxxxx' andpassword ='xxx' or '1'='1';

* and 优先级 执行 高于 or

恶意注入方式二、在SQL添加 -- 是mysql的注释 用户名框:输入 zhangsan' 空格--空格  password 随意

select * from user where username ='zhangsan' -- ' andpassword ='' ;

注意:以上的 zhangsan' 空格--空格中的zhangsan是数据库存在的

2    jdbc反sqlInjection

2.1       PreparedStatement

java.sql
接口 PreparedStatement

所有超级接口:

Statement, Wrapper

所有已知子接口:

CallableStatement

public interface PreparedStatement

extends Statement

表示预编译的 SQL 语句的对象。

SQL 语句被预编译并存储在 PreparedStatement对象中。然后可以使用此对象多次高效地执行该语句。

注:用于设置 IN 参数值的设置方法(setShort、setString 等等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数具有 SQL 类型 INTEGER,那么应该使用 setInt 方法。

如果需要任意参数类型转换,使用 setObject 方法时应该将目标 SQL 类型作为其参数。

在以下设置参数的示例中,con 表示一个活动连接:

   PreparedStatementpstmt = con.prepareStatement("UPDATE EMPLOYEES

                                     SET SALARY= ? WHERE ID = ?");

  pstmt.setBigDecimal(1, 153833.00)

   pstmt.setInt(2,110592)

 

另请参见:

Connection.prepareStatement(java.lang.String),ResultSet

 

 void

setString(int parameterIndex, String x)
          将指定参数设置为给定 Java String 值。

 void

setInt(int parameterIndex, int x)
          将指定参数设置为给定 Java int 值。

 ResultSet

executeQuery()
          在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。

 int

executeUpdate()
          在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERT、UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。

 

Connection

PreparedStatement

prepareStatement(String sql)
          创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。

 

2.2       Example

public User findUser(User user){

      Connection conn=null;

      PreparedStatement pstate=null;

      ResultSet rs=null;

      User existUser=null;

      try{

         conn=JdbcUtils.getConnection();

         String sql="select *from users where username=? and password=?";

         pstate=conn.prepareStatement(sql);

         pstate.setString(1, user.getName());

         pstate.setString(2, user.getPassword());

         rs=pstate.executeQuery();

         while(rs.next()){

            existUser=new User();

            existUser.setName(rs.getString("username"));

            existUser.setPassword(rs.getString("password"));

         }

      }catch(Exception e){

         e.printStackTrace();

      }finally{

         JdbcUtils.release(conn,pstate,rs);

      }

      return existUser;

   }

   @Test

   public voidtestFindUser(){

      User user=new User();

      user.setName("kkk");

      user.setPassword("123");

      UserDao ud=new UserDao();

      User existUser=ud.findUser(user);

      System.out.println(existUser);

   }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值