- 1、本文档共71页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ch04JDBC编程技术剖析
现有一个Login页面用来控制WebApp的入口,用户想要进入只有输入“用户名”和“密码”,负责用户登录处理的Servlet接受到请求后,将看数据表usertable中是否存在这个用户名和密码,如果存在则让其进入,否则拒绝,进行验证的SQL语句如下: select?count(*)?from?usertable?where?name=‘用户名’?and?pswd=‘密码’ SQL注入攻击 如果用户通过某种途径知道或是猜测出了验证SQL语句的逻辑,他就有可能在表单中输入特殊字符改变SQL原有的逻辑,比如在名称文本框中输入“ ‘ or ’1‘=’1‘ or ’1‘=’1 ”或是在密码文本框中输入“ 1‘ or ’1‘=’1 ”,SQL语句将会变成: select?count(*)?from?usertable?where?name=?or?1=1?or?1=1??and?pswd=1?or?1=1? 明显,or和单引号的加入使得where后的条件始终是true原有的验证完全无效了。 SQL注入攻击 2、如何使用PreparedStatement 第1步:通过连接获得PreparedStatement对象,用带占位符(?)的构造sql语句。 PreparedStatement cmd = con.preparedStatement( “select * from Students where sname=?”); 第2步:设置输入参数值 。一定要在执行sql语句前设置值。 cmd.setString(1,张三);//1表示从左到右数的第一个参数,张三是为第一个参数设置的值,如果还有其它参数需要一个一个赋值。 第3步:执行sql语句 rs = cmd.excuteQuery(); Statement发送完整的Sql语句到数据库不是直接执行而是由数据库先编译,再运行。每次都需要编译。而PreparedStatement是先发送带参数的Sql语句,由数据库先编译,再发送一组组参数值。 【例3】使用PreparedStatement对象对xscj数据库中的xs表中添加记录。 元数据最本质、最抽象的定义为:data about data (关于数据的数据)。它是一种广泛存在的现象,在许多领域有其具体的定义和应用。简单的说元数据就是关于数据的数据或关于信息的信息。例如:书的文本就是书的数据,而书名、作者、版权数据都是书的元数据。一般数据库系统用他来表示数据的信息,例如数据的类型,长度,存放位置等关于数据的信息用来管理和维护数据。元数据的使用,可以大大提高系统的检索和管理的效率。连接和结果集的大量信息可以从元数据对象中得到,JDBC提供了两个元数据对象类型DatabaseMetaData和ResultSetMetaData。 JDBC通过元数据(MetaData)来获得具体的表的相关信息,例如,可以查询数据库中有哪些表,表有哪些字段,以及字段的属性等。MetaData中通过一系列getXXX将这些信息返回给我们。 数据库元数据 Database MetaData 用connection.getMetaData()获得;包含了关于数据库整体元数据信息。 结果集元数据 ResultSet MetaData 用resultSet.getMetaData()获得;比较重要的是获得“表”的列名,列数等信息。 1、结果集元数据对象:ResultSetMetaData meta = rs.getMetaData(); 字段个数:meta.getColomnCount(); 字段名字:meta.getColumnName(); 字段JDBC类型:meta.getColumnType(); 字段数据库类型:meta.getColumnTypeName(); 2、数据库元数据对象:DatabaseMetaData dbmd = con.getMetaData(); 数据库名:dbmd.getDatabaseProductName(); 数据库版本号:dbmd.getDatabaseProductVersion(); 数据库驱动名:dbmd.getDriverName(); 数据库驱动版本号:dbmd.getDriverVersion(); 数据库Url:dbmd.getURL(); 该连接的登陆名:dbmd.getUse
文档评论(0)