`

SQL注入,PreparedStatement和Statement

SQL 
阅读更多

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

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

       1.没有SQL注入的问题。

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

       3.数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库连接没有关

闭的情况下有效)。

 

public void read(String name) throws SQLException {

              Connection conn = null;

              PreparedStatement ps = null;

              ResultSet rs = null;

              try {

                     // 2.建立连接

                     conn = JdbcUtils.getConnection();

 

                     // conn = JdbcUtilsSing.getInstance().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);

              }

       }

 

       public void read1(String name) throws SQLException {

              Connection conn = null;

              Statement st = null;

              ResultSet rs = null;

              try {

                     // 2.建立连接

                     conn = JdbcUtils.getConnection();

                     // conn = JdbcUtilsSing.getInstance().getConnection();

 

                     // 3.创建语句

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

                                   + name + "'";

                     st = conn.createStatement();

                     // 4.执行语句

                     rs = st.executeQuery(sql);

 

                     // 5.处理结果

                     while (rs.next()) {

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

                            // + rs.getObject("name") + "\t"

                            // + rs.getObject("birthday") + "\t"

                            // + rs.getObject("money"));

                     }

              } finally {

                     JdbcUtils.free(rs, st, conn);

              }

       }

对于read1()方法,若传入的name' or 1 or '则会把数据库里所有记录都查询出来。而read()用的PerparedStatement就不会出显这种情况。

分享到:
评论

相关推荐

    java中PreparedStatement和Statement的区别

    Java 中的 PreparedStatement 和 Statement 都是用于执行 SQL 语句的接口,但是它们之间存在一些关键的区别。 首先,从数据库执行 SQL 语句的角度来看,使用 PreparedStatement 语句可以提高数据库访问的效率。这是...

    如何获得PreparedStatement最终执行的sql语句

    当我们处理大量重复的SQL操作时,使用`PreparedStatement`可以避免SQL注入等问题,同时提升性能。这篇博客可能是探讨如何在实际运行中获取`PreparedStatement`最终执行的SQL语句,这对于调试和分析数据库操作非常有...

    Statement和PreparedStatement之间的区别

    Statement和PreparedStatement之间的区别 Statement和PreparedStatement是JDBC中的两种不同的语句对象,用于执行数据库操作。虽然它们都可以执行SQL语句,但是它们之间存在着很大的区别。 首先, Statement对象...

    Java防止SQL注入的几个途径

    如果使用 PreparedStatement 来代替 Statement 来执行 SQL 语句,其后只是输入参数,SQL 注入攻击手段将无效。这是因为 PreparedStatement 不允许在不同的插入时间改变查询的逻辑结构,大部分的 SQL 注入已经挡住了...

    PreparedStatement和Statement

    - **安全性**:`PreparedStatement`通过占位符防止SQL注入,而`Statement`则容易受到这类攻击。 - **可读性**:`PreparedStatement`的参数化使得代码更易读,因为SQL逻辑和数据值分离。 - **动态SQL**:`...

    SQL注入源码+SQL注入命令

    标题中的"SQL注入源码+SQL注入命令"提示我们将探讨实际的源代码片段和可能的注入命令。在Java应用中,通常使用JDBC(Java Database Connectivity)来与MySQL这样的数据库进行交互。当开发者没有对用户输入的数据进行...

    如何解决sql注入问题

    Java开发人员使用JDBC(Java Database Connectivity)连接到Oracle数据库时,应该优先使用`PreparedStatement`和`CallableStatement`,而不是`Statement`。这是因为前两者提供了参数化查询的支持,能够有效抵御SQL...

    防止sql注入解决方案

    可以配置WAF来检测和阻止SQL注入攻击,它可以根据已知的攻击模式进行过滤。 9. **定期更新与修补**: 保持数据库管理系统和应用程序框架的最新版本,及时修补已知的安全漏洞。 10. **安全编码训练**: 对开发...

    如何防止sql注入【转载】

    例如,使用 PreparedStatement 代替 Statement,可以避免 SQL 注入攻击。预编译语句还可以提高性能和可维护性。 其次,使用正则表达式可以检测 SQL meta-characters,从而防止恶意代码的注入。例如,可以使用正则...

    java防止SQL注入

    PreparedStatement preState = conn.prepareStatement(sql); preState.setString(1, userName); preState.setString(2, password); ResultSet rs = preState.executeQuery(); 2. 采用正则表达式 可以使用正则表达式...

    防止sql注入demo

    SQL注入是由于应用程序未能正确验证和清理用户输入的数据导致的。当用户提交的输入被直接拼接到SQL查询中时,攻击者可以构造特定的字符串来操纵查询的逻辑。例如,一个简单的登录表单可能接收用户名和密码,但如果...

    【IT十八掌徐培成】Java基础第23天-02.sql注入-preparedstatement-批量插入.zip

    总结来说,了解并掌握SQL注入的危害以及PreparedStatement的使用,是每个Java开发者必备的安全意识和技术。同时,熟练运用PreparedStatement的批量插入功能,可以有效地提高数据库操作的效率,尤其在处理大数据量...

    Jsp防SQL注入

    在JSP(Java Server Pages)开发中,防止SQL注入至关重要,因为它可以保护用户数据的完整性和系统的安全性。本文将详细介绍如何在JSP中防范SQL注入。 ### 1. 理解SQL注入原理 SQL注入是通过在用户输入的数据中插入...

    【IT十八掌徐培成】Java基础第23天-02.sql注入-preparedstatement-批量插入 - 副本.zip

    总的来说,PreparedStatement和批量插入是Java数据库操作中的重要技巧,它们既能有效防止SQL注入攻击,又能提高程序运行效率。在开发过程中,我们应该养成使用PreparedStatement和批量插入的良好习惯,以确保代码的...

    SQL注入+JSP+HTML+JavaBean

    1. **预编译SQL(PreparedStatement)**:使用PreparedStatement可以有效地防止SQL注入,因为它自动转义特殊字符,例如: ```java String username = request.getParameter("username"); PreparedStatement pstmt...

    4、SQL注入漏洞pdf资料

    要防御SQL注入,需要对用户输入数据进行严格的检查和过滤,使用参数化查询语句来代替字符串拼接的方式,并且对数据库进行权限控制,限制用户的访问权限。 五、SQL注入的实例 例如,一个Web应用程序使用SQL语句来...

    SQL注入源码

    1. **预编译语句(PreparedStatement)**:使用PreparedStatement可以有效地防止SQL注入,因为它会将用户输入的数据作为参数处理,而不是直接拼接到SQL语句中。例如: ```java String sql = "SELECT * FROM users ...

    jsp 防止sql注入jsp 防止sql注入

    使用预编译的SQL语句(例如PreparedStatement)是防止SQL注入的最佳实践。这种方式将SQL语句与用户输入的数据分离,确保即使用户输入恶意代码,也不会影响到查询结构。例如: ```java String query = "SELECT * ...

    Java-JDBC【源码】JDBC概述、获取连接、SQL注入问题与解决、查询解析

    Java-JDBC【之】JDBC概述、获取连接、SQL注入问题与解决、查询...3.SQL注入问题与解决(Statement 、PreparedStatement) 3.1.模拟SQL注入 3.2.PreparedStatement解决 3.3.Statement 与 PreparedStatement 4.完整源码

Global site tag (gtag.js) - Google Analytics