如何防止SQL注入

目录

SQL注入

1、 什么是SQL注入

2、 避免SQL注入

PreparedStatement【重点】


SQL注入

1、 什么是SQL注入

select * from tb_user where username = '111' and password = '111'select * from tb_user where username = '111' and password = '111' or '1=1'

用户输入的数据中有SQL关键词,导致在执行SQL语句时出现一些不正常的情况.这就是SQL注入!


出现SQL注入是很危险

image-20230322084643699

2、 避免SQL注入

问题出现在用户输入数据时,里面有关键词,再配合字符串拼接导致出现SQL注入.所以为了避免SQL注入,可以在用户输入数据到SQL之前,先把SQL语句预编译,预处理后,JDBC就会知道此SQL需要几个参数,后续再将用户输入的数据给参数填充.

这就是PreparedStatement

PreparedStatement【重点】

PreparedStatement是Statement的子接口,用来预处理SQL语句

PreparedStatement使用

  • 先写SQL语句,SQL语句中的参数不能直接拼接,而是使用?占位

  • 使用ps预处理SQL语句,处理的?号,ps内部就会知道此SQL语句需要几个参数

  • 再动态给?处填充值

  • 执行sql

image-20230322084657336

public class Demo3 {
​public static void main(String[] args) throws Exception {
​// 1加载驱动// 2获得连接Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2311?useSSL=false", "root", "123456");
​// 3获得[预处理语句]对象/*** 使用预处理对象有步骤* 1 先写sql,语句中需要拼接参数的地方用?占位* 2 通过连接对象,调用处理语句的方法,传入sql参数,对语句处理后*   获得一个含有处理过sql的语句对象* 3 给处理过的?处赋值* 4 执行*/String sql = "select * from tb_user where username = ? and password = ?";System.out.println("处理前:" + sql );PreparedStatement ps = conn.prepareStatement(sql);System.out.println("处理后:" + ps );// 3 给?赋值ps.setString(1,"uzi");ps.setString(2,"123456");System.out.println("赋值后:" + ps );
​// 4执行sql语句ResultSet rs = ps.executeQuery( );// 【特别注意: 不需要再传参数】while(rs.next()) {User user = new User( );user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));user.setPhone(rs.getString("phone"));user.setCreateTime(rs.getDate("create_time"));user.setMoney(rs.getDouble("money"));user.setSex(rs.getInt("sex"));
​System.out.println(user );}
​// 5关流rs.close();ps.close();conn.close();}
}

使用预处理语句改造登录案例

public class Demo4_login_plus {
​public static void main(String[] args) {input();}
​// 设计方法完成输入public static void input() {System.out.println("欢迎登录LPL选手管理系统" );Scanner scanner = new Scanner(System.in);System.out.println("请输入用户名:" );String username = scanner.nextLine( );System.out.println("请输入密码:" );String password = scanner.nextLine( );
​User user = login(username, password);
​if (user != null) {System.out.println("欢迎进入系统:" + user );} else {System.out.println("用户名或密码错误!" );}
​}
​
​public static User login(String username,String password){Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;User user = null; // 初始值try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2311?useSSL=false", "root", "123456");// 1 先写sql,条件写?String sql = "select * from tb_user where username = ? and password = ?";// 2 获得预处理语句对象ps = conn.prepareStatement(sql);// 3 给?赋值ps.setString(1,username);ps.setString(2,password);System.out.println(ps );// 4 执行rs = ps.executeQuery( );while (rs.next()) {user = new User();user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));user.setPhone(rs.getString("phone"));user.setCreateTime(rs.getDate("create_time"));user.setMoney(rs.getDouble("money"));user.setSex(rs.getInt("sex"));}} catch (Exception e) {e.printStackTrace();} finally {try {rs.close();ps.close();conn.close();}catch (Exception e) {e.printStackTrace();}}return user;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/429846.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java日志框架之Log4j

文章目录 一、Log4j简介二、Log4j组件介绍1、Loggers (日志记录器)2、Appenders(输出控制器)3、Layout(日志格式化器) 三、Log4j快速入门四、Log4j自定义配置文件输出日志1、输出到控制台2、输出到文件3、输出到数据库 五、Log4j自…

【HTTPS】中间人攻击和证书的验证

中间人攻击 服务器可以创建出一堆公钥和私钥,黑客也可以按照同样的方式,创建一对公钥和私钥,冒充自己是服务器(搅屎棍) 黑客自己也能生成一对公钥和私钥。生成公钥和私钥的算法是开放的,服务器能生产&…

基于阿里云免费部署Qwen1-8B-chat模型并进行lora参数微调从0到1上手操作

文章目录 一、申请资源二、创建实例三、克隆微调数据四、部署Qwen1-8B-chat模型1、环境配置2、模型下载3、本地模型部署 五、模型微调1、拉取Qwen仓库源码2、微调配置3、合并微调参数4、本地部署微调模型 一、申请资源 阿里云账号申请PAI资源详细教程我已于部署ChatGLM3时写过…

MAC如何获取文件数字签名和进程名称

1、安装需要查看数字签名和进程名称的软件包 2、打开终端命令行(Terminal) 3、查找数字签名 在终端命令行中输入: codesign -dvv 安装的软件路径 2>&1 | grep "Authority" | head -n 1 | cut -d -f2”回显即为进程的数…

Unity 百度AI实现无绿幕拍照抠像功能(详解版)

目录 一、前言 1.抠像效果 2.去哪找百度ai抠图 3.基础流程跳过 二、获取AccessToken 1.什么是Token 2.为什么要获取Token 3.如何获取token 4.解析json 5.完整代码 三、抠像 1.准备地址 2.建立链接,和基本配置 3.图片格式转换 4.开始上传 5.获取回复…

Highcharts甘特图基本用法(highcharts-gantt.js)

参考官方文档: https://www.highcharts.com/docs/gantt/getting-started-gantt https://www.highcharts.com/demo/gantt/project-management https://www.hcharts.cn/demo/gantt 链接在下面按需引入 https://code.highcharts.com/gantt/highcharts-gantt.js htt…

[笔记]23年度展会信息— 吊钩 起升机构

1.吊钩的规格参数 5吨吊钩重26公斤 10吨64公斤。 另外一套型号,更轻: 不确定是结构设计还是用钢材质达到了减重效果。 看看重载双滑轮吊钩: 50吨,400公斤,只是吊钩。 然后是行车吊钩与钢丝绳的直径。这在计算空载吊…

faiss安装 (CPU版本)

faiss版本 faiss-v1.7.4 cd faiss-v1.7.4cmake -B build . -DBUILD_TESTINGOFF -DFAISS_ENABLE_GPUOFF -DFAISS_ENABLE_PYTHONOFFmake -C build -j faiss; 默认安装路径如下 -- Installing: /usr/local/lib64/libfaiss.a -- Installing: /usr/local/include/faiss…

耦合微带线单元的网络参量和等效电路公式推导

文档下载链接:耦合微带线单元的网络参量和等效电路资源-CSDN文库https://download.csdn.net/download/lu2289504634/89583027笔者水平有限,错误之处欢迎留言! 一、耦合微带线奇偶模详细推导过程 二、2,4端口开路 三、2端口短路、3端口开路 四…

LeetCode 热题 100 回顾16

干货分享,感谢您的阅读!原文见:LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 (简单) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标…

win系统接入google_auth实现动态密码,加强保护

开源代码地址:windows动态密码: 针对win服务器进行的动态密码管控,需要配合谷歌的身份认证APP使用 (gitee.com) 为什么要搞个动态密码呢? 首先云服务器启用了远程访问,虽然更换了端口以及初始用户名,不过还是是不是被…

CleanClip For Mac 強大的剪貼簿助手Paste替代工具 v2.2.1

软件介绍: CleanClip是一款专为Mac设计的强大剪贴板管理工具,旨在提升用户的工作效率和生产力。这款应用完全采用原生Swift编写,为Mac用户提供了流畅、快速且直观的使用体验。CleanClip不仅支持文本内容的管理,还能处理图片、文件…

锂电池基础知识

1. 电池的发展史 电池是将化学能转变为电能的装置,通过电池内部的化学反应向外部提供直流电能 1800年Vote伏打电堆 1835年英国Daniel丹尼尔电池 1859年法国Plante铅酸蓄电池 1866年法国Leclanche锌锰电池 1899年瑞典Jungner镍镉电池 1950年Urry碱性电池 1990年索尼…

使用 GaLore 预训练LLaMA-7B

项目代码: https://github.com/jiaweizzhao/galorehttps://github.com/jiaweizzhao/galore 参考博客: https://zhuanlan.zhihu.com/p/686686751 创建环境 基础环境配置如下: 操作系统: CentOS 7CPUs: 单个节点具有 1TB 内存的 Intel CP…

【小沐学CAD】3ds Max常见操作汇总

文章目录 1、简介2、二次开发2.1 C 和 3ds Max C SDK2.2 NET 和 3ds Max .NET API2.3 3ds Max 中的 Python 脚本2.4 3ds Max 中的 MAXScript 脚本 3、快捷键3.1 3Dmax键快捷键命令——按字母排序3.2 3dmax快捷键命令——数字键3.3 3dmax功能键快捷键命令3.4 3Dmax常用快捷键——…

Gin框架入门(2)--异常捕获与日志实现

异常捕获 Go语言的异常捕获采用的是延迟处理的方法实现的,实际上就是利用defer,panic和recover三个关键字和函数来实现的。 关键字 defer关键字(函数) 这个关键字在控制语句中就有所涉及,本质上是采用一个栈的存储结构,在整个…

鸿蒙Harmony应用开发,数据驾驶舱登录页面的实现

鸿蒙Harmony应用开发,数据驾驶舱登录页面的实现 ​ 首先我们有个Splash 过渡页面来判断当前是用户是否登录,我们先从preferences中获取token是否存在。如果不存在直接跳转登录即可,如果存在的情况我们再去获取下用户的信息看看token是否过期…

MySQL---创建数据库(基于SQLyog)

目录 0.前言 1.基本认识 1.1编码集 1.2检验规则 2.库的创建和销毁 2.1指令介绍 2.2你可能会出现的问题 3.查看数据库属性 4.创建指定数据库 5.创建表操作 0.前言 之前写过一篇这个关于表的创建和销毁的操作,但是当时是第一次学习,肯定有些地方…

Docker的安装和使用

Docker概述 Docker简介 Docker 是基于 Go 语言实现的云开源项目。 Docker 的主要目标是: Build, Ship and Run Any App, Anywhere ,也就是通过对应用组件的封装、 分发、部署、运行等生命周期的管理,使用户的 APP 及其运行环境能做到 一次…

【Python】 已解决:ModuleNotFoundError: No module named…

个人简介:某不知名博主,致力于全栈领域的优质博客分享 | 用最优质的内容带来最舒适的阅读体验!文末获取免费IT学习资料! 🍅 文末获取更多信息 🍅 👇🏻 精彩专栏推荐订阅收藏 &#x…