首页
关于
Search
1
sql的注入原因和解决办法
145 阅读
2
SpringBoot整合腾讯云存储COS及基本使用,增删改查......
129 阅读
3
深究contains方法
100 阅读
4
多线程概述
74 阅读
5
学习的第一个注解@WebServlet - JavaWeb
73 阅读
默认分类
Java
C/C++
Mysql
JavaWeb
SpringBoot
算法
前端
Linux
Search
标签搜索
Spring
HTTP
Java
JavaWeb
IOC
mybatis
腾讯云
COS
云存储
CDN
redis
分布式
id
全局唯一id
Typecho
累计撰写
26
篇文章
累计收到
3
条评论
首页
栏目
默认分类
Java
C/C++
Mysql
JavaWeb
SpringBoot
算法
前端
Linux
页面
关于
搜索到
4
篇与
Mysql
的结果
2022-04-30
sql的注入原因和解决办法
sql注入原因:sql注入的根本原因是用户输入的信息中含有sql语句的关键字,并且这些关键字参与了sql语句的编译过程,导致sql的原意被扭曲,进而达到sql注入。例如以下查询方法。 //该方法查询数据库是否有此账号密码,返回一个布尔值 private static boolean userQuery(String userName, String userPassword) { boolean flag = false; Connection conn = null; Statement stmt = null; ResultSet rs = null; try { conn = DBUtils.getConnection(); stmt = conn.createStatement(); //执行sql语句 String sql = "select * from userinfo where userName='"+userName+"' and userPassword='"+userPassword+"'"; rs = stmt.executeQuery(sql); if (rs.next()) flag = true; } catch (SQLException throwables) { throwables.printStackTrace(); }finally { DBUtils.close(conn,stmt,rs); } return flag; }用一个变量接收用户输入的密码,如果接收到的是一个正常的密码:123456,那么拼接后的sql语句就是正常的。select * from userinfo where userName='王五' and userPassword='123456'但是如果接收到的密码不是一个正常的密码,而是 abc' or '1'='1。这样的不正常密码带有sql的关键字or,再加上巧妙的组合,最终会使拼接后的sql语句就是这样的。分析以下sql的条件语句:因为or后面的条件 '1'='1' 是永远是正确的,所以前面的条件userName='123' and userPassword='abc' 可以无视。即使用户输入的账号密码不正确或者不存在,这条sql语句也会正常成功执行。且有返回值。select * from userinfo where userName='123' and userPassword='abc' or '1'='1'解决sql注入解决方法:只要用户输入的信息不参与sql语句的编译过程,问题就解决了。首先,将Statement接口改成子接口PreparedStatement。在编写sql语句的时候,在关键位置用 "?" 占位,这里吧?叫做占位符在JDBC第三步,获取数据库操作对象的时候,传入sql语句。这步是把sql预处理,也就是搭起sql语句的框架。下一步使用setString方法设置占位符对应的关键字。索引从1开始。注意:字符串用setString() , int类型数据用setInt()最后,执行sql就ok。不过还要注意,此时已经不需要传入sql语句,因为前面的预编译和设置占位就已经完成了。修改后的jdbc过程。//该方法查询数据库是否有此账号密码 private static boolean userQuery(String userName, String userPassword) { Connection conn = null; //将Statement接口改成PreparedStatement接口,这俩是继承关系。 PreparedStatement stmt = null; ResultSet rs = null; boolean flag = false; try { conn = DBUtils.getConnection(); //1.在sql语句的关键位置用?占位。 String sql = "select * from userinfo where userName=? and userPassword=?"; //2.预编译sql,也就是按处理好sql的框架 stmt = conn.prepareStatement(sql); //3.setString方法设置占位符对应的关键字,索引从1开始 stmt.setString(1,userName); stmt.setString(2,userPassword); //4.执行查询,但是这里不需要传sql rs = stmt.executeQuery(); if (rs.next()) flag = true; } catch (SQLException throwables) { throwables.printStackTrace(); } finally { DBUtils.close(conn,stmt,rs); } return flag; }虽然Preparedment的操作多一点,但是安全。因为它是先把带有 "?" 占位符的sql语句先编译了,然后通过setString方法在传入占位符对应的值,这样做即使传入的值带有mysql的关键字也没事,因为此时的sql语句已经预编译了,后面传入的值没有参与编译过程。如果用户还是传入不规范的数据,则sql执行会报错。
2022年04月30日
145 阅读
1 评论
1 点赞
2022-04-30
Servlet JDBC两种注册驱动的方法
第一种用java.sql.DriverManager下的registerDriver( ) 方法注册驱动。传入一个Driver()对象即可。// 1. 注册驱动 Driver driver = new Driver(); DriverManager.registerDriver(driver); //合写成一句 DriverManager.registerDriver(new Driver());第二种Class.forName("com.mysql.jdbc.Driver");第二种是较为常用的,因为比较简单。原理:先看一下Driver()方法的源码。在第五行有一个静态方法,静态方法里执行了注册驱动的语句。所以第二种方法的原理是:反射这个类com.mysql.jdbcDriver,使这个类的静态代码块执行,驱动就注册成功了public class Driver extends NonRegisteringDriver implements java.sql.Driver { public Driver() throws SQLException { } static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } } }用第二种方式注册驱动的完整JDBC代码 - 查public class Query { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //获取数据库连接 String url = "jdbc:mysql://127.0.0.1:3306/userdb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true"; String user = "root"; String password = "123456"; conn = DriverManager.getConnection(url, user, password); //获取数据库操作对象 stmt = conn.createStatement(); //执行sql语句 String sql = "select * from userinfo"; rs = stmt.executeQuery(sql); //处理结果集 while (rs.next()){ String value = rs.getString("userId")+", "+rs.getString("userName"); System.out.println(value); } } catch (SQLException throwables) { throwables.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }finally { //关闭连接 if (rs != null) { try { rs.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (stmt != null) { try { stmt.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } } }
2022年04月30日
48 阅读
0 评论
0 点赞
2022-04-30
Servlet JDBC六步
网上有把步骤分为七步的,其实就是把准备数据库账号密码地址又分为了一个步骤六步注册驱动告诉数据库,即将来凝结哪个品牌的数据库获取连接表示jvm的进程和数据库进程之间的通道打开了。获取数据库操作对象、专门执行sql语句的对象执行sql语句DQL和DML处理查询结果集只有当第四步执行的时select语句的时候,才有第五步查询结果集。释放资源java和数据库之间属于进程间的通信,开启后一定要关闭。注意:只有查询操作才有第五步。因为查询外的操作只是返回"影响的行数",只需要用int类型变量接收就可以了。而查询操作返回的是一个ResultSet结果集,需要额外处理。查先提前获取所需对象Connection conn = null; Statement stmt = null; ResultSet rs = null;注册驱动// 1. 注册驱动 Driver driver = new Driver(); DriverManager.registerDriver(driver); //合写成一句 DriverManager.registerDriver(new Driver());获取数据库连接//先获取数据库url和账号密码 String url = "jdbc:mysql://127.0.0.1:3306/userdb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true"; String user = "root"; String password = "123456"; //注册驱动 conn = DriverManager.getConnection(url,user,password);获取数据库操作对象Statement stmt = conn.createStatement();执行sql语句。该语句为查询操作,执行完后需接收结果String sql = "select * from userinfo"; ResultSet rs = stmt.executeQuery(sql);处理结果集while (rs.next()){ String value = rs.getString("userId")+", "+rs.getString("userName"); System.out.println(value); }释放数据库连接。查询操作有三个对象,需要分开关闭,并且处理异常。if (rs != null){ try { rs.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(stmt != null){ try { stmt.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(conn != null){ try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } }增删改第四步:执行sql增删改语句的返回值是”影响的行数“,int类型变量接收即可。if接收到的变量是否为一就可以知道是否执行成功。int count = statement.executeUpdate(sql); System.out.println(count==1?"成功":"失败");六步完整代码public class Query { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { //注册驱动 DriverManager.registerDriver(new Driver()); //获取数据库连接 String url = "jdbc:mysql://127.0.0.1:3306/userdb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true"; String user = "root"; String password = "123456"; conn = DriverManager.getConnection(url, user, password); //获取数据库操作对象 stmt = conn.createStatement(); //执行sql语句 String sql = "select * from userinfo"; rs = stmt.executeQuery(sql); //处理结果集 while (rs.next()){ String value = rs.getString("userId")+", "+rs.getString("userName"); System.out.println(value); } } catch (SQLException throwables) { throwables.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }finally { //关闭连接 if (rs != null) { try { rs.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (stmt != null) { try { stmt.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } } }五步完整代码public class Insert { public static void main(String[] args) { Connection conn = null; Statement statement = null; try { // 1. 注册驱动 DriverManager.registerDriver(new Driver()); // 2. 获取连接 String url = "jdbc:mysql://127.0.0.1:3306/userdb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true"; String user = "root"; String password = "123456"; conn = DriverManager.getConnection(url,user,password); // 3. 获取数据库操作对象 statement = conn.createStatement(); // 4. 执行sql语句 String sql = "insert into userinfo(userId, userName, gender, roleId, userPassword) values('user10', 'achong', 1,1,'123123')"; int count = statement.executeUpdate(sql); System.out.println(count); System.out.println(count==1?"成功":"失败"); } catch (SQLException throwables) { throwables.printStackTrace(); }finally { // 6. 释放资源 if (statement != null){ try { statement.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if (conn != null){ try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } } }
2022年04月30日
44 阅读
0 评论
0 点赞
2022-03-23
Mysql常用基础语句
持续更新......选择某表;USE test01;创建表后,添加主键约束;ALTER TABLE `user` ADD CONSTRAINT pk_id PRIMARY KEY(`id`);删除主键约束,不需要指定字段;ALTER TABLE `person1` DROP PRIMARY KEY;添加联合主键;ALTER TABLE `person1` ADD PRIMARY KEY (`uid`,`pid`);创建表后,添加外键约束;alter table 从表 add [constraint] 外键名称 foreign key (从表外键字段名) references 主表(主表的主键);ALTER TABLE `userInfo` ADD CONSTRAINT userInfo_user_fk FOREIGN KEY(`id`) REFERENCES `user`(`id`);删除外键约束,需要指定外键名称;ALTER TABLE `userInfo` DROP FOREIGN KEY userInfo_user_fk;增---------------------------------------------------------------------;创建表;CREATE TABLE person1( `uid` CHAR(12) NOT NULL, `pid` CHAR(12) NOT NULL, `text` CHAR(50) );插入数据;INSERT INTO user1(NO,NAME) VALUE ("125","achong");插入多行数据;INSERT INTO user1(NO,NAME) VALUE ("125","achong1"),("126","achong2"),("127","achong3"); INSERT INTO userInfo(id, address, phone) VALUE ("125","广东省清远市111",10001), ("126","广东省清远市222","10002"), ("127","广东省清远市333","10003");添加字段;ALTER TABLE user1 ADD `phone`CHAR(11);创建数据库create database userdb;删--------------------------------------------------------------------;删除某表;DROP TABLE user22;删除某行;DELETE FROM person1 WHERE `text`= "qwe00";删除表中所有行对比delete,truncate table的执行熟读更快,使用的系统资源和事务日志资源更少,并且删除数据后的标识列会重新开始编号。truncate table t_user;改--------------------------------------------------------------------;修改表名;ALTER TABLE `user1` RENAME `user`;修改字段,连同字段的属性都需要修改;ALTER TABLE user1 CHANGE `phone` `sex`CHAR(1);更新表数据update dept set loc='SH' where deptno=30;查--------------------------------------------------------------------;查询所有数据库;SHOW DATABASES; 查看所有表;SHOW TABLES;查看表结构;DESC `userInfo`;查询表数据;SELECT * FROM `userInfo`; SELECT * FROM `person1`;
2022年03月23日
46 阅读
0 评论
0 点赞