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语句查询数据库。
  • 相关阅读:
    最近学习下,nohup和&的区别
    java 关键字
    iOS之事件穿透
    排序算法——快速排序
    分布式-选举算法
    分布式选举算法
    SolrCloud 分布式集群部署步骤
    linux 启动两个tomcat
    solr安装-tomcat+solrCloud构建稳健solr集群
    JAVA 中BIO,NIO,AIO的理解
  • 原文地址:https://www.cnblogs.com/yikuan-919/p/9519805.html
Copyright © 2011-2022 走看看