JAVA概述
第一部分:java入门基础
第二部分:java常用类
第三部分:jdbc系列教程
第四部分:java高级特征
java8新特征详解
java文件操作专题教程

知识点

相关文章

更多

最近更新

更多

JDBC系列教程之四:SQL注入PreparedStatement和Statement

2019-03-28 00:37|来源: 领悟书生

SQL注入,PreparedStatement和Statement

l  在SQL中包含特殊字符或SQL的关键字(如:' or 1 or ')时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用PreparedStatement来解决。

l  PreperedStatement(从Statement扩展而来)相对Statement的优点:

        1.没有SQL注入的问题。

        2.Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。

        3.数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库连接没有关闭的情况下有效)。

static void read(String name) throws SQLException {

      Connection conn = null;

      PreparedStatement ps = null;

      ResultSet rs = null;

      try {

          // 2.建立连接

          conn = JdbcUtils.getConnection();

          // 3.创建语句

          String sql = "select id, name, money, birthday  from user where name=?";

          //预处理

          ps = conn.prepareStatement(sql);

          ps.setString(1, name);

          // 4.执行语句

          rs = ps.executeQuery();

          // 5.处理结果

          while (rs.next()) {

             System.out.println(rs.getInt("id") + "\t"

                 + rs.getString("name") + "\t" + rs.getDate("birthday")

                 + "\t" + rs.getFloat("money"));

          }

      } finally {

          JdbcUtils.free(rs, ps,  conn);

      }

   }


本文链接:SQL注入PreparedStatement和Statement,转自请注明:http://www.656463.com/article/798

相关问答

更多
  • 使用字符串连接来从任意输入构建查询不会使PreparedStatement安全。 看看这个例子: preparedStatement = "SELECT * FROM users WHERE name = '" + userName + "';"; 如果有人提出 ' or '1'='1 作为userName ,你的PreparedStatement容易受到SQL注入攻击,因为该查询将在数据库中执行 SELECT * FROM users WHERE name = '' OR '1'='1'; 所以,如 ...
  • SQL注入的问题是用户输入被用作SQL语句的一部分。 通过使用准备的语句,您可以强制将用户输入作为参数的内容(而不是SQL命令的一部分)进行处理。 但是,如果不使用用户输入作为准备语句的参数,而是通过将字符串连接在一起构建您的SQL命令,即使使用预准备语句, 仍然易于进行SQL注入 。 The problem with SQL injection is, that a user input is used as part of the SQL statement. By using prepared sta ...
  • 批处理执行Statement和PreparedStatement的区别在于Statement批可以包含不同的语句(只要它们是不产生结果集的语句),例如单个批次可以将各种插入包含到各种表中,删除,更新和 - 并非在所有的JDBC驱动程序实现AFAIK - 甚至DDL语句。 另一方面, PreparedStatement批处理执行涉及单个语句,批处理包含要为该语句执行的多组参数值。 也就是说,每个批次条目定义了用于准备语句参数的值。 简而言之: Statement :批处理可以包含很多不同的声明 Prepare ...
  • 浏览了log4jdbc的源代码后,我可以推断所有日志记录都是由slf4j执行的,并委托给应用程序使用的实际记录器实现。 我不确定你的环境中实际使用了什么记录器。 这取决于您的应用程序服务器(我在您的评论中推断这一点)。 通常,应用程序服务器将使用log4j或java.util.logging。 您需要配置其中一个记录器以确保仅启用jdbc.sqlonly记录器; 必须禁用log4jdbc页面上提到的其他记录器,或将其日志记录级别设置为较高值。 如果正在使用log4j,则以下代码段(来自log4jdbc站点上 ...
  • 它不能用java.sql.PreparedStatement接口本身完成; 它取决于您的数据库供应商的实现。 但你很幸运; MySQL驱动程序允许您使用其toString实现来执行此操作: http://www.avajava.com/tutorials/lessons/how-do-i-display-a-prepared-statement-with-bind-variables-using-mysql.html 您需要注意,使用此特定于供应商的功能会将您的代码绑定到MySQL。 您无法在不更改代码的情 ...
  • 使用PreparedStatement的第二种方法要好得多,因为它可以使用预先准备好的语句池来提高性能。 准备语句通过缓存重用 在使用Statement的第一部分中,您的语句与单个数据相关联,必须每次为不同的数据创建一个新语句。 在Prepared Statement的情况下,可以使用不同的数据多次执行相同的语句。 编辑: 能否详细说明一下“缓存重用”? PreparedStatement的缓存是一种透明机制 ,其中Connection维护一个预准备语句池,当您请求具有相同SQL查询的预准备语句时,将返回缓 ...
  • 你应该使用executeUpdate 。 “执行给定的SQL语句,该语句可以是INSERT,UPDATE或DELETE语句,也可以是不返回任何内容的SQL语句,例如SQL DDL语句。” You should use executeUpdate. "Executes the given SQL statement, which may be an INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, suc ...
  • 对于两(2)个不同的SQL查询,您将需要两(2)个不同的PreparedStatement对象,每个对象都有自己的批处理,但是当您想要将查询发送到服务器时,您只需执行每个批处理: try ( PreparedStatement thisPs = conn.prepareStatement("INSERT INTO thisTable (thisId, thisText) VALUES (?,?)"); PreparedStatement thatPs = conn.prepa ...
  • 不同的驱动程序使用不同的 在您的情况下,您尝试访问的sql字段不是该驱动程序的可用字段之一。 要获取JDBC驱动程序的所有名称,请使用以下代码: Class stmt1 = prepStmt.getClass(); try { java.lang.reflect.Field mem[] = stmt1.getDeclaredFields(); for (Field x:mem){ System.out.println("Field:"+x.getName()); ...
  • java.sql.PreparedStatement旨在可重用。 设置新参数时,将覆盖之前的参数,但不会创建新的Statement。 您还可以决定使用clearParameters()自行清除所有参数 java.sql.PreparedStatement is designed to be reusable. When you set new parameters, you will overwrite the previous ones but you will not create a new Stat ...