zoukankan      html  css  js  c++  java
  • [Js-JDBC]SQL注入及解决,Statement与PreparedStatement

    SQL注入的含义

    用户在输入信息中有SQL关键字并且参与SQL语句的编译,导致SQL语句含义扭曲,这种现象被称为SQL注入

    例如:

    1 // 在登录验证的时候使用如下语句
    2 String sql = 
    "select * from tb_user where username = '"+username+"' and userpwd = '+pwd+'";

    而用户在密码处输入:asd' or 'a'='a

    则会导致

    select * from tb_user where username = 'admin' and userpwd = 'asd' or 'a'='a';

    显而易见以上SQL语句条件永远为真

    根本原因:先拼接SQL语句字符串,然后再进行比那一,这个时候用户提供的信息中含有SQL关键字,并参与了这次编译,扭曲了原意

    如何防止SQL注入

    先定义SQL语句框架,对SQl语句进行预先编译,只编译一次,然后再去接收用户提供的信息,用户提供的信息中即使含有SQL语句的关键字,这些关键字不参与这次SQL语句的编译,从而起不到作用,采用这种方式可以解决SQL注入问题

    使用 PreparedStatement 代替 Statement 预编译SQL语句,然后再传入参数

    注意:

    有的系统是需要SQL注入的,比如 select * from where,这就需要使用 Statement

    有的系统是要防止SQL注入的,比如登录系统,所以使用 PreparedStatement 

    PreparedStatement 与 Statement 对比

    1. PreparedStatement 防止 SQL 注入 ,执行效率高
    2. SQL 语句对于 Statement 来说是:编译一次执行一次;SQL 语句对于 PreparedStatement 是编译一次执行 N 次
    3. PreparedStatement 是类型安全的,编译期检查传入参数类型

    注意:

    使用 PreparedStatement 时 SQL 语句中的”?“不能写在单引号中,否则无法识别,如下的句子是错误的

    1 String sql = "select ename from emp where ename like '%?%'";
    2 PreparedStatement ps = conn.prepareStatement(sql);
    3 ps.setString(1, "0");

    正确的应该为:

    1 String sql = "select ename from emp where ename like ?";
    2 PreparedStatement ps = conn.prepareStatement(sql);
    3 ps.setString(1, "%0%");

    则会导致

  • 相关阅读:
    Java 并发工具包 java.util.concurrent 用户指南
    Java 序列化Serializable详解(附详细例子)
    Spring之FactoryBean .
    《用chsh选择shell》-linux命令五分钟系列之十二
    《vi中的替换艺术》-linux命令五分钟系列之十一
    0-1背包问题
    Java关键字final、static使用总结
    《作业控制系列》-“linux命令五分钟系列”之十
    《zip命令》-linux命令五分钟系列之九
    《bunzip2命令》-linux命令五分钟系列之八
  • 原文地址:https://www.cnblogs.com/jiasq/p/8531709.html
Copyright © 2011-2022 走看看