zoukankan      html  css  js  c++  java
  • SQL注入攻击及其解决方法

    SQL注入攻击:

      当程序中出现了SQL拼接时,当输入的值为jack'#或者'jack' or '1=1时,会让SQL语义发生改变,因为SQL语句中出现了SQL的关键字(# or 1=1),造成数据泄露,系统安全隐患。

    SQL语义发生改变的语句例如:

    select * from user where username='jack'#' and password=''
    
    select * from user where username='jack' or '1=1' and password=''

    解决SQL攻击:

      利用PreparedStatement对象;

    //3,获取带有预编译的传输器
    //SQL中包含着?的,叫做SQL骨架。
    //? 叫做占位符
    String sql = "select * from user where username=? and password=?";
    ps = conn.prepareStatement(sql);
    //设置参数setString
    //第一个参数必须和问号的顺序一致,
    //第二个参数指定问号的值
    ps.setString(1, name);
    ps.setString(2, pwd);
              
    //4,执行SQL
    rs = ps.executeQuery();

    PreparedStatement优势:

    1,防止SQL注入
    先把SQL骨架(带有?的一条SQL,?叫做 占位符)发送给数据库服务器,然后再把参数发给服务器。
    本质上是由于新对象把sql关键字给屏蔽了,把SQL关键字当做一个普通的文本处理。
    
    2,省略了参数拼接的麻烦,通过?作为占位符,通过setString方法来绑定问号的位置,并且赋值来完成的。
    
    3,提高执行效率
    先把SQL骨架缓存起来,当下次要访问相同SQL骨架的业务时,先去缓存中找SQL,缓存中没有的话,再发出SQL语句查询数据库。
  • 相关阅读:
    .Net 应用中使用dot trace进行性能诊断
    MyBatis批量增删改查操作
    hadoop2.7.2基于centos全然分布式安装
    HDOJ 3666 THE MATRIX PROBLEM 差分约束
    BZOJ1635: [Usaco2007 Jan]Tallest Cow 最高的牛
    BZOJ1089: [SCOI2003]严格n元树
    BZOJ1406: [AHOI2007]密码箱
    BZOJ1270: [BeijingWc2008]雷涛的小猫
    BZOJ1211: [HNOI2004]树的计数
    BZOJ2729: [HNOI2012]排队
  • 原文地址:https://www.cnblogs.com/yikuan-919/p/9519805.html
Copyright © 2011-2022 走看看