`
jgnan
  • 浏览: 88889 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JAVA简单教程:数据库操作(三)——PreparedStatement和动态SQL

阅读更多
如果我们的SQL语句是固定的,但是参数会不断变化,那我们要怎么办呢?

首先看看以下的处理方式:
statement.executeQuery("select * from user where userid = "+userInputId);


看起来我们是解决了我们的需要,但是其实这种写法会带来很严重的问题。

加入我们的userInputId是1 or 1=1,那么上面的SQL就会编程:
select * from user where userid = 1 or 1=1

这样,无论userid 为多少,我们都会返回所有用户记录。

这种动态SQL会造成我们著名的SQL注入(SQL Injection)的安全漏洞。这种漏洞除了可以窃取你的数据库记录外,严重的时候更能够破坏你的数据库结构,让你的数据库彻底毁掉。例如:
statement.execute("insert int user values(......"+userInput+")");

如果userInput是:
null);delete from user;--
那么,就会执行两条SQL命令,第一条就是创建一个user记录,第二条就会把所有user记录删掉!!

为了解决这种参数会变化但是SQL结构固定的动态SQL语句,jdbc提供了PreparedStatment这种操作方式:

java.sql.PreparedStatement ps = conn.preparedStatement("select * from user where userid = ?");

...

ps.setInt(1,userInputId);
ResultSet rs = ps.executeQuery();
...


这个接口会自动把一些非法字符串进行转换,防止用户串改操作语句。

而且使用PreparedStatement还有利于提高数据库效率,对于数据库,执行以下的两条SQL:
select * from user where userid = 1
select * from user where userid = 2
它会视为两条不同的SQL来执行,并且把执行过程分别存储起来,但是对于preparedStatement,它会记录:
select * from user where userid = ?
每次会根据参数返回操作结果,无论执行多少次都只会保留一份操作副本,能够有效节省数据库的编译SQL性能。

但是PreparedStatement也不是万能,假如我们的变化不是限制在参数上,就有问题,例如我们获取的数据表可能是动态的,或者where条件是动态的。那么我们怎么来处理这种情况并且有效防止SQL Injection呢?
很简单,但是却比较麻烦,就是限制用户的输入,并且不要直接把用户输入直接作为SQL凭借部分。

应用实例:
根据用户输入读取不同数据表的所有信息,要求:
用户输入:user时,获取所有用户表信息(user表)
用户输入:org时,获取所有组织信息(org表)
用户输入其它信息:返回所有新闻记录(news表)

实现:
String sql = "select * from news";
if(userInput != null && userInput.equalsIgnoreCase("user"))
    sql = "select * from user";
if(userInput != null && userInput.equalsIgnoreCase("org"))
    sql = "select * from org";


利用这种方法和PreparedStatement就能够有效防止SQL注入。

无论日后是否使用ORM工具来操作数据库,都必须小心不要造成SQL注入漏洞,否则后果不堪设想。
分享到:
评论

相关推荐

    适用SQL Server 2016版本的数据库加载驱动包——sqljdbc42.jar

    `sqljdbc42.jar`是一个Java数据库连接(JDBC)驱动包,专为与SQL Server 2016配合使用而设计。JDBC是Java平台的一部分,允许Java开发者通过编写Java代码来访问和处理关系数据库。驱动包中的类和接口实现了JDBC规范,...

    java大作业:用java语言实现数据库的底层实现

    总之,这个Java大作业将涵盖数据库基础、JDBC使用、SQL语句编写、面向对象封装等多个核心知识点,对于提升Java程序员的技能和理解数据库操作有着极大的帮助。通过实际操作,你将能够更好地掌握这些概念,并能灵活地...

    java连sqlserver数据库详细解析哦

    本文将深入探讨如何使用Java API(如JDBC)来连接到SQL Server数据库,并提供详细的步骤和示例代码。 首先,我们需要了解Java Database Connectivity (JDBC),这是Java标准库中的一个API,用于与各种类型的数据库...

    JDBC数据库连接所用JAR包——包括SQL Server和MySQL的

    接下来,`msbase.jar`、`mssqlserver.jar`和`msutil.jar`这三个JAR文件主要用于连接SQL Server。它们属于Microsoft提供的JDBC驱动,也被称为JDBC Type 4驱动。这些JAR包允许Java应用程序通过纯Java实现与SQL Server...

    JAVA之连接MySQL数据库——源码下载

    在Java编程中,连接MySQL数据库是一项基础且重要的任务,它使得Java应用程序能够与数据库进行交互,执行查询、更新等操作。本教程将详细介绍如何使用Java的JDBC(Java Database Connectivity)API来实现这一功能。 ...

    java开发实战1200例:91——120例的源代码

    10. **数据库操作**:如果包含JDBC相关代码,将涉及数据库连接、SQL查询、结果集处理等,可能是通过PreparedStatement或Statement执行SQL语句。 11. **GUI编程**:Java Swing或JavaFX库可用于构建图形用户界面,...

    数据库作业 JAVa 嵌入式SQL

    在IT领域,数据库管理和Java编程是两个至关重要的概念,它们之间的结合——Java嵌入式SQL,使得开发者可以在Java程序中直接执行SQL语句,实现对数据库的高效操作。本作业着重探讨了如何在Java应用程序中使用SQL进行...

    数据库——清华大学PPT

    【数据库——清华大学PPT】这份资料主要讲解了Java数据库连接的相关知识,适合初学者了解Java在数据库操作中的应用。在Java 2平台企业版(J2EE)的框架下,数据库连接是构建分布式应用程序的关键部分,它涉及到...

    JAVA_mysql,sqlserver,Oracle数据库连接jar

    这里我们关注的是三个主要的数据库管理系统(DBMS)——MySQL、SQL Server和Oracle,以及它们对应的Java数据库连接(JDBC)驱动。这些驱动允许Java应用程序通过Java API来执行SQL查询和管理数据库。 1. **MySQL...

    sql server驱动sqljdbc.jar和sqljdbc4.jar

    SQL Server驱动是Java应用程序连接Microsoft SQL Server数据库的关键组件。在Java环境中,我们通常使用JDBC(Java Database Connectivity)来实现数据库的访问。SQL Server提供的驱动主要有两种:sqljdbc.jar和sql...

    java+sql.rar_SQL java_java s_java sql_java sql 简单_java.sql.

    在IT领域,数据库管理和操作是不可或缺的一部分,而Java作为广泛应用的编程语言,提供了与数据库交互的强大工具——Java Database Connectivity(JDBC)。本文将深入探讨如何使用Java和SQL进行数据库操作,以及JDBC...

    DBUtil——连接SQL (JDBC使用)

    本教程将围绕"DBUtil",一个简单的JDBC工具类,来介绍如何使用配置文件进行SQL连接和数据库的基本操作。这个工具类适用于初学者学习数据库连接管理。 首先,我们来看"db.properties"文件,这是用来存储数据库连接...

    java实现mysql数据库的表导出到excel文件

    在IT行业中,将数据库数据导出到Excel文件是一种常见的需求,尤其在数据分析、报表生成或者数据...这个简单的Java程序演示了如何结合JDBC和Apache POI进行数据库与文件系统的交互,对于开发人员来说是一项实用的技能。

    基于java的分离SQL Server数据库.zip

    在IT行业中,Java是一种广泛应用的编程语言,尤其在企业级应用和数据库操作方面。本话题主要探讨如何使用Java来分离SQL Server数据库,这通常涉及到数据迁移、备份或复制等场景。下面将详细介绍这个过程涉及的关键...

    JAVA数据库基本操作,增删改查

    ### JAVA数据库基本操作:增删改查 在Java开发中,与数据库进行交互是一项非常重要的技能。无论是构建简单的Web应用还是复杂的企业级系统,开发者都需要掌握如何通过Java代码执行SQL命令来实现数据的增删改查操作。...

    使用SQL2005数据库——简单登陆注册

    本示例将详细讲解如何利用SQL Server 2005(SQL2005)数据库与JavaServer Pages (JSP) 技术相结合,构建一个简单的登录注册系统。这个系统可以帮助初学者理解JSP与数据库交互的基本原理,同时掌握用户验证的关键步骤...

    sqljdbc (连接sql server数据库的驱动)

    SQLJDBC驱动是微软提供的一个Java数据库连接(JDBC)驱动程序,专门用于与Microsoft SQL Server数据库进行交互。它是Java应用程序连接SQL Server的关键组件,使得开发者可以使用Java语言执行SQL查询、更新数据库记录...

    java连接oracle数据库———sqlHelper类

    在Java编程中,连接Oracle数据库是一项常见的任务,用于执行SQL查询、更新和其他数据库操作。`sqlHelper`类是一个自定义的工具类,旨在简化这个过程,提供一个方便、高效的接口来处理数据库交互。本篇文章将深入探讨...

    小型超市管理系统(数据库+Java。数据库是用SQL SERVER2008实现的)

    通过阅读和分析这些源代码,学习者可以更直观地理解Java数据库编程的细节,如如何构造SQL语句、如何处理结果集以及如何实现事务控制等。 总之,这个小型超市管理系统是一个实用的学习资源,它将Java编程语言与SQL ...

    java数据库连接的一段代码

    ### Java数据库连接(JDBC)详解 #### 一、引言 在Java开发中,与数据库进行交互是一项非常常见的任务。为了实现这一目标,Java提供了一套标准的API——Java Database Connectivity (JDBC),用于访问关系型数据库。...

Global site tag (gtag.js) - Google Analytics